历史上的今天
今天是:2025年06月08日(星期日)
2018年06月08日 | STM32F207Cube库函数USART中断接收
2018-06-08 来源:eefocus
USART初始化部分就不介绍了,直接看官方给的例程就能知道,现在主要将自己在学习过程中遇到的问题以及解决方法记录一下。
首先,如果使用了串口接收中断,就需要在初始化中打开中断以及设定中断优先级等常规操作。
HAL_UART_Init(&UartHandle) -> HAL_UART_MspInit(huart)->
/* Set Interrupt Group Priority */
HAL_NVIC_SetPriority(USARTx_IRQn, 0, 1);
/* Enable the TIMx global Interrupt */
HAL_NVIC_EnableIRQ(USARTx_IRQn);
然后需要调用串口接收终端初始化函数:
/**
* @brief Receives an amount of data in non blocking mode
* @param huart: UART handle
* @param pData: Pointer to data buffer
* @param Size: Amount of data to be received
* @retval HAL status
*/
HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
各个参数都有英文解释。
根据网上资料显示,这个函数只能对串口中断接收进行一次接收,而且接收的字节大小是固定的uint16_t Size,但是在实际使用中,不可能完全满足每次接收到的字节数都是一样的,而且是确定的。所以大家采用的方法都是令uint16_t Size = 1;这样的话,每接收到一个字节就中断一次。
那么中断处理函数处理的规则应该是
1、关闭此接收中断
2、将接收到的数据转移至缓存器
3、再次打开中断
根据Cube库函数给的函数以及示例,中断处理函数是:
void USARTx_IRQHandler(void)
{
HAL_UART_IRQHandler(&UartHandle);
}
其中void USARTx_IRQHandler(void)对应的是不同的中断处理函数,但是终端中调用的都是HAL_UART_IRQHandler(&UartHandle); 因为HAL_UART_IRQHandler(&UartHandle);函数的参数不同,所以不会产生异常。
大家仔细看HAL_UART_IRQHandler(&UartHandle)这个函数,应该能发现两个问题:
1、用户自己的中断处理函数在哪里不会影响库函数的完整性
2、中断如何再次打开
自己是新手,最初急于求成,没有认真学习函数中每一步,导致自己一直在纠结第一个问题:用户中断处理函数放在什么地方不影响库函数的完整性,后来详细阅读了源代码,发现库函数提供了一个可供用户重新定义的弱定义函数__weak void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
可以供用户重新定义函数内容,用户直接将自己的中断缓存数据部分放在此函数中,用户只需要在stm32f2xx_hal_msp_.c中重新定义此函数即可。
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
UART1RxBuff[UART1RxBuffCount++] = aRxBuffer;
}
同理,用户可以在
HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
中再次调用
HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
这样的话,就可以实现连续中断接收USART数据。
而且当需要多个串口中断接收的时候,上述中断处理函数如何进行中断缓存数据,如何区别时哪一个串口发送过来的数据。这里可以利用中断初始化中的UartHandle.Instance 这个成员变量,加上判断就能实现串口区别,最后产生的HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)函数应该如下:
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance == USART1)
{
UART1RxBuff[UART1RxBuffCount++] = aRxBuffer;
}
HAL_UART_Receive_IT(huart, (uint8_t *)&aRxBuffer, 1) ;
}
资料参考了:http://www.stm32cube.com/question/115
谢谢admin的解决,谢谢每一个愿意为想我这样新手解决问题的人,谢谢每一个愿意帮助别人的人。
所以这里做一个记录,以帮助那些可能遇到和我一样问题的人。
史海拾趣
|
大家好. 北京青云创新科技发展有限公司招聘高级研发工程师,希望符合条件的先生或女士积极投递简历. 岗位职责: 1、承担FPGA液晶驱动板及图形卡的设计及技术更改任务,负责所设计产品技术文件资料的整理归档工作; 2、负责对所设计产品的材料加工 ...… 查看全部问答> |
|
CAN 是Controller Area Network 的缩写(以下称为CAN),是ISO国际标准化的串行通信协议。在当前的汽车产业中,出于对安全性、舒适性、方便性、低公害、低成本的要求,各种各样的电子控制系统被开发了出来。由于这些系统之间通信所用的数据类型及对 ...… 查看全部问答> |
|
在实际工程中,选用何种传输方式需要结合工程的具体情况和工程预算来综合考虑。对于传输距离超过2Km的监控网络,应该考虑选用光纤和光端机。如果传输距离达到数公里或者几十公里,就只有使用光纤了。另外,在一些干扰很强的场合,比如受到工业干扰 ...… 查看全部问答> |
|
这个问题非常基础但是有几个地方不是很明白: 在画原理图时,大部分需要自己画芯片,一些主要的芯片,库里面总是没有 在画芯片时,关于芯片引脚习惯上都是定义成什么? 我看芯片引脚有:3 state、Bidirectional 、 Input 、Open Collector &nbs ...… 查看全部问答> |
|
8月8日爆发甘肃舟曲特大泥石流灾害牵动全国亿万人民的心。8月15日甘肃舟曲特大泥石流灾害追悼会全球直播,电视,广播,网络,报纸在报道。当阿牛哥看到电视直播舟曲灾区情况, 灾区诞生一个个婴儿的脸孔,抱着一岁弟弟的 ...… 查看全部问答> |
|
如果我给串口调试助手发送一个字符串“zhangkai”,如果勾上16进制显示,是不是就是串口调试助手把字符串转换为7A 68 61 6E 67 6B 61 69这个了? 在串口调试助手给单片机发数据时,如果选上16进制发送和不选16进制发送有啥区别?发送区填 ...… 查看全部问答> |
|
一般是刚开始入门会遇到的问题: 1、 接上仿真器,发现不能下载,这个问题想必大家都有遇到过,IAR提示找不到目标? 可能的原因:A、 并口驱动能力不足,在电脑的BIOS界面下设置成ECP或者ECP+EPP模式B、 JTAG线太长,一般超过20CM不推荐,而且这个线最好不 ...… 查看全部问答> |




