微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > stm32f串口发送字符为什么不能实现呢

stm32f串口发送字符为什么不能实现呢

时间:10-02 整理:3721RD 点击:

下面写的是通过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);

}



请教大神!

     char buf[]="#0P1600S750<cr>";      
      for(i=0;i<15;i++)//发送字符串
       {
          USART_SendChar(USART1,buf);=>USART_SendChar(USART1,buf[i]);
       }

这个手误,并不是主要的错误啊,我在想是不是USART_SendChar()这个函数,因为它发送的是两个字节的数据,而buf[]里面的数据都是一个字节的

兄弟,你有没有注意到一个问题?你的USART的TX管脚没配置输出速率,如果不配置速率的话,GPIOx_CLR寄存器的21 20位默认为00,即输入模式(复位默认模式),当然也就不能发送数据了

还有,你这写这么多代码配置时钟是配置的72M吧?好像MCU复位时默认的就是72M,不用再那么麻烦配置了,如果要配置成其他频率可以重新配置,直接打开要用的外设时钟就可以了

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

代码没看,不过系统时钟肯定不用配置了,在启动代码中已经配置过了,宏定义的地方选择72MHZ可以了。3.5的库是这样的,嘿嘿。其余外设时钟自己再有选择的开~

恩,是的,要改为其他频率直接改红定义就好

我也有变个问题!

一步一步执行,看哪里不合适

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top