OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 9056|回复: 2

我发现STM32 V3.5库中 的定时器实验里面有一个bug, 就是刚开始定时的时候,一使能就直接进入中断了,但是后面就没有这个问题、求解答

[复制链接]

6

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
76
金钱
76
注册时间
2012-7-25
在线时间
0 小时
发表于 2012-8-11 13:22:12 | 显示全部楼层 |阅读模式
我发现STM32 V3.5库中 的定时器实验里面有一个bug, 就是刚开始定时的时候,一使能就直接进入中断了,但是后面就没有这个问题、求解答
在仿真和下载板子测试都一样
后面贴上我修改过定时器代码,以下是按下key0 就开始定时1500ms  但是在开机运行第一次的时候,只能定时1000ms 

 int main(void)
 {
    u8 Start_Flag=0;
SystemInit();
delay_init(72);     //延时初始化
NVIC_Configuration();
uart_init(9600);   //串口初始化
  LED_Init();   //LED端口初始化
KEY_Init();          //按键端口初始化
Timerx_Init(5000,7199);//10Khz的计数频率,计数到5000为500ms 
while(1)
{
LED0=!LED0;
delay_ms(10);
Start_Flag=KEY_Scan();
if(Start_Flag == 1)
{
TIM_Cmd(TIM3, ENABLE);  //使能TIMx外设
}   
}
 }
void Timerx_Init(u16 arr,u16 psc)
{
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;

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

TIM_TimeBaseStructure.TIM_Period = 5000; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 计数到5000为500ms
TIM_TimeBaseStructure.TIM_Prescaler =(7200-1); //设置用来作为TIMx时钟频率除数的预分频值  10Khz的计数频率  
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
 
TIM_ITConfig(  //使能或者失能指定的TIM中断
TIM3, //TIM2
TIM_IT_Update  |  //TIM 中断源
TIM_IT_Trigger,   //TIM 触发中断源 
ENABLE  //使能
);
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_InitStruct中指定的参数初始化外设NVIC寄存器

// TIM_Cmd(TIM3, ENABLE);  //使能TIMx外设
 
}
//重复3次 达到15s

static u8  count=0;//定时计数数

void TIM3_IRQHandler(void)   //TIM3中断
{
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源 
{
TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );  //清除TIMx的中断待处理位:TIM 中断源 
count++;
if(count==3)
{ count=0;
LED1=!LED1;
TIM_Cmd(TIM3, DISABLE);  //不使能TIMx外设
}
}
}

我尝试在使能定时器之后,清除标志位 TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );  //清除TIMx的中断待处理位:TIM 中断源  

,但是还是不行,还是一使能就直接进入中断
第一次只能定时1000ms 后面定时的次数却正常,那是什么问题呢??






人的梦想,是不会终结噶!!!!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

36

主题

1105

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2196
金钱
2196
注册时间
2012-2-8
在线时间
35 小时
发表于 2012-8-11 14:27:47 | 显示全部楼层
我也遇到这样的问题,同求解答
https://github.com/roxma
回复 支持 反对

使用道具 举报

6

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
76
金钱
76
注册时间
2012-7-25
在线时间
0 小时
 楼主| 发表于 2012-8-11 23:23:20 | 显示全部楼层
怎么没有人来解答呢??这个问题好像普遍V3.5 都有.
人的梦想,是不会终结噶!!!!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-27 07:03

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表