金牌会员
- 积分
- 1163
- 金钱
- 1163
- 注册时间
- 2019-10-22
- 在线时间
- 226 小时
|
1金钱
如果程序多1ms之内不能完成任务会怎样呢
int main()
{
SystemInit(); //系统时钟72MHz
SysTick_Config(SystemCoreClock/1000); /* SysTick 1 msec interrupts */
TIM2_Init(71,999);//1ms中断一次
USARTInit(9600);//波特率为9600
while(1)
{
USART1Hanndle();
}
}
void USART1Hanndle(void)
{
if(!UartFlagStC.UART1Flag) return;
printf("%s\r\n",UartFlagStC.UART1String);
memset(UartFlagStC.UART1String,0,160);
UartFlagStC.UART1Counter = 0;
UartFlagStC.UART1Flag = 0;
}
void TIM3_IRQHandler(void) //TIM3中断
{
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查TIM3更新中断发生与否
{
TIM_ClearITPendingBit(TIM3, TIM_IT_Update ); //清除TIMx更新中断标志
USART1InsetTimer();
}
}
void USART1InsetTimer(void)
{
if(UartFlagStC.usart1_start == 1)
{
UartFlagStC.usart1_counter++;
if(UartFlagStC.usart1_counter >USART_COUNTER_9600)
{
UartFlagStC.UART1Flag = 1;
UartFlagStC.usart1_counter = 0;
UartFlagStC.usart1_start = 0;
}
}
}
|
最佳答案
查看完整内容[请看2#楼]
按照你现在的代码,每1ms进入TIM3中断,在中断中执行USART1InsetTimer();函数,如果UartFlagStC.usart1_start为1的话,会执行UartFlagStC.usart1_counter++;操作。不过建议你在TIM3中断中仅进行标志位赋值的操作,设一个标志位flag,进入中断后flag=1,主循环中检测flag,flag=1时再执行USART1InsetTimer();函数,USART1InsetTimer()里面清除flag。 中断函数内部的处理是需要快进快出的。
|