处理器与外部设备通信的两种方式
并行通信
- 传输原理:数据各个位同时传输
- 优点:速度快
- 缺点:占用引脚资源多
串行通信
- 传输原理:数据按位顺序传输
- 优点:占用引脚资源少
- 缺点:速度相对较慢
串行通信
按传送方向,可分为
单工
数据传输只支持数据在一个方向上传输
半双工
允许数据在两个方向上传输,但是,在某一时刻,只允许数据在一个方向上传输,它实际上是一种切换方向的单工通信
全双工
允许数据同时在两个方向上传输,因此,全双工是两个单工方式的结合,要求发送设备和接收设备都具有独立的接收和发送能力。
串行通信的通信方式
- 同步通信:带时钟同步信号传输,速度由时钟决定,如SPI,IIC通信接口
- 异步通信:不带时钟同步信号,如UART,单总线,速度由波特率决定,同时决定了高低电平持续的时间
常见的串行通信接口
串口通信过程
串口参数
- 起始位
- 数据位(8位或者9位)
- 奇偶校验位(第9位)
- 停止位
- 波特率
USART框图
- RX→接收移位寄存器→接收数据寄存器(RDR)
- 发送数据寄存器(TDR)→发送移位寄存器→TX
- 发送控制,控制发送器时钟
- 接收控制,控制接收器时钟
- 发送、接收共用同一时钟
- USART_BRR分数波特率发生器
- SR状态寄存器
- CR1控制寄存器
波特率计算
串口 1 要设置为 115200 的波特率,而 PCLK2 的时钟(即 APB2 总线时钟频率) 为 84M。这样,
我们根据上面的公式有:
USARTDIV=84000000/(115200*16)=45.572
那么得到:
小数部分:DIV_Fraction=16*0.572=9=0X09;
整数部分:DIV_Mantissa=45=0X2D;
这样,我们就得到了 USART1->BRR 的值为 0X2D9。只要设置串口 1 的 BRR 寄存器值为
0X2D9 就可以得到 115200 的波特率。
串口配置步骤
- 使能串口时钟,使能GPIO时钟
- 设置引脚复用
- 设置GPIO工作模式
- 初始化串口参数
- 开启中断并初始化NVIC
- 使能串口
- 编写中断处理函数
- 串口发送数据
- 获取串口状态
实现
void uart1_init(u32 clk, u32 bound)
{
float temp;
u16 mantissa;
u16 fraction;
temp = (float)(clk * 1000000) / (bound * 16);
mantissa = temp;
fraction = (temp - mantissa)*16;
mantissa <<= 4;
mantissa += fraction;
RCC->AHB1ENR|=1<<0;
RCC->APB2ENR|=1<<4;
GPIO_Set(GPIOA,PIN9|PIN10,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_50M,GPIO_PUPD_PU);
GPIO_AF_Set(GPIOA,9,7);
GPIO_AF_Set(GPIOA,10,7);
USART1->BRR=mantissa; //Set boundrate
USART1->CR1&=~(1<<15); //Set OVER8= 0
USART1->CR1|=1<<3; //Enable TX
USART1->CR1|=1<<13; //Enable UART
}
参考
STM32F3与 F4 系列 Cortex M4 内核编程手册
STM32F4 开发指南(寄存器版)
STM32F4xxx中文参考手册