紧接着上一篇博文。。。
4 编写串口中断函数
当中断发生的时候,程序就会执行中断服务函数,我们在中断服务函数中编写相应的逻辑代码就可以了。
5串口数据接收和发送
这里需要介绍几个串口发送接收的函数
HAL_UART_Transmit();
HAL_UART_Receive();
HAL_UART_Transmit_IT();
HAL_UART_Receive_IT();
HAL_UART_Transmit_DMA();
HAL_UART_Transmit_DMA();
接下来讲解几个
串口发送数据
HAL_UART_Transmit(UART_HandleTypdef *huart,uint8_t *pData,uint16_t Size,uint32_t Timeout);
串口中断接收数据
HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
6.串口中断回调函数
在HAL库生成的代码文件中,stm32l0xx_it.c文件里面存放的就是各个中断函数,只需找到对应的串口中断,外部中断或者定时器中断,右击到函数定义,就能在中断函数定义里面找到中断回调函数。发送串口中断回调一般是*HAL_UART_TxCpltCallback(UART_HandleTypeDef huart);
HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart);
接收串口中断回调一般是*HAL_UART_RxCpltCallback(UART_HandleTypeDef huart);
HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);
只需要在你需要添加的地方重写一下这个函数就可以了,要注意包含头文件。下面是我的一个串口接收中断回调,仅供参考
oid HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(Uart1_Rx_Cnt >= 255)
{
Uart1_Rx_Cnt = 0;
memset(RxBuffer,0x00,sizeof(RxBuffer));
HAL_UART_Transmit(&huart1, (uint8_t *)"数据溢出", 10,0xFFFF);
}
else
{
RxBuffer[Uart1_Rx_Cnt++] = aRxBuffer;
if((RxBuffer[Uart1_Rx_Cnt-1] == 0x0A)&&(RxBuffer[Uart1_Rx_Cnt-2] == 0x0D))
{
HAL_UART_Transmit(&huart1, (uint8_t *)&RxBuffer, Uart1_Rx_Cnt,0xFFFF);
while(HAL_UART_GetState(&huart1) == HAL_UART_STATE_BUSY_TX);
Uart1_Rx_Cnt = 0;
memset(RxBuffer,0x00,sizeof(RxBuffer));
}
}
HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer, 1);
}
7.串口发送重定义
? 每次通过串口发送数据的时候,都去调用HAL_UART_Transmit函数,会感觉到些许麻烦,每次都需要配置四个参数,与我们初学C语言时的printf函数对比起来就方便性就差太多了,所以我一般都是将HAL_UART_Transmit函数重定义到printf,就使用printf就可以直接发送了。
? 将以下代码编写在uart.c中
int fputc(int ch, FILE *C)
{
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);
return ch;
}
**注意:**头文件需要包含标准库,也就是stdio.h。
|