stm32使能timer3导致程序不正常运行的问题
主程序非常简单,就是一个跑马灯:int main(void){
extern uint8_t uart_input_finish;
extern uint16_t uart_input_count;
Bsp_Init();
while(1)
{
GPIO_WriteBit(GPIOB, GPIO_Pin_6, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_6)));
Delay_ms(6000);
}
}
但如果下面这句TIM3_Count_Init(9999,719);屏蔽它就可以正常跑灯,不屏蔽则没反应,应该是死机?
static void Bsp_Init(void)
{
RCC_Configuration();
NVIC_Configuration();
TIM3_Count_Init(9999,719);//1ms//NG
}
或者:不屏蔽IM3_Count_Init(9999,719);改成屏蔽 TIM_Cmd(TIM3, (FunctionalState)ENABLE); 这句也是可以正常跑灯的。
void TIM3_Count_Init(u16 arr,u16 psc)
{
TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, (FunctionalState)ENABLE);
TIM_DeInit(TIM3);
TIM_TimeBaseStructure.TIM_Period = arr;
TIM_TimeBaseStructure.TIM_Prescaler = psc;
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
TIM_ClearFlag(TIM3, TIM_FLAG_Update);
TIM_ITConfig(TIM3,TIM_IT_Update, (FunctionalState)ENABLE);
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 4;
NVIC_InitStructure.NVIC_IRQChannelCmd = (FunctionalState)ENABLE;
NVIC_Init(&NVIC_InitStructure);
Timer_Count_Value = 0;
Timer3_Value = 0;
TIM_Cmd(TIM3, (FunctionalState)ENABLE);
}
我反复看了它的中断服务涵数,也没看出哪有不妥:
void TIM3_IRQHandler(void)
{
static uint8_t sec_count = 0;
static uint8_t min_count = 0;
if(TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
{
TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
Timer_Count_Value ++;
if(Timer_Count_Value % 250 == 0)
{
Timer3_Value ++;
if(Timer3_Value == 12)
{
Timer3_Value = 0;
}
if(Timer3_Value % 4 == 0)
{
sec_count ++;
if(sec_count >= 15)
{
is_read_time = 1;
sec_count = 0;
}
if(FlashBuffer.power_switch == 1)
{
min_count ++;
if(min_count >= 60)
{
min_count = 0;
FlashBuffer.run_time ++;
if(FlashBuffer.run_time % 30 == 0)
{
//±£´æÔËÐÐʱ¼ä
Earse_Flash(PARA_ADDR);
if(Write_Flash(PARA_ADDR,(unsigned char *)&FlashBuffer,sizeof(FlashBuffer)) == ERROR)
{
}
}
}
}
else
{
min_count = 0;
}
}
}
}
}
@toofree 2576224822
我在另一项目模板,project_template_led里
也把 TIM3_Count_Init(9999,719);//1ms//NG用上,并把use_timer.c也都添进去,运行都正常。说明实际或许跟timer3的中断没关,(但在大家找不出原因的那个项目里,把TIM3_Count_Init(9999,719);屏蔽它就可以正常跑灯,不屏蔽则没反应,死机,这也是事实)
大家可以比较下这两个项目哪里不同?desk这个项目里面哪部分会导致?其实我的主程序都只用了极少的东西,大家要分析的范围应该不大。这两个项目都是用同一个开发板来调试。真希望有人能解这个谜
int main(void)
{
LED_GPIO_Config();
Delay_Init(72);
while (1)
{
TIM3_Count_Init(9999,719);//1ms//NG
while(1)
{
GPIO_WriteBit(GPIOB, GPIO_Pin_6, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_6)));
Delay_ms(6000);
}
}
} STM32CubeMX走起,啥都解决。。。标准库都没研究了!!! 本帖最后由 wenyangzeng 于 2018-4-12 13:58 编辑
跑马灯只要在whuke()循环里延时(你已经是这样做了)翻转GPIO口就可以了。为何要定时器参加这个函数的调用让人看不明白,写GPIO口为何要带那么多调用函数?
GPIO_WriteBit(GPIO, GPIO_Pin_6, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_6)));
改成:
{
GPIOB->BSRR = 0x00000040;
Delay_ms(6000);
GPIOB->BRR= 0x00000040;
Delay_ms(6000);。
。
。
增加其他LED.........
}
就OK了
DEBUG调试一下,单步运行看看死在哪里 wenyangzeng 发表于 2018-4-12 13:53
跑马灯只要在whuke()循环里延时(你已经是这样做了)翻转GPIO口就可以了。为何要定时器参加这个函数的调用让 ...
我用STM32不是为了写个跑马灯,是程序写完了,发现运行有问题。为了让自己找问题和大家便于分析,这专门把主程序改成个非常简单的跑马灯。 流水源 发表于 2018-4-12 14:31
DEBUG调试一下,单步运行看看死在哪里
我用st_link,也没办法知道它运行到哪里了,没跑到设好的断点。st_link的两个灯是在闪。 中服服务程序中只保留最简单的形式,其它一律不要。
if(TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
{
TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
Timer_Count_Value ++;
} toofree 发表于 2018-4-12 15:43
中服服务程序中只保留最简单的形式,其它一律不要。
if(TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
...
按这样改了,没用。 toofree 发表于 2018-4-12 15:43
中服服务程序中只保留最简单的形式,其它一律不要。
if(TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
...
按你说的试了,没解决问题
页:
[1]
2