stm32HAL库学习——UART学习笔记

这里只是简单的记录自己使用过程中的经验,并非详细阐述原理。

一、串口输出打印重定向printf,代码如下:

int fputc(int ch,FILE *f)
{
    uint8_t temp[1]={ch};
    HAL_UART_Transmit(&huart1,temp,1,1000);
    return (ch);
}

int fgetc(FILE *f)
{
    uint8_t ch;
    HAL_UART_Receive(&huart1,(uint8_t *)&ch, 1, 1000); 
    return ch;
}

用作程序调试输出时,可以使用一组宏定义,方便开发完成后关闭printf;
/* 调试日志串口打印宏定义 */
#define __DEBUG__

#ifdef __DEBUG__
#define DEBUG(format,...) printf(format,##__VA_ARGS__)
//#define DEBUG(format,...) printf("File:"__FILE__",Line:%05d:"format"\n",__LINE__,##__VA_ARGS__)
#else 
#define DEBUG(format,...)
#endif

二、可接受任意字节的串口通信
首先在cube配置串口全局中断(global interrupt)
1、在cube生成的usart的HAL_UART_MspInit()函数中开启收到数据中断(UART_IT_RXNE)及帧中断(UART_IT_IDLE)。
__HAL_UART_ENABLE_IT(uartHandle, UART_IT_RXNE);
__HAL_UART_ENABLE_IT(uartHandle, UART_IT_IDLE);
2、在串口中断函数USART1_IRQHandler()中添加
if(RESET != __HAL_UART_GET_FLAG(&huart1, UART_FLAG_RXNE))
{
  if(RxConter == 100)
    RxConter = 0;
    aRxBuffer[RxConter++] = USART1->DR;
}
else if(RESET != __HAL_UART_GET_FLAG(&huart1, UART_FLAG_IDLE))
{		
    clear = USART1->SR;
    clear = USART1->DR;
    ReceiveState = 1;
}


3、在主程序中添加如下代码即可完成接受任意字节的数据
if(ReceiveState == 1){
    ReceiveState = 0;
    printf("\r\n输出一帧数据包\r\n");
    HAL_UART_Transmit(&huart1,aRxBuffer,RxConter+1,1000);
    RxConter = 0;
}

暂时自己就用到了这两个功能,以后用到别的再补充......

你可能感兴趣的:(c)