打印
[应用相关]

stm32f串口发送字符不能实现

[复制链接]
1210|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
米尔豪斯|  楼主 | 2016-6-29 21:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

下面写的是通过stm32串口发送舵机命令给舵机驱动器,为什么不能实现呢?
#include"stdio.h"
#include"stm32f10x_lib.h"
#include"stdint.h"

void RCC_Configuration(void);
void GPIO_Configuration(void);
void USART_Config(USART_TypeDef* USARTx);
void USART_SendChar(USART_TypeDef* USARTx,uint8_t data);

int main(void)
{
    RCC_Configuration();    //系统时钟设置
    GPIO_Configuration();  //端口初始化
     USART_Config(USART1);  //串口1初始化
         
      int i=0;
      char buf[]="#0P1600S750<cr>";      
      for(i=0;i<15;i++)//发送字符串
       {
          USART_SendChar(USART1,buf);
       }
}

void RCC_Configuration(void)
{
   /* 定义枚举类型变量 HSEStartUpStatus */
        ErrorStatus HSEStartUpStatus;
      
          /* 复位系统时钟设置*/
          RCC_DeInit();
          /* 开启HSE*/
          RCC_HSEConfig(RCC_HSE_ON);
          /* 等待HSE起振并稳定*/
          HSEStartUpStatus = RCC_WaitForHSEStartUp();
        /* 判断HSE起是否振成功,是则进入if()内部 */
          if(HSEStartUpStatus == SUCCESS)
          {
            /* 选择HCLK(AHB)时钟源为SYSCLK 1分频 */
            RCC_HCLKConfig(RCC_SYSCLK_Div1);
            /* 选择PCLK2时钟源为 HCLK(AHB) 1分频 */
            RCC_PCLK2Config(RCC_HCLK_Div1);
            /* 选择PCLK1时钟源为 HCLK(AHB) 2分频 */
            RCC_PCLK1Config(RCC_HCLK_Div2);
            /* 设置FLASH延时周期数为2 */
            FLASH_SetLatency(FLASH_Latency_2);
            /* 使能FLASH预取缓存 */
            FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
            /* 选择锁相环(PLL)时钟源为HSE 1分频,倍频数为9,则PLL输出频率为 8MHz * 9 = 72MHz */
            RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
            /* 使能PLL */
            RCC_PLLCmd(ENABLE);
            /* 等待PLL输出稳定 */
            while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
            /* 选择SYSCLK时钟源为PLL */
            RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
            /* 等待PLL成为SYSCLK时钟源 */
            while(RCC_GetSYSCLKSource() != 0x08);
          }

          /* 开启USART1和GPIOA时钟 */
          RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA , ENABLE);
}

void GPIO_Configuration(void)
{  
  GPIO_InitTypeDef GPIO_InitStructure;

   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;                      //USART1 TX
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;             //复用推挽输出
   GPIO_Init(GPIOA,&GPIO_InitStructure);                     //A端口

   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;                  //USART1 RX
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;        //复用开漏输入
   GPIO_Init(GPIOA, &GPIO_InitStructure);                      //A端口
}

//USART初始化,包括波特率、数据位、停止位等~
void USART_Config(USART_TypeDef* USARTx)
{
   USART_InitTypeDef  USART_InitStructure;

   USART_InitStructure.USART_BaudRate = 9600;                        //速率9600bps
   USART_InitStructure.USART_WordLength = USART_WordLength_8b;        //数据位8位
   USART_InitStructure.USART_StopBits = USART_StopBits_1;            //停止位1位
   USART_InitStructure.USART_Parity = USART_Parity_No;                //无校验位
   USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;   //无硬件流控
   USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;                    //收发模式

   /* Configure USART1 */
   USART_Init(USARTx, &USART_InitStructure);                            //配置串口参数函数

   /* Enable the USART1 */
   USART_Cmd(USART1, ENABLE);   
}

void USART_SendChar(USART_TypeDef* USARTx,uint8_t data)
{
     USART_SendData(USARTx,data);
     while(USART_GetFlagStatus(USARTx,USART_FLAG_TC)==RESET);
}
沙发
豆腐块| | 2016-6-29 21:36 | 只看该作者
你的USART的TX管脚没配置输出速率,如果不配置速率的话,GPIOx_CLR寄存器的21 20位默认为00,即输入模式(复位默认模式),当然也就不能发送数据了

使用特权

评论回复
板凳
309030106| | 2016-6-29 21:49 | 只看该作者

进入调试模式,单步执行,看哪里和理想中的情况不一样

使用特权

评论回复
地板
Ryze| | 2016-6-29 22:00 | 只看该作者
写这么多代码配置时钟是配置的72M吧?好像MCU复位时默认的就是72M,不用再那么麻烦配置了,如果要配置成其他频率可以重新配置,直接打开要用的外设时钟就可以了

使用特权

评论回复
5
Garen2| | 2016-6-29 22:14 | 只看该作者
系统时钟不用配置,在启动代码中已经配置过了,宏定义的地方选择72MHZ可以了

使用特权

评论回复
6
diweo| | 2016-6-30 20:40 | 只看该作者
AFIO时钟没开

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

150

主题

731

帖子

1

粉丝