新手入门
- 积分
- 10
- 金钱
- 10
- 注册时间
- 2021-1-2
- 在线时间
- 6 小时
|
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位响应优先级
|
|