主程序非常简单,就是一个跑马灯: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_TimeBaseInitTypeDef TIM_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
|
也把 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);
}
}
}
desk(æ¹èªç©ºæ°ååå¨) - 0331 -A - å¯æ¬ -éç«ï¼ä¸æ£å¸¸ï¼.zip
2018-4-12 16:52 上传
点击文件名下载附件
下载积分: ST金币 -15.42 MB, 下载次数: 0, 下载积分: ST金币 -1
project_template_led(æ¹èªéç«)OK -TIMER3ï¼æ£å¸¸ï¼.zip
2018-4-12 16:52 上传
点击文件名下载附件
下载积分: ST金币 -15.73 MB, 下载次数: 56, 下载积分: ST金币 -1
评分
查看全部评分
跑马灯只要在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了
评分
查看全部评分
我用STM32不是为了写个跑马灯,是程序写完了,发现运行有问题。为了让自己找问题和大家便于分析,这专门把主程序改成个非常简单的跑马灯。
我用st_link,也没办法知道它运行到哪里了,没跑到设好的断点。st_link的两个灯是在闪。
if(TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
{
TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
Timer_Count_Value ++;
}
评分
查看全部评分
按这样改了,没用。
按你说的试了,没解决问题
评分
查看全部评分
//#define ENABLE_BOOT //使能BOOT(固件升级功能)把这句屏蔽就好了
static void NVIC_Configuration(void)
{
#ifdef ENABLE_BOOT
NVIC_SetVectorTable(NVIC_VectTab_FLASH,OFFSET_FIRMWARE_L);
#else
NVIC_SetVectorTable(NVIC_VectTab_FLASH,0);
#endif
//Configure the NVIC Preemption Priority Bits
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
}
评分
查看全部评分