搜索
bottom↓
回复: 15

求助:STM32F407 USART1发送数据乱码

[复制链接]

出0入0汤圆

发表于 2015-8-22 21:25:50 | 显示全部楼层 |阅读模式
如题,测试STM32F407的串口的时候发送的数据一直是代码,感觉是时钟不对,但是我自己延时感觉还好啊。
板子用的是8M的晶振,倍频到72M,下面是我的串口代码及时钟设置
在线等,求大牛啊~~~
RCC时钟设置
  1. void InitialSysClock(void)
  2. {
  3.         uint32_t   PLL_M;      
  4.         uint32_t   PLL_N;  
  5.         uint32_t   PLL_P;   
  6.         uint32_t  PLL_Q;   
  7.        
  8.         RCC_DeInit(); /*配置前将所有RCC重置为初始值*/   
  9.         RCC_HSEConfig(RCC_HSE_ON);  /*等待外部晶振进入稳定状态*/   
  10.         while( RCC_WaitForHSEStartUp() != SUCCESS );  
  11.         //PLL,PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N ,SYSCLK = PLL_VCO / PLL_P
  12.         PLL_M =  8;         
  13.         PLL_N = 288;  //must between 192 and 432 MHz.
  14.         PLL_P = 4;//This parameter must be a number in the range {2, 4, 6, or 8}.   SYSCLK=HSE/PLL_M
  15.         PLL_Q =  6;      
  16.         RCC_PLLConfig(RCC_PLLSource_HSE, PLL_M, PLL_N, PLL_P, PLL_Q);  
  17.         RCC_PLLCmd(ENABLE);     
  18.         RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);        
  19.   
  20.         RCC_HCLKConfig(RCC_HCLK_Div1);   //HCLK=SYSLCK=72MHZ
  21.   RCC_PCLK1Config(RCC_HCLK_Div2); //APB1时钟配置. 2分频,即 PCLK1 = 36 MHz*/    高速APB1最大允许42MHZ
  22.   RCC_PCLK2Config(RCC_HCLK_Div1); //APB2时钟配置. 1分频,即 PCLK2 = 72 MHz*/    高速APB2最大允许84MHZ
  23.         BSP_NVIC_Init();
  24. }
复制代码


下面是串口相关
  1. void InitUsart1(void)
  2. {
  3.         USART1_GPIO_Init();                        //初始化端口
  4.         USART1_Configuration(); //串口初始化
  5.         USART1_NVIC_Init();            //NVIC初始化
  6.        
  7.         SendData1(0XAA);
  8.         SendData1('A');
  9.         //printf("\r\n this is a printf demo \r\n");
  10. }

  11. void USART1_Configuration(void)                       //串口初始化函数
  12. {
  13.         USART_InitTypeDef USART_InitStructure;  
  14.   
  15.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
  16.        
  17.         USART_InitStructure.USART_BaudRate = 9600;  
  18.   USART_InitStructure.USART_WordLength = USART_WordLength_8b;  
  19.   USART_InitStructure.USART_StopBits = USART_StopBits_1;  
  20.   USART_InitStructure.USART_Parity = USART_Parity_No ;  
  21.         USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  22.   USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;  
  23.       
  24.   USART_Init(USART1, &USART_InitStructure); /* Configure USART1 basic and asynchronous paramters */  
  25.   USART_Cmd(USART1, ENABLE);

  26.         //USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//TXE接收中断,TC传输完成中断,RXNE接收中
  27.         USART_Cmd(USART1, ENABLE);                                                           //启动串口
  28. }

  29. void USART1_GPIO_Init(void)
  30. {
  31.         GPIO_InitTypeDef GPIO_InitStructure;
  32.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);;//开端口A时钟
  33.         GPIO_StructInit(&GPIO_InitStructure);
  34.        
  35.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;  
  36.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;  
  37.   GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;   
  38.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  
  39.   GPIO_Init(GPIOA, &GPIO_InitStructure);  
  40.       
  41.   /* Configure USART1 Rx (PA.10) as input floating */  
  42.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;  
  43.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;  
  44.   GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;  
  45.   GPIO_Init(GPIOA, &GPIO_InitStructure);                         //RX初始化
  46.        
  47.        
  48.          GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);
  49.    GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);
  50. }
  51. void USART1_NVIC_Init(void)
  52. {
  53.         NVIC_InitTypeDef    NVIC_InitStructure;

  54.         NVIC_InitStructure.NVIC_IRQChannel  = USART1_IRQn;
  55.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=4;//先占优先级0
  56.         NVIC_InitStructure.NVIC_IRQChannelSubPriority   = 0;   //从优先级
  57.         NVIC_InitStructure.NVIC_IRQChannelCmd   = ENABLE;
  58.         NVIC_Init(&NVIC_InitStructure);
  59. }
  60. void SendData1(unsigned char i)
  61. {
  62.         USART1->DR=i;
  63.         while((USART1->SR&0X40)==0);//等待发送结束        
  64. }
复制代码

出0入0汤圆

 楼主| 发表于 2015-8-22 21:35:59 | 显示全部楼层
额,不要沉啊~~~

出0入0汤圆

发表于 2015-8-22 22:11:04 | 显示全部楼层
USART_Init()里面有个RCC_GetClocksFreq(),看看你获取的时钟对不对不就知道了,波特率是具体值是由这个函数决定的,还有个简单的方法,寄存器操作啊

出0入0汤圆

发表于 2015-8-22 22:11:58 | 显示全部楼层
应该是 有地方定义“HSE_VALUE ”的 没人25000000 需要改成自己是用晶振的频率

出0入0汤圆

发表于 2015-8-22 22:13:13 | 显示全部楼层
可以Debug看下,USART1 的实际波特率是多少呀。

出0入0汤圆

 楼主| 发表于 2015-8-22 22:20:26 | 显示全部楼层
venus5712 发表于 2015-8-22 22:13
可以Debug看下,USART1 的实际波特率是多少呀。

板子上调试口呗占用了,只留下了ISP下载口,就是串口1~

出0入0汤圆

 楼主| 发表于 2015-8-22 22:21:09 | 显示全部楼层
chishangpiao 发表于 2015-8-22 22:11
USART_Init()里面有个RCC_GetClocksFreq(),看看你获取的时钟对不对不就知道了,波特率是具体值是由这个函数 ...

板子上的调试口被占用了,没办法看,晕的~

出0入0汤圆

发表于 2015-8-22 22:24:15 | 显示全部楼层
dwlovework 发表于 2015-8-22 22:21
板子上的调试口被占用了,没办法看,晕的~

换个F4的板子调下, 或者用软件模拟模式。

出0入0汤圆

发表于 2015-8-22 22:25:57 | 显示全部楼层
dwlovework 发表于 2015-8-22 22:21
板子上的调试口被占用了,没办法看,晕的~

看RCC配置貌似没错,你手动配置串口的波特率寄存器,如果还是乱码那就RCC可能有问题,

出0入0汤圆

 楼主| 发表于 2015-8-22 22:26:05 | 显示全部楼层
venus5712 发表于 2015-8-22 22:24
换个F4的板子调下, 或者用软件模拟模式。

搞定了,改了头文件中的定义,头文件中定义是25MHZ的,改成8M的,OK了。。

出0入0汤圆

 楼主| 发表于 2015-8-22 22:26:58 | 显示全部楼层
登云钓月 发表于 2015-8-22 22:11
应该是 有地方定义“HSE_VALUE ”的 没人25000000 需要改成自己是用晶振的频率

对的,按照你说的,改了,正常了,在这个地方跌倒两次了,上次是F107的时候出现过,爱~

出0入0汤圆

发表于 2015-8-23 11:33:24 | 显示全部楼层
dwlovework 发表于 2015-8-22 22:26
搞定了,改了头文件中的定义,头文件中定义是25MHZ的,改成8M的,OK了。。 ...

呵呵,我也遇到过这个问题。好像F407和F107的DEMO软件时一样的。

出0入0汤圆

发表于 2018-10-24 10:05:17 | 显示全部楼层
登云钓月 发表于 2015-8-22 22:11
应该是 有地方定义“HSE_VALUE ”的 没人25000000 需要改成自己是用晶振的频率

我也是这样的问题,修改了就好了。

出0入0汤圆

发表于 2019-8-19 00:35:51 | 显示全部楼层
mark,跌倒了,爬起来了。

出0入0汤圆

发表于 2019-8-21 17:42:57 | 显示全部楼层
根据经验,应该是波特率的问题,看看设置的波特率是不是实际跑的波特率,先查系统时钟设置,再查UART的时钟源设置,最后再算一遍波特率吧

出700入127汤圆

发表于 2021-8-6 14:37:47 | 显示全部楼层
newphj 发表于 2018-10-24 10:05
我也是这样的问题,修改了就好了。

你好,你的是这里修改吗? 我修改了没效果。 我用的是12M晶振。pll倍为6。

现在的情况是串口速率比设置的高一半。即keil编译按8M的来搞了。

#if !defined  HSE_VALUE
#ifdef STM32F10X_CL   
  #define HSE_VALUE    ((uint32_t)12000000) /*!< Value of the External oscillator in Hz */
#else
  #define HSE_VALUE    ((uint32_t)12000000) /*!< Value of the External oscillator in Hz */
#endif /* STM32F10X_CL */
#endif /* HSE_VALUE */

上面两处HSE_VALUE都改为12M, 但串口速率比设置的高一半。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-20 06:32

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表