stm32的HAL库uart的注意点
(一)、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的注意点相关推荐
- STM32 HAL库 UART 串口读写功能笔记
https://www.cnblogs.com/Mysterious/p/4804188.html STM32L0 HAL库 UART 串口读写功能 串口发送功能: uint8_t TxData[10 ...
- STM32学习笔记-SMT32使用HAL库UART中断方式使用
目录 1.引言 2.配置 3.流程 1.引言 近来需要使用蓝牙模块,再了解到蓝牙模块等无线模块许多使用串口透传,便决定在研究一下串口UART 的使用方法. 由于用的板子种类每次都不一样,有F103 有 ...
- 【STM32】HAL库 STM32CubeMX教程十四---SPI
前言: 本系列教程将HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用 在我们的HAL库中,对硬件SPI函数做了很好的集成,使得之前SPI几百行代码,在HAL库中,只需 ...
- 【STM32】HAL库 STM32CubeMX教程十一---DMA (串口DMA发送接收)
前言: 本系列教程将 对应外设原理,HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用 所用工具: 1.芯片: STM32F407ZET6/ STM32F103ZET6 ...
- 【STM32】HAL库 STM32CubeMX教程九---ADC
前言: 本系列教程将 对应外设原理,HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用 所用工具: 1.芯片: STM32F407ZET6/ STM32F103ZET6 ...
- STM32的HAL库分析及使用
STM32的三种开发方式 通常新手在入门STM32的时候,首先都要先选择一种要用的开发方式,不同的开发方式会导致你编程的架构是完全不一样的.一般大多数都会选用标准库和HAL库,而极少部分人会通过直接配 ...
- STM32之HAL库详解 及 手动移植
转载出处:http://blog.csdn.net/zcshoucsdn/article/details/55213616 HAL库结构 说到STM32的HAL库,就不得不提STM32CubeMX ...
- 【STM32】HAL库 STM32CubeMX教程十二---IIC(读取AT24C02 )
前言: 本系列教程将HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用 在之前的标准库中,STM32的硬件IIC非常复杂,更重要的是它并不稳定,所以都不推荐使用. 但是 ...
- 【STM32】HAL库——串口DMA通信(三)
前期准备: STM32CubeMX STM32RCT6核心板 IDE Keil(MDK-ARM) 关于DMA 1. 什么是DMA? DMA(Direct Memory Access,直接存储器访问) ...
- 【STM32】HAL库 STM32CubeMX教程十五---FMC-SDRAM(二)
前言: 本系列教程将HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用 上一讲我们说了CubeMX配置SDRAM的一些基本配置,还有FMC跟SDRAM的讲解,这一讲我们 ...
最新文章
- docker image存储路径_使用fluentd作为docker日志驱动收集日志
- flutter apk 打包
- 中考新大纲:初中数学无非就这26个考点!孩子吃透,再笨也能考115分!
- 。rdquo;小杉很平静的飞鸽传书2009
- C#LeetCode刷题之#896-单调数列(Monotonic Array)
- Windows Vista for Developers——第二部分:深入分析任务对话框
- Merge k Sorted Lists leetcode java
- 《赢道——成功创业者的28条戒律》2009年1月出版
- js 串口通信mscomm接收undefined_串口通信帧的同步方法(识别一帧数据的起始结束)42...
- android 自定义 build.gradle,Gradle for Android 第二篇( Build.gradle入门 )
- python 通达信k线_通达信自定义数据采集,使用python在通达信里面选股
- python 自动编写新闻_安卓机上使用 python 自动浏览新闻
- MTCNN + Deep_Sort实现多目标人脸跟踪之MTCNN人脸检测部分(一)
- 技术领导力 程序员如何才能带团队 文摘 (三)
- RV-LINK:输出非预期响应向 GDB 报告错误
- 【摸鱼神器】— 五子棋
- 六级英语 之 经济贸易
- Arduino DRV8825驱动两相步进电机
- ccsa安学网小程序_CCSA安学网题库及答案
- MII与RMII接口的区别
热门文章
- linux shell写日志,Linux shell编程之文件内容写入和日志记录
- mui ajax的值php怎样获取,MUI.ajax是怎么获取数据的
- python投注_python练习 | 下注猜大小 | 入门级
- 数值积分方法的c语言实现,编程实现数值积分的几种--方法 c语言.doc
- android 本地广播原理,本地广播原理
- python-学生管理系统--6 搜索功能模块
- python文件路径的操作
- ubuntu 安装 mysql debug_ubuntu 安装phpstorm+xdebug 动态调试环境
- 真甲先生 38期:2019年百度快排×××?
- PHP7通过yum源安装及性能测试