完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
在STM32F103ZET6开发过程中,用到HAL库中的串口1DMA空闲中断处理数据时发现:
当接收数据长度超过16字节后,(__HAL_DMA_GET_COUNTER( huart1.hdmarx))也就是串口1的CNDTR寄存器会首先减16,然后恢复到给定长度,再次进入中断减去剩余长度(又或当长度超过16字节后空闲中断再次进入)例如限定接收数据长度为0xFFF,当接收数据超过0x0F(例0x12)后,CNDTR寄存器会首先变为0xFF0,然后回到0xFFF,再变为0xFFE。 程序波特率115200,数据位8,停止位1。如何解决呢? 以下是部分代码块 #define UART_RX_LEN 4096uint8_t UART_RX_BUF[UART_RX_LEN];__IO uint16_t UART_RX_STA = 0;/************串口中断代码***********/void USART1_IRQHandler(void){ if(__HAL_UART_GET_FLAG( huart1, UART_FLAG_IDLE) != RESET) // 空闲中断标记被置位 { __HAL_UART_CLEAR_IDLEFLAG( huart1); // 清除中断标记 HAL_UART_DMAStop( huart1); // 停止DMA接收 UART_RX_STA = UART_RX_LEN - huart1.hdmarx->Instance->CNDTR; // 总数据量减去未接收到的数据量为已经接收到的数据量 UART_RX_STA |= 0X8000; // 标记接收结束 HAL_UART_Receive_DMA( huart1, UART_RX_BUF, UART_RX_LEN); // 重新启动DMA接收 __HAL_UART_ENABLE_IT(( huart1), UART_IT_IDLE); //重新开启串口接收帧中断 }}int main(void){ HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_DMA_Init(); MX_USART1_UART_Init(); HAL_UART_Receive_DMA( huart1, UART_RX_BUF, UART_RX_LEN); // 启动DMA接收 __HAL_UART_ENABLE_IT( huart1, UART_IT_IDLE); // 使能空闲中断 while (1) { if(UART_RX_STA 0X8000) { /**********接收数据处理代码*****************/ UART_RX_STA = 0; // 清除标记 UART_RX_FLAG=0; } }} |
|
相关推荐
1个回答
|
|
|
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1800 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1629 浏览 1 评论
1096 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
735 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1684 浏览 2 评论
1943浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
744浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
578浏览 3评论
601浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
563浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-26 23:51 , Processed in 1.195414 second(s), Total 83, Slave 65 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号