stm32定时器问题,求大家帮助分析下。

2019-08-16 18:54发布

我用战舰的范例,关于定时器方面出现问题。定时的时间比实际的时间大8倍。代码如下:
//------------------------------------------ delay_init();       //延时函数初始化    NVIC_Configuration();   //设置NVIC中断分组2:2位抢占优先级,2位响应优先级 uart_init(9600);  //串口初始化为9600   LED_Init();      //LED端口初始化 TIM3_Int_Init(4999,7199);//10Khz的计数频率,计数到5000为500ms delay_ms(200);       while(1) { LED=!LED; delay_ms(500);     }
LED闪烁间隔是4秒闪烁(4亮4秒熄灭)。应该是500ms才正确啊。很纠结没找出原因。请各位大侠帮小弟分析下。不胜感激啊。
用的板子不是战舰。硬件基本上是一样的。主控芯片是stm32f103zet6.
我感觉是不是没有倍频啊。外部晶振是8M的,9倍频以后就是72M了。我用手机计时的,可能不准。要是4.5秒的话就是正好相差9倍了。 
请大家帮我分析分析。
我之前买了原子的stm32f103rbt6的一块开发板。书也买了定时从来没有出现这种问题啊。我在我以前的那个开发板上移植了modbus通信。modbus通信没有问题的。现在用stm32f103zet6定时就出现上述问题,modbus也通信不了了。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
12条回答
fanghuiopenedv
1楼-- · 2019-08-16 19:02
回复【楼主位】fanghuiopenedv:
---------------------------------
LED用的是这个管脚应该于此没有关系。在线等,大家帮忙看下,谢谢。
#define LED Gout(14) // G14
正点原子
2楼-- · 2019-08-16 19:45
 精彩回答 2  元偷偷看……
fanghuiopenedv
3楼-- · 2019-08-16 21:17
回复【3楼】正点原子:
---------------------------------
谢谢回复。
TIM3_Int_Init(7199,99);---这样是不是10ms啊。
fanghuiopenedv
4楼-- · 2019-08-17 01:22
回复【3楼】正点原子:
--------------------------------
刚才我试了下。改成
TIM3_Int_Init(7199,4999);//10Khz的计数频率,计数到5000为500ms
效果是一样的。还是4秒左右的定时啊。
fanghuiopenedv
5楼-- · 2019-08-17 04:00
回复【楼主位】fanghuiopenedv:
---------------------------------
这是主函数里的:
 int main(void)
 {
  extern u8 modbus_delay;
extern u8 delay_time1;
extern u8 delay_time2;
//------------------------------------------
delay_init();       //延时函数初始化   
NVIC_Configuration();   //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
uart_init(9600);  //串口初始化为9600
  LED_Init();      //LED端口初始化
TIM3_Int_Init(7199,4999);//10Khz的计数频率,计数到5000为500ms
delay_ms(200);  
    while(1)
{
if(delay_time1==0){
delay_time1=1;
LED=!LED;
}
//LED=!LED;
//delay_ms(500);    
}
}
这是定时器里的:
u8 modbus_delay=0;
u8 delay_time1=0;
u8 delay_time2=0;
void TIM3_Int_Init(u16 arr,u16 psc)
{
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能

//定时器TIM3初始化
TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位
 
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断

//中断优先级NVIC设置
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  //TIM3中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占优先级0级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //从优先级3级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
NVIC_Init(&NVIC_InitStructure);  //初始化NVIC寄存器


TIM_Cmd(TIM3, ENABLE);  //使能TIMx  
}
//定时器3中断服务程序
void TIM3_IRQHandler(void)   //TIM3中断
{
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)  //检查TIM3更新中断发生与否
{
TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );  //清除TIMx更新中断标志 
if(modbus_delay!=0)modbus_delay--;
if(delay_time1!=0) delay_time1--;
if(delay_time2!=0) delay_time2--;
}
}
fanghuiopenedv
6楼-- · 2019-08-17 05:09
回复【楼主位】fanghuiopenedv:
---------------------------------
开机要等要几秒LED才闪烁,间隔4秒左右。是不是像aleda303 说的那样外部晶振没有启动啊。
“很有可能是PLL工作不正常。 或外部时钟晶体不正常, 导致 SysClock =  内部HSI”------aleda303

一周热门 更多>