USART
概述
本文是对UART外设的加深学习(参考正点原子的教学),文章架构如下:
- 研究串口发送数据配置流程
- 研究串口接收数据配置流程
- 研究串口收发数据中断处理流程
阅读完本文,要能回答以下问题:
- 简述串口发送数据的配置与工作流程。
- 前文HAL库通过HAL_UART_Init()配置好串口数据格式,简要阐述一下如何实现串口使能、串口发送使能的。
- 配置好串口后,通过HAL_UART_Transmit()函数进行USART异步发送数据,从该函数接收参数、返回参数的角度简述该函数是如何发送数据的。
- 从该函数具体实现何种功能的角度简述该函数是如何发送数据的。
- 该函数实现发送数据功能,需要UART_HandleTypeDef的成员变量*pTxBuffPtr、TxXferSize、 TxXferCount支持,阐述下这三个变量的功能。
- 简述串口开启接收中断时接收数据的初始化配置与工作流程。
- 配置好串口相关特性后,接下来就是要开启中断,简述开启接收中断的过程。
- 开启中断过程中涉及到锁的概念,对关键资源池进行保护,防止抢占,基于进程相关概念分析下锁的作用。
- 开启接收中断后,中断函数的内部需要进行哪些操作?
- 为了测试串口是否正确读取到了数据,通常会将读到的数据回调到串口输出,阐述下这一过程。
文章最后,列出了一些值得进一步研究的内容,包括对中断函数内部的优化、进程管理等,后续敬请期待。
串口发送数据的配置流程
1、简述串口发送数据的配置流程。
- 配置串口数据格式,例如字长、停止位、奇偶校验位和波特率
- 串口使能、串口发送使能
- 向发送数据寄存器TDR写入待发送的数据
- 等待状态寄存器USARTx_SR(ISR)的TC位置1,表征串口发送数据完成
int main(void)
{
u8 buff[]="test";
HAL_Init(); //³õʼ»¯HAL¿â
Stm32_Clock_Init(360,25,2,8); //ÉèÖÃʱÖÓ,180Mhz
delay_init(180);
uart1_init();
while(1)
{
HAL_UART_Transmit(&usart1_handler,buff,sizeof(buff),1000);
delay_ms(3000);
}
}
2、前文已经讲解如何通过HAL_UART_Init()配置串口数据格式,但是却没有注意串口使能、串口发送使能是如何实现的,简要阐述一下。
- 对于串口使能,是通过宏定义的,如下所示
#define __HAL_UART_ENABLE(__HANDLE__) ((__HANDLE__)->Instance->CR1 |= USART_CR1_UE)
- 在配置串口初始化时,宏定义如下使用:首先关闭串口使能,然后使用 UART_SetConfig()配置串口特性,最后打开串口使能。
/* Disable the peripheral */
__HAL_UART_DISABLE(huart);
/* Set the UART Communication parameters */
UART_SetConfig