你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

关于STM8S库里面的这段UART通信的波特率设置代码问题请教

[复制链接]
有颗软件心的硬件工程师 提问时间:2016-10-31 21:36 /
关于STM8S库里面的这段UART通信的波特率设置代码,看不懂,请高手指教下,代码如下
CLK_GetClockFreq()   系统时钟
BaudRate      设置的波特率
/* Set the UART1 BaudRates in BRR1 and BRR2 registers according to UART1_BaudRate value */
    BaudRate_Mantissa    = ((uint32_t)CLK_GetClockFreq() / (BaudRate << 4));
    BaudRate_Mantissa100 = (((uint32_t)CLK_GetClockFreq() * 100) / (BaudRate << 4));
    /* Set the fraction of UART1DIV  */
    UART1->BRR2 |= (uint8_t)((uint8_t)(((BaudRate_Mantissa100 - (BaudRate_Mantissa * 100)) << 4) / 100) & (uint8_t)0x0F);
    /* Set the MSB mantissa of UART1DIV  */
    UART1->BRR2 |= (uint8_t)((BaudRate_Mantissa >> 4) & (uint8_t)0xF0);
    /* Set the LSB mantissa of UART1DIV  */
    UART1->BRR1 |= (uint8_t)BaudRate_Mantissa;   
收藏 1 评论12 发布时间:2016-10-31 21:36

举报

12个回答
有颗软件心的硬件工程师 回答时间:2016-11-1 07:20:00
敢来个人指点下吗?
高二毛 回答时间:2016-11-1 08:31:08
看看芯片手册里面的介绍吧,挺详细的。
有颗软件心的硬件工程师 回答时间:2016-11-1 08:37:37
高二毛 发表于 2016-11-1 08:31
看看芯片手册里面的介绍吧,挺详细的。

谢谢,数据手册里我已经看明白了,我就是纯粹想了解下 这个算法!
高二毛 回答时间:2016-11-1 12:59:38
苹果核 发表于 2016-11-1 08:37
谢谢,数据手册里我已经看明白了,我就是纯粹想了解下 这个算法!

这个就跟芯片内部的连接走线有关系了。

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

anobodykey 回答时间:2016-11-1 17:34:03
zcl201207 回答时间:2016-11-1 20:16:53
根据时钟频率和波特率来计算分频系数,然后把分频系数放入对应的两个寄存器里。。。

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

suoma 回答时间:2016-11-1 20:17:08
时钟分频了
lulugl 回答时间:2016-11-2 09:12:30
其实你用寄存器看得更直接
lulugl 回答时间:2016-11-2 09:23:19
主时钟频率/波特率 比如:16M/9600 =16 000 000/9600=1666 转换成16进制 =0x0682
根据数据手册:BRR2 写入第4位:0 与第1位:2
根据数据手册:BRR1 写入第3位:6 与第2位:8
用寄存器表示就是:BRR2=0x02;BRR1 = 0x68;

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

lulugl 回答时间:2016-11-2 09:50:28
本帖最后由 lulugl 于 2016-11-2 09:51 编辑

BaudRate_Mantissa    = ((uint32_t)CLK_GetClockFreq() / (BaudRate << 4));
这个计算出: BaudRate_Mantissa = 主时钟/(波特率*16) 当于 主时钟/波特率 右移4位
(16M/9600*16)=104=0x68;
    BaudRate_Mantissa100 = (((uint32_t)CLK_GetClockFreq() * 100) / (BaudRate << 4));
BaudRate_Mantissa100 = 主时钟*1000/(波特率/16) 当于 主时钟/波特率 扩大1000 右移4位
16M*1000/(9600*16)=104166=0x196E6
  UART1->BRR2 |= (uint8_t)((uint8_t)(((BaudRate_Mantissa100 - (BaudRate_Mantissa * 100)) << 4) / 100) & (uint8_t)0x0F);
UART1->BRR2 |=((104166-(104*100))/16)/100) &0x0F =0x3A*0x0f=0x02
也就是第1位
    /* Set the MSB mantissa of UART1DIV  */
    UART1->BRR2 |= (uint8_t)((BaudRate_Mantissa >> 4) & (uint8_t)0xF0);
   UART1->BRR2 |=0x68/16 &0xF0 =0;
就是BBR2第4位:
  UART1->BRR2=0x02
    /* Set the LSB mantissa of UART1DIV  */
    UART1->BRR1 |= (uint8_t)BaudRate_Mantissa;   得到第3、2位
UART1->BRR1=0x68;

终上所讲算得来的就是
BRR2=0x02;BRR1 = 0x68;

lulugl 回答时间:2016-11-2 10:02:59
其实原理就是你输入主时频率频,预期波特率,给你换算出来而已
zbber 回答时间:2016-11-2 10:41:18
时钟分频了
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版