用CH32V103C8T6作時間中斷,PA0和PA1各控制一個LED
根據(jù)例程,如下程序已經(jīng)實現(xiàn)兩個LED都在閃爍,即時間中斷功能已經(jīng)實現(xiàn)
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中斷是否發(fā)生。
??? {
??????? 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));
??? }
}
上述功能正常實現(xiàn),現(xiàn)程序稍作修改:用一個全局變量Tim3Flag用來標記是否有時間中斷產(chǎn)生,在主循環(huán)中查詢標記,查詢到標記置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中斷是否發(fā)生。
??? { ? ? ? ?
? ? ? ? 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));
??? }
}
上述修改后的程序,正常情況應(yīng)該是2個LED同頻率閃爍,串口定時收到字符串“Enter interrupt”。
現(xiàn)在的情況是:串口能定時收到信息,PA1控制的LED正常閃爍,主循環(huán)中查詢標記位并由PA0控制的LED不閃爍。說明定時器工作了,主循環(huán)查詢標記卻查詢不到,不知是什么原因??