1
完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
笔者在做毕业设计的时候遇到一个问题:
要通过与USART2相连的串口屏设置单片机USART1的波特率,在串口屏载入该页面的时候,需要呈现当前USART1的波特率,那么如何获取到波特率呢? 很容易想到的办法就是:根据串口初始化的函数顺藤摸瓜,找到写波特率的寄存器,然后把寄存器读出来就好了 然鹅: /*---------------------------- USART BRR Configuration -----------------------*/ /* Configure the USART Baud Rate -------------------------------------------*/ RCC_GetClocksFreq(&RCC_ClocksStatus); if (usartxbase == USART1_BASE) { apbclock = RCC_ClocksStatus.PCLK2_Frequency; } else { apbclock = RCC_ClocksStatus.PCLK1_Frequency; } /* Determine the integer part */ if ((USARTx->CR1 & CR1_OVER8_Set) != 0) { /* Integer part computing in case Oversampling mode is 8 Samples */ integerdivider = ((25 * apbclock) / (2 * (USART_InitStruct->USART_BaudRate))); } else /* if ((USARTx->CR1 & CR1_OVER8_Set) == 0) */ { /* Integer part computing in case Oversampling mode is 16 Samples */ integerdivider = ((25 * apbclock) / (4 * (USART_InitStruct->USART_BaudRate))); } tmpreg = (integerdivider / 100) << 4; /* Determine the fractional part */ fractionaldivider = integerdivider - (100 * (tmpreg >> 4)); /* Implement the fractional part in the register */ if ((USARTx->CR1 & CR1_OVER8_Set) != 0) { tmpreg |= ((((fractionaldivider * 8) + 50) / 100)) & ((uint8_t)0x07); } else /* if ((USARTx->CR1 & CR1_OVER8_Set) == 0) */ { tmpreg |= ((((fractionaldivider * 16) + 50) / 100)) & ((uint8_t)0x0F); } /* Write to USART BRR */ USARTx->BRR = (uint16_t)tmpreg; 虽然这里貌似计算方法很复杂的样子,其实也是能看出一些端倪的,不过,我们还是看手册吧。 资料1: 25.6.3 波特比率寄存器(USART_BRR) 注意: 如果 TE 或 RE 被分别禁止,波特计数器停止计数 地址偏移:0x08 复位值:0x0000 [tr][/tr]
表176 设置波特率时的误差计算
25.3.4 分数波特率的产生(节选) 接收器和发送器的波特率在USARTDIV的整数和小数寄存器中的值应设置成相同。 这里的 f CK 是给外设的时钟 (PCLK1 用于 USART2 、 3 、 4 、 5 , PCLK2 用于 USART1) USARTDIV是一个无符号的定点数。这12位的值设置在USART_BRR寄存器 好了资料码完了 下面是计算过程: 首先,根据资料1,得到USARTDIV的整数部分, 即 DIV_Mantissa = (int)((USART1->BRR&0x0000ffff)>>4) 由于我要获取的是USART1的波特率,根据资料3可知, 则,根据资料2中表格第三栏 fPCLK=72MHz 中的 置于波特率寄存器中的值 与算得的 DIV_Mantissa 作比较,即可获得对应的波特率。 比如,算得 DIV_Mantissa=468,查表可知波特率为9.6Kbps即9600。 以上。 |
|||||||||||||||
|
|||||||||||||||
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1780 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1621 浏览 1 评论
1081 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
728 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1679 浏览 2 评论
1938浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
731浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
570浏览 3评论
596浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
556浏览 3评论
小黑屋| 手机版| Archiver| 德赢Vwin官网 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-24 02:58 , Processed in 0.766370 second(s), Total 75, Slave 59 queries .
Powered by 德赢Vwin官网 网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
德赢Vwin官网 观察
版权所有 © 湖南华秋数字科技有限公司
德赢Vwin官网 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号