系列文章目录
-【STM32学习笔记】#001 前期准备
-【STM32学习笔记】#002 GPIO设置练习
文章目录
前言
本次练习参考ST youtube频道@STMicroelectronics 的系列导入教程《STM32マイコン体験実習(導入編)》中的第四讲 《UART実習編》。
系列教程和相关的pdf文件也可以在ST 日本官网找到。
本次教程的pdf:https://www.stmcu.jp/download/?dlid=761940_jp (需要注册)
1 目标功能
本次练习的主要目的是实现UART的下列基本功能和了解一些相关的基本知识:
- PC输入的数据,经由STM32处理后返回到PC
- PC通过终端软件Tera Term模拟
2 功能实现
2.1 流程图
主函数:
接收完成中断处理:
发送完成中断处理:
2.2 CubeMX设置
本次使用PA02,PA03分别作为TX, RX的端口进行通信,对应的内部模块是UART2。
参数数据保留默认设置,波特率为115.2kb/s。
在NVIC中设置USART2的中断优先级,下调抢占优先级为”1“,因为默认了抢占优先级为4位,子优先级为0位,所以子优先级设置不了也不用设置了。
2.3 代码
2.3.1 定义变量
在下面代码
/* USER CODE BEGIN 0 /
/ USER CODE END 0 */
之间插入定义的变量。
__IO uint8_t uart_status;
uint8_t uartbuff[8];
2.3.2 主函数
在下面代码
/* USER CODE BEGIN 3 /
/ USER CODE END 3 */
之间插入主函数。
uart_status = 0;
memset( uartbuff, 0x00, sizeof(uartbuff) );
if( HAL_UART_Receive_IT( &huart2, uartbuff, 1 ) == HAL_OK )
{
while( uart_status != 3 )
{
switch( uart_status )
{
case 0:
break; /* recive complete wait */
case 1: /* recive complete.*/
uart_status = 2;
HAL_UART_Transmit_IT( &huart2, uartbuff, strlen((char const *)uartbuff) );
break;
case 2:
break; /* transmit complete wait */
case 3:
break; /* end */
} /* end of switch */
} /* end of while */
} /* end of if */
2.3.3 中断
在下面代码
/* USER CODE BEGIN 4 /
/ USER CODE END 4 */
之间插入发送完成中断函数和接收完成中断函数。
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if( &huart2 == huart )
{
uart_status = 1;
}
}
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
if( &huart2 == huart )
{
uart_status = 3;
}
}
2.4 调试
打包文件下载到板子后,打开Tera Term将波特率设置为和程序中的一致。然后点击"New setting"即可验证程序是否正确运行了。
如果键盘上的输入能够实时的在页面中反应出来,则说明程序如常运行。
3 相关知识点
3.1 UART
UART, Universal Asynchronous Receiver Transmitter, 通用异步收发传输器,采用异步串行通信方式。
由如下引脚构成:TXD(发送端),RXD(接收端),GND(公共地),
在UART上追加同步方式的串行信号变换电路的产品,被称为USART(Universal Synchronous Asynchronous Receiver Transmitter)。
数据格式,由开始位(1bit)、数据位(5-9bit,常用8bit)、奇偶校验位(0-1bit)、停止位(1bit)组成。
而每秒能够传输的二进制数据位数被称为波特率(Baud rate),单位为bps(bit per second,位/秒)。常见的波特率9600bps、115200bps等等,其他标准的波特率是1200,2400,4800,19200,38400,57600bps。
3.2 NVIC
NVIC, Nested vectored interrupt controller, 嵌套向量中断控制器
可以参考下面的文章了解基本构成和原理:
STM32的NVIC和中断的总结
3.3 HAL_UART_Receive_IT / HAL_UART_Transmit_IT
函数名:HAL_StatusTypeDef HAL_UART_Receive_IT (UART_HandleTypeDef * huart, uint8_t * pData, uint16_t
Size)
功能描述:以非阻塞模式接收大量数据。
参数:huart,指向 UART_HandleTypeDef 结构的指针,该结构包含指定 UART 模块的配置信息;pData,指向数据缓冲区的指针(u8 或 u16 数据元素);Size,要接收的数据元素(u8 或 u16)的数量。
返回值:HAL: status
3.4 HAL_UART_RxCpltCallback / HAL_UART_TxCpltCallback
函数名:void HAL_UART_RxCpltCallback (UART_HandleTypeDef * huart)
功能描述:Rx 传输完成的回调函数。
参数:huart,指向 UART_HandleTypeDef 结构的指针,该结构包含指定 UART 模块的配置信息。
返回值:无