OpenEdv-开源电子网

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

预想的功能是串口接收数据,并发生串口中断,时复位定时器TIM3,不产生定时器中断3,实际上会串口中断发生时会产生定时器中断

[复制链接]

4

主题

7

帖子

0

精华

新手入门

积分
10
金钱
10
注册时间
2021-1-2
在线时间
6 小时
发表于 2021-1-22 23:01:55 | 显示全部楼层 |阅读模式
8金钱
程序初始化时将TIM3初始化为每隔6s发生一次中断;定时器的作用是当串口在6s内没有接收到数据时产生定时器中断,告知串口数据接收完毕;
程序功能是串口接收数据,当接收到数据后产生串口中断,将数据存储在数组中,同时复位定时器TIM3,使定时器不发生中断,重新开始计数;
我写出来的程序发现,串口每发生一次中断,定时器中断会跟着出现,即没有达到复位定时器TIM3的效果;
串口中断用了两种实现方式,目前都无法实现,串口中断后就会触发定时器中断


串口中断处理方式1:================================================
void USART1_IRQHandler(void)
{
                if(USART_GetITStatus(USART1,USART_IT_RXNE))
                {
                        res=USART_ReceiveData (USART1);
                        TEXT_Buffer[i]=res;
                        TIM_GenerateEvent(TIM3,TIM_EventSource_Update);   //串口中断里触发更新事件,复位定时器
                        if(i<4095)
                        {
                               
                                i++;
                               
                        }
                        else
                        {       
                                num++;
                                i=0;
                                full_flag=1;

                        }
                }
}





串口中断处理方式2:=================================================
void USART1_IRQHandler(void)
{
                if(USART_GetITStatus(USART1,USART_IT_RXNE))
                {
                        res=USART_ReceiveData (USART1);
                        TEXT_Buffer[i]=res;
                        TIM_DeInit(TIM3);                      //复位TIM3
                        TIM3_Int_Init(60000,7199);           //初始化TIM3
                        if(i<4095)
                        {
                               
                                i++;
                               
                        }
                        else
                        {       
                                num++;
                                i=0;
                                full_flag=1;

                        }
                }
}



================================================
void USART1_IRQHandler(void)
{
                if(USART_GetITStatus(USART1,USART_IT_RXNE))
                {
                        res=USART_ReceiveData (USART1);
                        TEXT_Buffer[i]=res;
                        TIM_GenerateEvent(TIM3,TIM_EventSource_Update);   //串口中断里触发更新事件,复位定时器
                        if(i<4095)
                        {
                               
                                i++;
                               
                        }
                        else
                        {       
                                num++;
                                i=0;
                                full_flag=1;

                        }
                }
}



=================================================
定时器中断的功能是当串口在6s内没接收到数据,意味着串口数据发送完毕,定时器中断,将数组的内容写入flash里面
void TIM3_IRQHandler(void)   //TIM3中断
{
        if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)  //检查TIM3更新中断发生与否
                {
                        TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );  //清除TIMx更新中断标志               
                        if(i!=0)
                        {
                                num++;
                                W25QXX_Write((u8*)TEXT_Buffer,num*4096,i);
                                i=0;
                                block0[0]=num&0xff00;
                                block0[1]=num&0x00ff;
                                block0[2]=0x11;
                                W25QXX_Write((u8*)block0,0,3);
                        }
                }
}


=============================================================


工程里具有串口中断,又有定时器中断,那么在main()中,中断优先级怎么写呢  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-15 04:57

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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