查看: 6703  |  回复: 0
stm32的HAL库开发学习笔记之串口通信
我不会单片机
12
主题
7
回复
发表于2018-10-25 20:46:07 | 只看该作者
1# 电梯直达

串口发送

串口寄存器定义文件

stm32f429xx.h
异步:uart
同步:usart 

串口发送流程配置

1.编程USARTx_CR1的M位来定义字长。 
2.编程USARTx_CR2的STOP位来定义停止位位数。   
3.编程USARTx_BRR寄存器确定波特率。 
4.使能USARTx_CR1的UE位使能USARTx。
5.如果进行多缓冲通信,配置USARTx_CR3的DMA使能(DMAT)。具体请参考后面DMA实验。
6.使能USARTx_CR1的TE位使能发送器。
7.向发送数据寄存器TDR写入要发送的数据(对于M3,M4,发送和接收共用DR寄存器)。
8.向TRD寄存器写入最后一个数据后,等待状态寄存器USARTx_SR(ISR)的TC位置1,传输完成。
(1~6配置,7~8发送) 

HAL库函数配置

配置步骤1~6:配置字长,停止位,奇偶校验位,波特率等:
HAL_StatusTypeDef HAL_UART_Init(UART_HandleTypeDef *huart);
该函数内部会引用标识符__HAL_UART_ENABLE使能相应串口。且调用函数     HAL_UART_MspInit     (该函数被定义为弱函数,有用户自行编写,可用来初始化GPIO口)
步骤7~8发送数据和等待发送完成:
HAL_StatusTypeDef HAL_UART_Transmit(USART_HandleTypeDef*husart, uint8_t *pTxData, uint16_t Size, uint32_t Timeout); 

_weak关键字

函数在c文件中定义为弱函数,h文件中正常生命,由用户重新编写。
HAL库中大量使用__weak关键字修饰外设回调函数。
外设回调函数供用户编写MCU相关程序,大大提高程序的通用性移植性。 

HAL配置过程

1.初始化串口相关参数,使能串口:HAL_UART_Init();
串口相关IO口配置,复用配置:
2. 在HAL_UART_MspInit中调用HAL_GPIO_Init函数。
3.发送数据,并等待数据发送完成:HAL_UART_Transmit()函数; 

串口接收

串口寄存器定义文件

stm32f429xx.h
异步:uart
同步:usart 

串口接收配置流程

1.编程USARTx_CR1的M位来定义字长。 
2.编程USARTx_CR2的STOP位来定义停止位位数。   
3.编程USARTx_BRR寄存器确定波特率。
4.使能USARTx_CR1的UE位使能USARTx。
5.如果进行多缓冲通信,配置USARTx_CR3的DMA使能(DMAT)。具体请参考后面DMA实验。
6.使能USARTx_CR1的RE位为1使能接收器。
7.如果要使能接收中断(接收到数据后产生中断),使能USARTx_CR1的RXNEIE位为1。 

串口接收数据时的响应

1.USARTx_SR(ISR)的RXNE位(状态标志位)置1。表明移位寄存器内容已经传输到RDR(DR)寄存器。已经接收到数据并且等待读取。
2.如果开启了接收数据中断(USARTx_CR1寄存器的RXNEIE位为1),则会产生中断。(程序上会执行中断服务函数)
3.如果开启了其他中断(帧错误等),相应标志位会置1。
4.读取USARTx_TDR(DR)寄存器的值,该操作会自动将RXNE位清零,等待下次接收后置位。
即:
步骤1获取状态标志位通过标识符实     现:
__HAL_UART_GET_FLAG                //判断状态标志位
__HAL_UART_GET_IT_SOURCE           //判断中断标志位
步骤2~3中断服务函数:
void USARTx_IRQHandler(void);//     (x=1~3,6) ,可同步或异步
void USARTx_IRQHandler(void);//     (x=4,5,7,8),只能异步
在启动文件startup_stm32fxxx.s中     查找。
步骤4读取接收数据:
HAL_StatusTypeDef                  HAL_UART_Receive(UART_HandleTyp     eDef *huart, uint8_t *pData,       uint16_t Size,uint32_t Timeout); 

接收流程

1.接收配置步骤1~6和发送流程一样,调用HAL_UART_Init函数HAL_StatusTypeDef HAL_UART_Init(UART_HandleTypeDef *huart);
2.步骤7开启接收中断:
HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);(该函数调用了_HAL_UART_ENABLE_IT(hurat,UART_IT_RXNE),) 

HAL库配置过程

1. 初始化串口相关参数,使能串口:HAL_UART_Init();
2.串口相关IO口配置,复用配置:
  在HAL_UART_MspInit中调用HAL_GPIO_Init函数。
3.串口接收中断优先级配置和使能:
  HAL_NVIC_EnableIRQ();
  HAL_NVIC_SetPriority();
4.使能串口接收中断:HAL_UART_Receive_IT();//判断是否接收完成
5.中断服务函数:USARTx_IRQHandler //用户一般不直接编写该函数,而是调用通用中断处理函数HAL_UART_IRQHandler。
6.通用中断处理函数HAL_UART_IRQHandler,该函数先判断中断类型(接收中断处理,发送中断处理,发送完成中断处理,错误处理),再调用相应的中断处理函数,相应的中断处理函数中调用回调函数,回调函数定义为弱函数,由用户编写,是真正的中断服务函数。 

重要函数用法

1.HAL_UART_Receive_IT();
2.HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData,       uint16_t Size, uint32_t Timeout);
3.中断服务函数USARTx_IRQHandler().

主题

回复
  • 温馨提示: 标题不合格、重复发帖、发布广告贴,将会被删除帖子或禁止发言。 详情请参考: 社区发帖规则
  • 您当前输入了 0 个文字。还可以输入 8000 个文字。 已添加复制上传图片功能,该功能目前仅支持chrome和火狐

禁言/删除

X
请选择禁言时长:
是否清除头像:
禁言/删除备注:
昵 称:
 
温馨提示:昵称只能设置一次,设置后无法修改。
只支持中文、英文和数字。

举报

X
请选择举报类型:
请输入详细内容:

顶部