OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4428|回复: 2

(F4HAL串口不定长接收)TIM超时中断

[复制链接]

13

主题

71

帖子

0

精华

高级会员

Rank: 4

积分
696
金钱
696
注册时间
2017-8-14
在线时间
131 小时
发表于 2017-9-6 17:12:31 | 显示全部楼层 |阅读模式
本帖最后由 胡图图图 于 2017-9-6 17:13 编辑

大家来一起找BUG啊!!!!!!!!!!!!!!!!!!!!!!!!!
小白做了好久,做出来了TIM超时中断,但是有很多BUG。BUG1:第一次接收只能接收一个字节。
BUG2:中断中必须有一个printf输出。

代码:先配置好usart1串口和TIM2(中断时间100ms)定时器。
main.h
#define RXBUFFERSIZE                             1024

main.c
while(1){
        unsigned char IT_Rcv[512];
        HAL_UART_Receive_IT(&huart1,IT_Rcv,RXBUFFERSIZE);
        printf("Rcv:%s\r\n",IT_Rcv);                        
        HAL_Delay(1000);        

}

stm32f4xx_it.c
void TIM2_IRQHandler(void)
{
                        if(__HAL_TIM_GET_ITSTATUS(&htim2,TIM_IT_UPDATE) != RESET)        //是更新中断                                                                                                                                
                        {               

                                //添加结束符        
                                        *(huart1.pRxBuffPtr+(RXBUFFERSIZE-huart1.RxXferCount)) = 0;                                                               
                                //        重置数据接受缓冲区                                       
                                        CLEAR_BIT(huart1.Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE));
                                        CLEAR_BIT(huart1.Instance->CR3, USART_CR3_EIE);
                                        huart1.RxState = HAL_UART_STATE_READY;
                                       
                                        TIM_GET_CLEAR_IT(&htim2,TIM_IT_UPDATE);        //清除TIM2更新中断标志        
                                        HAL_TIM_Base_Stop_IT(&htim2);        //关闭TIM2        
                                        printf("&\r\n");
                        }           

}


void USART1_IRQHandler(void)
{

                unsigned char        res;               
               
    if( huart1.RxState == HAL_UART_STATE_BUSY_RX )
    {               
                        
                        res = (uint8_t)(huart1.Instance->DR & (uint8_t)0x00FFU);                                                
                        
                                if( (RXBUFFERSIZE-huart1.RxXferCount)<RXBUFFERSIZE )          //还可以接收数据
                                {
                                __HAL_TIM_SetCounter(&htim2,0);                                        //计数器清空                                 
                                       
                                                if( (RXBUFFERSIZE-huart1.RxXferCount)==0 ){               
                                                        HAL_TIM_Base_Start_IT(&htim2);                 //使能定时器7         
                                                        *huart1.pRxBuffPtr++ = res;                       //记录接收到的值                        
                                                }else{                                                                        
                                                        *huart1.pRxBuffPtr++ = res;                      //记录接收到的值        
                                                        *(huart1.pRxBuffPtr+(RXBUFFERSIZE-huart1.RxXferCount)) = 0;                        //添加结束符        
                                                        //        重置数据接受缓冲区                                       
                                                        CLEAR_BIT(huart1.Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE));
                                                        CLEAR_BIT(huart1.Instance->CR3, USART_CR3_EIE);
                                                        huart1.RxState = HAL_UART_STATE_READY;
                                                        printf(" Error\r\n");
                                                }
                                        }               
                        }

}

yi?我的二哈哪去了
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165508
金钱
165508
注册时间
2010-12-1
在线时间
2115 小时
发表于 2017-9-7 00:15:36 | 显示全部楼层
可以利用串口空闲中断来做,论坛很多参考
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

13

主题

71

帖子

0

精华

高级会员

Rank: 4

积分
696
金钱
696
注册时间
2017-8-14
在线时间
131 小时
 楼主| 发表于 2017-9-7 09:14:16 | 显示全部楼层
正点原子 发表于 2017-9-7 00:15
可以利用串口空闲中断来做,论坛很多参考

DMA+空闲中断我做了,很多例子和源码。
定时器中断是借鉴原子哥之前用标准库写的改写成的,但是我写的代码有好多问题
yi?我的二哈哪去了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-18 11:00

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表