第一步理解usart的作用:
粗暴理解,USART这个串口就起到连接外设的作用。
处理器发送数据--------gpio(然后通过gpio口给发送到片上外设)-------usart-----外设。
简单来说,gpio是一扇大门,usart也是一扇大门,只有通过这两扇大门你才能拿到宝藏。当你你打开gpio这个大门你会看到很多路,有一条路是走向usart这个大门,但是这条路有条河你得搭个桥才能过去到达usart的门口,然后打开大门,拿到宝藏。所以你要配置gpio先打开gpio这个大门,然后在通往usart的路上搭建一座桥。最后打开usart的大门。
这 就是,将gpio复用到usart上。
具体代码如下(代码为什么这么写,对着编程手册,慢慢看,慢慢理解,要是用术语巴拉巴拉一大堆,更懵咯!)
实例以配置usart1为例子:
/*配置GPIO口 复用到USART1上*/
RCC->AHB1ENR |= (1<<0);
GPIOA->MODER &= ~(0xF<<18);
//配置成复用模式
GPIOA->MODER |= (0x2<<18)|(0x2<<20);
GPIOA->AFR[1] &= ~(0xFF<<4);
GPIOA->AFR[1] |= (0x77<<4);
/*配置USART 1个开始位 8个数据 1个停止*/
RCC->APB2ENR |= (1<<4);
//配置波特率
float USARTDIV = fpclk*1000000 / brr / (8.0*(2-0));
u32 DIV_Mantissa = (u32)USARTDIV;//整数部分
u32 DIV_Fraction = (USARTDIV - DIV_Mantissa) * (8*(2-0));//小数部分
USART1->BRR = (DIV_Mantissa<<4)|DIV_Fraction;//存储整数和小数部分
// USART1->CR1 = 0;
USART1->CR1 |= (1<<2)|(1<<3);//使能发送器和接收器
USART1->CR2 |= ~(0x3<<12);//1个停止位
USART1->CR1 |= (1<<13);//使能串口
具体波特率配置如下:
USARTDIV = fPCLKx / 波特率 / 8*(2-over8))
fpclk是usart1的频率为84 over8选择1或者0,1是8倍采样频率,0是16倍。这里我们选用16倍即0。波特率是你在串口软件选择的波特率。所求的就是USARTDIV,对应上图中的DIV_Man和DIV_Fra,整数部分和小数部分。
ps:写的比较急,没有省察,欢迎指正!