一、RS232通信协议
1、概念
个人计算机上的通讯接口之一,由电子工业协会(Electronic Industries Association,EIA) 所制定的异步传输标准接口。
2、电气特性
逻辑1(MARK): -3V~-15V
逻辑0(SPACE): +3~+15V
3、接口
实现全双工异步通信只需要三根线:RX、TX和GND。
二、常见COMS电平转RS232电平的芯片--MAX3232
1、逻辑输入与逻辑输出特性
2、RS232接口端输入特性
3、RS232接口端输出特性
三、STM32串口硬件电路
1、芯片内部串口电路
2、开发板串口硬件电路
四、STM32串口编程
1、整体流程
① 开启GPIO时钟和USARTX时钟
② 配置TX和RX引脚
③ 初始化USART控制器
2、细节实现
① 开启GPIO时钟和USARTX时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);
② 配置TX和RX引脚
/* Configure USART1 Tx (PA.09) as alternate function push-pull */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); /* Configure USART1 Rx (PA.10) as input floating */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure);
③ 初始化USART控制器
/* USART1 mode config */ USART_InitStructure.USART_BaudRate = 115200; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No ; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(USART1, &USART_InitStructure); USART_Cmd(USART1, ENABLE);
五、STM32串口疑惑
1、串口时钟使能与控制器使能的关系
为何USART时钟使能了,还需要在配置USART控制器的时候再使能一次?
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);
USART_Cmd(USART1, ENABLE);
1> USART的时钟使能
APB2 peripheral clock enable register (RCC_APB2ENR)
2> USART控制器使能
USART Control register 1(USART_CR1)
3> 原因
RCC_APB2ENR: 控制APB2时钟是否供应给USART控制器
USART_CR1: 控制USART控制器的分频器和输出是否工作
2、TDR与RDR共用一个特殊功能寄存器地址
USART_DR功能描述:
包含了发送或接收的数据。由于它是由两个寄存器组成的,一个给发送用(TDR) ,一个给接收用(RDR) ,该寄存器兼具读和写的功能。TDR寄存器提供了内部总线和输出移位寄存器之间的并行接口(参见图236 )。RDR寄存器提供了输入移位寄存器和内部总线之间的并行接口。(摘自《STM32参考手册》)
笔者的理解是:当对USART_DR进行读操作的时候,访问的是RDR;当对USART_DR进行写操作的时候,访问的是TDR。
六、串口调试时需要注意的地方
1、通过MDK结合一些调试器可以单步、任意断点等等方式进行代码的调试。可是,这种调试方法对于调试操作系统,比如uCOS-II,还有那些必须要全速运行才能进行调试的情况,就显得力不从心。串口调试正是用于这些地方,可以在程序全速运行的情况下,实时的打印系统的运行信息。
2、串口调试也有它的局限性,由于串口的波特率相对于STM32这样高速运行的单片机显得迟钝,很多情况下不能及时的打印系统的运行信息。甚至有些情况下,我们原本那些串口调试的代码会成为影响我们系统实时性最主要的因素。
参考资料:《STM32库开发实战指南》
《STM32芯片手册》