SYSTICK_DelayInit();
SYSTICK_Cmd(true);
ds1302_init();
lcd_Init();
// Timer_Init();
while(1){
ds1302_read_realTime();
lcd_write_word(0x01,10,DS1302_data_1);
lcd_write_word(0x40,11,DS1302_data_2);
}
如:
SYSTICK_DelayInit();
SYSTICK_Cmd(true);
ds1302_init();
lcd_Init();
Timer_Init();
while(1){
// ds1302_read_realTime();
// lcd_write_word(0x01,10,DS1302_data_1);
// lcd_write_word(0x40,11,DS1302_data_2);
PAout(6)=1;
}
}
PA6仍为低电平
void Timer_Init(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
TIM_InternalClockConfig(TIM3);
TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInitStructure.TIM_Period = 1999;
TIM_TimeBaseInitStructure.TIM_Prescaler = 8999;
TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStructure);
TIM_ClearFlag(TIM3, TIM_FLAG_Update);
TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_Init(&NVIC_InitStructure);
TIM_Cmd(TIM3, ENABLE);
}
STM32中使用TIM中断可能会影响GPIO端口,具体原因可能是TIM中断优先级较高,导致代码执行顺序发生变化,导致GPIO端口不正常输出。你可以尝试调整TIM中断的优先级,或者在TIM中断函数中加入保护代码,以防止中断函数对主函数的影响。在TIM中断函数中使用信号量或者互斥量来防止中断函数对主函数的影响。
例如:
void TIM3_IRQHandler(void)
{
//检测TIM3更新中断标志
if(TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
{
//清除TIM3更新中断标志
TIM_ClearITPendingBit(TIM3, TIM_IT_Update);//加入保护代码
osSemaphoreWait(Semaphore_TIM, osWaitForever);
//在此处写入TIM中断函数的代码
...
//释放保护代码
osSemaphoreRelease(Semaphore_TIM);
}
另外,你也可以通过调整TIM中断的优先级来避免与主函数的冲突。可以在TIM中断初始化函数中修改NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority 和 NVIC_InitStructure.NVIC_IRQChannelSubPriority的值,使TIM中断的优先级比主函数的低一些。