(一)、uart / usart 要注意的 API使用方法。

  1.__HAL_UART_GET_FLAG 是获取 SR 寄存器标志位状态

  2.__HAL_UART_CLEAR_FLAG 是清除 SR 寄存器标志位状态,不同于读改写的清零方式,这是直接清零。

  3.__HAL_UART_CLEAR_xxFLAG ,xx为PE FE NE ORE IDLE 共5个, 清除方式都是一样的,要先读取SR,再读取DR才能清除对应的标志位

  4.UART_Receive_IT或许有bug,tmp = (uint16_t*) huart->pRxBuffPtr;需要pRxBuffPtr十六位对齐,但是pRxBuffPtr类型是uint8_t *,是不一定对齐的。所以在声明buffer的时候要注意声明称16位以上对齐的数据。

  5.SR不能用软件置1,一般都是软件清零,通过读改写方式清零会导致中断请求丢失,推荐软件直接写0清除标志。

  6.注意UART_FLAG_xx和UART_IT_xx的区别

  7.串口发送只能一次,问题在于没有开启TC中断

(二)串口的框图需要理解透

(三)代码如下

接收不定长的数据

/**
  * @brief  This function handles UART interrupt request.
  * @param  huart: pointer to a UART_HandleTypeDef structure that contains
  *                the configuration information for the specified UART module.
  * @retval None
  */
void user_Uart1Handler(void)
{

if ( (__HAL_UART_GET_FLAG (&huart1, UART_FLAG_RXNE) != RESET) )//接收数据
    {
        if (uart1RxCounter < 99)
        {
            uart1RxBuf[uart1RxCounter] =(char)( huart1.Instance->DR & 0xff);
            uart1RxCounter++;
        }
        __HAL_UART_CLEAR_FLAG (&huart1, UART_FLAG_RXNE);

}

if(__HAL_UART_GET_FLAG (&huart1, UART_FLAG_TXE) != RESET) //可以发送下个字节
    {
        __HAL_UART_DISABLE_IT(&huart1, UART_IT_TXE);
        __HAL_UART_DISABLE_IT(&huart1, UART_IT_TC);
    }

if ( (__HAL_UART_GET_FLAG (&huart1, UART_FLAG_IDLE) != RESET) ) //接收完一帧数据,空闲标志
    {
        __HAL_UART_CLEAR_IDLEFLAG(&huart1);
        rx1_cplt = SET;
        huart1.RxState = HAL_UART_STATE_READY;
    }
    
    if ( (__HAL_UART_GET_FLAG (&huart1, UART_FLAG_TC) != RESET) ) //发送完一帧数据,TC标志
    {
        __HAL_UART_CLEAR_PEFLAG (&huart1);
        __HAL_UART_CLEAR_PEFLAG (&huart1);
        huart1.gState = HAL_UART_STATE_READY;
    }
    
    {
        uint32_t state;
        state = __HAL_UART_GET_FLAG (&huart1, UART_FLAG_PE)| __HAL_UART_GET_FLAG (&huart1, UART_FLAG_FE)\
        |__HAL_UART_GET_FLAG (&huart1, UART_FLAG_NE)|__HAL_UART_GET_FLAG (&huart1, UART_FLAG_ORE);
        if (state != RESET)
        {
            __HAL_UART_CLEAR_PEFLAG (&huart1);
            
        }
    }
    
    if(huart1.ErrorCode != HAL_UART_ERROR_NONE)
    {
        Error_Handler();
    }

}

printf回调 发送单个字节的程序如下,前提是打开dma和中断:

void Uart_PutChar(UART_HandleTypeDef *huart, char ch)
{
    if(__HAL_UART_GET_FLAG (huart, UART_FLAG_TXE) != RESET)
    {
        huart->Instance->DR = (uint16_t)ch &    (uint16_t)0x01FF;//每次写DR会清零TXE
        while(__HAL_UART_GET_FLAG(huart,UART_FLAG_TXE) != SET)
        {
        
        }
    }

}
void putchar_uart1_callback(char ch)
{  
    Uart_PutChar(&huart1,ch);
}

printf回调 ,发送多个字符串的程序如下,前提是打开dma和中断:

void putstring_uart1_callback(char *data, unsigned int size)
{
    HAL_UART_Transmit_DMA(&huart1,(uint8_t *)data,size);
}

还要记得在main循环之前,打开相关中断:
    __HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);
   
    __HAL_UART_ENABLE_IT(&huart1, UART_IT_TC);

__HAL_UART_ENABLE_IT(&huart1, UART_IT_ERR);

__HAL_UART_ENABLE_IT(&huart1, UART_IT_RXNE);

转载于:https://www.cnblogs.com/zhanghonglang/p/8315938.html

stm32的HAL库uart的注意点相关推荐

  1. STM32 HAL库 UART 串口读写功能笔记

    https://www.cnblogs.com/Mysterious/p/4804188.html STM32L0 HAL库 UART 串口读写功能 串口发送功能: uint8_t TxData[10 ...

  2. STM32学习笔记-SMT32使用HAL库UART中断方式使用

    目录 1.引言 2.配置 3.流程 1.引言 近来需要使用蓝牙模块,再了解到蓝牙模块等无线模块许多使用串口透传,便决定在研究一下串口UART 的使用方法. 由于用的板子种类每次都不一样,有F103 有 ...

  3. 【STM32】HAL库 STM32CubeMX教程十四---SPI

    前言: 本系列教程将HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用 在我们的HAL库中,对硬件SPI函数做了很好的集成,使得之前SPI几百行代码,在HAL库中,只需 ...

  4. 【STM32】HAL库 STM32CubeMX教程十一---DMA (串口DMA发送接收)

    前言: 本系列教程将 对应外设原理,HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用 所用工具: 1.芯片: STM32F407ZET6/ STM32F103ZET6 ...

  5. 【STM32】HAL库 STM32CubeMX教程九---ADC

    前言: 本系列教程将 对应外设原理,HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用 所用工具: 1.芯片: STM32F407ZET6/ STM32F103ZET6 ...

  6. STM32的HAL库分析及使用

    STM32的三种开发方式 通常新手在入门STM32的时候,首先都要先选择一种要用的开发方式,不同的开发方式会导致你编程的架构是完全不一样的.一般大多数都会选用标准库和HAL库,而极少部分人会通过直接配 ...

  7. STM32之HAL库详解 及 手动移植

    转载出处:http://blog.csdn.net/zcshoucsdn/article/details/55213616 HAL库结构   说到STM32的HAL库,就不得不提STM32CubeMX ...

  8. 【STM32】HAL库 STM32CubeMX教程十二---IIC(读取AT24C02 )

    前言: 本系列教程将HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用 在之前的标准库中,STM32的硬件IIC非常复杂,更重要的是它并不稳定,所以都不推荐使用. 但是 ...

  9. 【STM32】HAL库——串口DMA通信(三)

    前期准备: STM32CubeMX STM32RCT6核心板 IDE Keil(MDK-ARM) 关于DMA 1. 什么是DMA? DMA(Direct Memory Access,直接存储器访问) ...

  10. 【STM32】HAL库 STM32CubeMX教程十五---FMC-SDRAM(二)

    前言: 本系列教程将HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用 上一讲我们说了CubeMX配置SDRAM的一些基本配置,还有FMC跟SDRAM的讲解,这一讲我们 ...

最新文章

  1. docker image存储路径_使用fluentd作为docker日志驱动收集日志
  2. flutter apk 打包
  3. 中考新大纲:初中数学无非就这26个考点!孩子吃透,再笨也能考115分!
  4. 。rdquo;小杉很平静的飞鸽传书2009
  5. C#LeetCode刷题之#896-单调数列(Monotonic Array)
  6. Windows Vista for Developers——第二部分:深入分析任务对话框
  7. Merge k Sorted Lists leetcode java
  8. 《赢道——成功创业者的28条戒律》2009年1月出版
  9. js 串口通信mscomm接收undefined_串口通信帧的同步方法(识别一帧数据的起始结束)42...
  10. android 自定义 build.gradle,Gradle for Android 第二篇( Build.gradle入门 )
  11. python 通达信k线_通达信自定义数据采集,使用python在通达信里面选股
  12. python 自动编写新闻_安卓机上使用 python 自动浏览新闻
  13. MTCNN + Deep_Sort实现多目标人脸跟踪之MTCNN人脸检测部分(一)
  14. 技术领导力 程序员如何才能带团队 文摘 (三)
  15. RV-LINK:输出非预期响应向 GDB 报告错误
  16. 【摸鱼神器】— 五子棋
  17. 六级英语 之 经济贸易
  18. Arduino DRV8825驱动两相步进电机
  19. ccsa安学网小程序_CCSA安学网题库及答案
  20. MII与RMII接口的区别

热门文章

  1. linux shell写日志,Linux shell编程之文件内容写入和日志记录
  2. mui ajax的值php怎样获取,MUI.ajax是怎么获取数据的
  3. python投注_python练习 | 下注猜大小 | 入门级
  4. 数值积分方法的c语言实现,编程实现数值积分的几种--方法 c语言.doc
  5. android 本地广播原理,本地广播原理
  6. python-学生管理系统--6 搜索功能模块
  7. python文件路径的操作
  8. ubuntu 安装 mysql debug_ubuntu 安装phpstorm+xdebug 动态调试环境
  9. 真甲先生 38期:2019年百度快排×××?
  10. PHP7通过yum源安装及性能测试