换晶振导致stm32串口数据飞码的解决办法
来源:互联网 发布:iphone连接mac传照片 编辑:程序博客网 时间:2024/05/17 22:33
一般来说,stm32f107都是用标配的晶振,比如8MHz. 但是,如果用别的晶振,比如13.56M的晶振,那串口接收还正常吗?
根据试验结果,很可能会飞码。比如说用串口助手发送的是0x35,但是在串口接收中断里面就会得到别的值,即上位机发送的数据和板子接收的数据不一致。
通过查资料,解决办法如下:
修改文件stm32f10x.h,
把
#define HSE_VALUE ((uint32_t)8000000) /*!< Value of the External oscillator in Hz */
修改为:
#define HSE_VALUE ((uint32_t)13560000) /*!< Value of the External oscillator in Hz */
这样,就正常了。
另外,有的网友说还需要修改一个文件:system_stm32f10x.c,修改PLL参数:
将
/* PLL configuration: PLLCLK = HSE * 9 = 72 MHz */
RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE |
RCC_CFGR_PLLMULL));
RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL9);
修改为:
/* PLL configuration: PLLCLK = HSE * 4 = 54.24MHz */
RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE |
RCC_CFGR_PLLMULL));
RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL4);
(因为我的SYSCLK是54.24M)
再摘抄某网友的一段话,帮助理解:
如果你仔细研究USART_Init()函数,你会发现,这个程序在配置波特率时会读取RCC有关的寄存器来计算当前CPU实际的工作频率是多少,然后计算参数来实现你需要的波特率——就是说不管你把单片机设置为什么样的工作频率,这个函数都能让串口以你要求的波特率工作。当然如果你把原来8M的晶振换掉了,那你就需要修改系统中的一个定义:在文件stm32f10x.h中的定义HSE_Value,这参数定义了单片机使用外部晶振或时钟源的频率,一般就是8000000,即使用8MHz晶振。如果你的STM32用了什么7.3728、11.0592或者25MHz晶振时,你就要修改HSE_Value定义的值,这样保证串口通信波特率正确。
- 换晶振导致stm32串口数据飞码的解决办法
- 换晶振导致stm32串口数据飞码的解决办法(补充)
- stm32的串口空闲中断接收数据
- stm32的串口空闲中断接收数据
- stm32 485串口数据的收发
- STM32 串口发送数据
- stm32串口写数据
- Stm32串口发送字节数据
- Stm32串口发送字符串数据
- STM32串口发送数据详解
- STM32的串口通信
- 关于stm32的串口
- STM32的串口采用DMA方式发送数据测试
- STM32的串口采用DMA方式接收数据测试
- 关于STM32串口接收未知长度数据的网贴
- STM32的串口采用DMA方式接收数据测试
- STM32的串口采用DMA方式发送数据测试
- stm32串口中断收发数据环形缓冲区的设计
- python open 文件操作
- 再次区分xcode add文件的三种方式
- 腾讯大规模Hadoop集群实践
- 数据库编程总结
- WinForm中如何实现判断某些控件是否可用
- 换晶振导致stm32串口数据飞码的解决办法
- 反射望远镜的发展历程(4)
- 派生类的构造函数的初始化列表问题
- C#防止sql注入 (转)
- Oracle 中的service_name,sid的作用和区别
- 简单例子让你很好的理解:协议与委托 (Protocol and Delegate)
- Oracle常见面试题
- 获取&区分iOS锁屏与Home事件
- 关于mongodb查询数据,数值类型查找不到数据的问题