Stm32 cubemx里的初始化见 链接,以下是main文件里的调用
查询
查询方式:发送数据——先发后查;接收数据——先查后收。
要去使用stm32f1xx_hal_uart.h文件下的相关函数
具体为
- 发送用到的
HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);//Timeout参数是超时时间,如果发送数据时间超过限制,就会返回HAL_TIMeOUT
//使用位置
int main(){
...
while(1){
...
delay();//加适当的延时
HAL_UART_Transmit();
}
}
- 接收用到的
HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);//参数与上面一样
//使用位置
int main(){
...
while(1){
...
if(HAL_UART_Receive(...) == HAL_OK){
...
}
}
}
中断
中断方式:发送数据——发送、等待中断、中断中发送;
接收数据——等待中断、在中断中接收
要去使用stm32f1xx_hal_uart.h文件下的相关函数
具体为
- 接收用到的
HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);//数据区(size)全部接收完成(接收满了),才会调用。该函数需要重定义,否则将使用默认的,重定义不用将__weak写上
//注意在回调函数里,末尾还要调用一遍HAL_UART_Receive_IT(感觉是重新使能)
//使用位置
int main(){
HAL_UART_Receive_IT();
...
while(1){
...
}
}
...
void HAL_UART_RxCpltCallback()//重定义
{
...
HAL_UART_Receive_IT(...);//处理完后,重新使能
}
- 发送用到的
HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart);
但是呢,对于发送我们是知道什么时候要发送的,一般采用查询方式,对于接收我们是不知道,数据是什么时候过来的,一般采用中断
DMA
- 发送用到的
HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
- 接收用到的
HAL_UART_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
//使用位置
int main(){
...
HAL_UART_Receive_DMA();
while(1){
...
}
//一旦开启DMA,收发中断是强制开启的,所以也可以编写回调函数
void HAL_UART_RxCpltCallback()//重定义
{
...
}
}
HAL_UART_HalfCpltCallback
HAL_UART_RxHalfCpltCallback(UART_HandleTypeDef *huart);//数据区接收到一半时调用
相较于HAL_UART_TxCpltCallback
,这种 HalfCpltCallback
只能在DMA方式下调用,不能在阻塞和中断方式下调用。问题链接