STM32F4串口1波特率相关时钟,及寄存器配置

------------------------------------------------------- 

设置时钟

在main中调用的 Stm32_Clock_Init(336, 8, 2, 7);           /* 设置时钟,168Mhz *///8*336/8/2=168 

时钟源,PLL寄存器配置函数:

HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef  *RCC_OscInitStruct)

系统时钟,总线寄存器配置,及HCLK时钟计算函数:

HAL_StatusTypeDef HAL_RCC_ClockConfig(RCC_ClkInitTypeDef  *RCC_ClkInitStruct, uint32_t FLatency) 

--------------------------------------------------- 

计算系统时钟函数: 

------------------------------------------------------ 

串口参数配置:

在main中调用的:usart_init(9600);                         /* 串口初始化为波特率 */

参数赋值,并调用初始化函数: 

串口初始化函数原型 :

串口初始化函数最终引用到串口寄存器配置

注:串口1 挂载在APB2总线,对应PLCK2.  其他串口挂载在APB1总线  ,对应PLCK1.

-------------------------------------------------- 

本例到这里,配置了串口参数相关寄存器,画圈的程序引用了下面的获取PCLK2时钟的函数,和波特率配置寄存器函数

HCLK时钟是系统时钟不分频168 M,PCLK时钟2分频84M:

  

比特率寄存器配置部分: (小数部分的高4位和低4位组合?小数部分大于0.96(15.5/16=0.96875)会进位--在位4加1)

串口1,对应PCLK2时钟频率840000,设置波特率9600.算法模拟(注释): 

// UARTBRR.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <iostream>

double sj(uint64_t a, uint64_t b);
//U1---USARTDIV是串口实际分频值--小数点后移两位(值扩大100倍)
//U2---再除100,其实还是取整---
//U3---U1(p, b) - (U2(p, b) * 100U)取扩大100倍的小数部分,
//    * 16U左移4位--以整数的形式把小数放在低四位---加50除100,就是加0.5,取整实现四舍五入
#define U1(p, b)     (p*25U)/(4U*b)  //USARTDIV=Pck/(16*Baud)取到小数点后(移)两位--->USARTDIV*100=(Pck*100)/(16*Baud)= (p*25U)/(4U*b) 
#define U2(p, b)    (U1(p, b)/100U)
//#define U3(p, b)    ((((U1(p, b) - (U2(p, b) * 100U)) * 16U) + 50U) / 100U)
#define U3(p, b)    ((((U1(p, b) - (U2(p, b) * 100U)) * 16U) + 50U) / 100U)

int main()
{
    uint64_t pc = 84000000, ba = 9600;
    uint32_t u3;
    uint32_t u1;
    uint32_t u2;
    uint32_t d;
    d = sj(pc, ba);
    u3 = U3(pc, ba);
    u1 = U1(pc, ba);
    u2 = U2(pc, ba);
    std::cout << u1 << "\n" << u2 << "\n";
    std::cout << d << "--" <<  u3 <<"\n";
    
    return 0;
}
double sj(uint64_t a, uint64_t b)
{
    return(U1(a, b) - (U2(a, b) * 100));
}
// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单

 运行结果:

前面已经知道:PCLK2是84M,设置串口波特率是9600。串口实际分频值:546.87----整数:546(位15:4)----小数0.87--对应小数位1110(14,位3:0)

注:下面的计算为什么加0.5?加0.5之后才实现四舍五入,举例:如果不加0.5,13.92 只能取整得到13.对应二进制1101,而不是更精确的14(1110)

参考资料: 

 

 注:这里OVER8默认16倍过采样,值为0

F4 16倍过采样和F1等同: 

  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值