完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
本文参考了STM32论坛应用笔记,由于原笔记修改了底层HAL库,Cube更新代码时会导致修改被覆盖,因此,在原笔记基础上做了修改。
理论上本笔记适用于所有带IDLE中断的MCU。 这里以STM32L051为例 首先配置Cube工程如下: 启用串口接收DMA 启用串口中断 接下来时代码部分: 首先在main函数初始化后插入: HAL_UART_Receive_DMA(&huart1, __UART_RX_Buf, __BUFFER_SIZE); /* Enable the UART IDLE Interrupt*/ SET_BIT(huart1.Instance->CR1, USART_CR1_IDLEIE);//启用IDLE中断 原文中启用IDLE中断代码位于HAL_UART_Receive_DMA函数内,这里移出来,避免修改底层程序,就不怕Cube更新工程时代码覆盖了 在uart.c开头插入: uint8_t __UART_RX_Buf[__BUFFER_SIZE] = {0}; uint32_t __Rev_Size = 0; 为了方便跨文件调用,在uart.h插入 #define __BUFFER_SIZE 50 //可根据情况设置,要大于可能最长的一帧 extern uint8_t __UART_RX_Buf[__BUFFER_SIZE]; extern uint32_t __Rev_Size; 在stm32l0xx_it.c文件中的USART1_IRQHandler函数专门为用户预留了插入代码空间,刚好可以把我们需要的功能插入: /** * @brief This function handles USART1 global interrupt / USART1 wake-up interrupt through EXTI line 25. */ void USART1_IRQHandler(void) { /* USER CODE BEGIN USART1_IRQn 0 */ /* USER CODE END USART1_IRQn 0 */ HAL_UART_IRQHandler(&huart1); /* USER CODE BEGIN USART1_IRQn 1 */ UART_HandleTypeDef *huart = &huart1; uint32_t isrflags = READ_REG(huart->Instance->ISR); uint32_t cr1its = READ_REG(huart->Instance->CR1); //Modification 2 if(((isrflags & USART_ISR_IDLE) != RESET) && ((cr1its & USART_CR1_IDLEIE) != RESET)) { //Record the received bytes number __Rev_Size = huart->RxXferSize - huart->hdmarx->Instance->CNDTR; //clear the IDLE flag __HAL_UART_CLEAR_IDLEFLAG(huart); //Abord the received process CLEAR_BIT(huart->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE| USART_CR1_IDLEIE)); HAL_UART_AbortReceive_IT(huart); // return; } /* USER CODE END USART1_IRQn 1 */ } 注意原笔记基于F4,与L0有区别: 串口寄存器 F4 USART_SR_IDLE STM32L051为 USART_ISR_IDLE DMA中寄存器,F4为 huart->hdmarx->Instance->NDTR STM32L051为 huart->hdmarx->Instance->CNDTR 接下来定义回调函数,这里会在一帧数据成功接收后被调用 void HAL_UART_AbortReceiveCpltCallback (UART_HandleTypeDef *huart) { //Print received Bytes printf("nr[IDLE]Received %d Bytes:",__Rev_Size); for(uint16_t i = 0; i < __Rev_Size; i++) { printf(" 0x%02X", __UART_RX_Buf); } HAL_UART_Transmit(huart, __UART_RX_Buf, __Rev_Size, 100); //Re-start receiving HAL_UART_Receive_DMA(huart, __UART_RX_Buf, __BUFFER_SIZE); /* Enable the UART IDLE Interrupt*/ SET_BIT(huart->Instance->CR1, USART_CR1_IDLEIE); } 至此,修改完成。 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1771 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1619 浏览 1 评论
1070 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
724 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1673 浏览 2 评论
1935浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
728浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
568浏览 3评论
593浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
551浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 15:11 , Processed in 0.794776 second(s), Total 79, Slave 62 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号