用CH32V103C8T6作时间中断,PA0和PA1各控制一个LED
根据例程,如下程序已经实现两个LED都在闪烁,即时间中断功能已经实现
int main(void)
{
u8 j=0;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
Delay_Init();
USART_Printf_Init(115200);
LED_Init();
TIM3_Init(4999,7199);
printf("SystemClk:%d\r\n",SystemCoreClock);
while(1)
{
GPIO_WriteBit(GPIOA, GPIO_Pin_0, (j==0) ? (j=Bit_SET):(j=Bit_RESET));
Delay_Ms(100);
}
}
void TIM3_IRQHandler(void)
{
static u8 i=0;
if(TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查TIM3中断是否发生。
{
TIM_ClearITPendingBit(TIM3,TIM_IT_Update); //清除TIM3的中断挂起位。
printf("Enter interrupt\n");
GPIO_WriteBit(GPIOA, GPIO_Pin_1, (i==0) ? (i=Bit_SET):(i=Bit_RESET));
}
}
上述功能正常实现,现程序稍作修改:用一个全局变量Tim3Flag用来标记是否有时间中断产生,在主循环中查询标记,查询到标记置1后将标记清零并闪烁LED , 程序如下:
int main(void)
{
u8 j=0;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
Delay_Init();
USART_Printf_Init(115200);
LED_Init();
TIM3_Init(4999,7199);
printf("SystemClk:%d\r\n",SystemCoreClock);
while(1)
{
if(Tim3Flag){
Tim3Flag = 0;
GPIO_WriteBit(GPIOA, GPIO_Pin_0, (j==0) ? (j=Bit_SET):(j=Bit_RESET));
}
}
}
void TIM3_IRQHandler(void)
{
static u8 i=0;
if(TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查TIM3中断是否发生。
{
TIM_ClearITPendingBit(TIM3,TIM_IT_Update); //清除TIM3的中断挂起位。
Tim3Flag = 1;
printf("Enter interrupt\n");
GPIO_WriteBit(GPIOA, GPIO_Pin_1, (i==0) ? (i=Bit_SET):(i=Bit_RESET));
}
}
上述修改后的程序,正常情况应该是2个LED同频率闪烁,串口定时收到字符串“Enter interrupt”。
现在的情况是:串口能定时收到信息,PA1控制的LED正常闪烁,主循环中查询标记位并由PA0控制的LED不闪烁。说明定时器工作了,主循环查询标记却查询不到,不知是什么原因?