我用战舰的范例,关于定时器方面出现问题。定时的时间比实际的时间大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也通信不了了。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
---------------------------------
LED用的是这个管脚应该于此没有关系。在线等,大家帮忙看下,谢谢。
#define LED Gout(14) // G14
---------------------------------
谢谢回复。
TIM3_Int_Init(7199,99);---这样是不是10ms啊。
--------------------------------
刚才我试了下。改成
TIM3_Int_Init(7199,4999);//10Khz的计数频率,计数到5000为500ms
效果是一样的。还是4秒左右的定时啊。
---------------------------------
这是主函数里的:
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--;
}
}
---------------------------------
开机要等要几秒LED才闪烁,间隔4秒左右。是不是像aleda303 说的那样外部晶振没有启动啊。
“很有可能是PLL工作不正常。 或外部时钟晶体不正常, 导致 SysClock = 内部HSI”------aleda303
一周热门 更多>