OpenEdv-开源电子网

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

求助,定时器的问题

[复制链接]

3

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2016-7-20
在线时间
13 小时
发表于 2016-7-26 17:20:23 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 晴空万里的天 于 2016-7-26 17:22 编辑

void TIM5_Int_Init()
{
        TIM_OCInitTypeDef  TIM_OCInitStructure;
       TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        NVIC_InitTypeDef NVIC_InitStructure;

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

        TIM_TimeBaseStructure.TIM_Period =999; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值         计数到1000为1ms
        TIM_TimeBaseStructure.TIM_Prescaler =71; //设置用来作为TIMx时钟频率除数的预分频值  1Mhz的计数频率  
        TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
        TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
        TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_Timing;//时间比较
        TIM_OCInitStructure.TIM_Pulse = 104;           //设置跳变值,当计数器计数到这个值时,电平发生跳变
        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;  //当定时器计数值小于CCR2_Val时为高电平
        TIM_OC2Init(TIM5,&TIM_OCInitStructure);
        TIM_OC2PreloadConfig(TIM5,TIM_OCPreload_Enable);
        TIM_ITConfig(TIM5,TIM_IT_CC2,ENABLE);


        NVIC_InitStructure.NVIC_IRQChannel = TIM5_IRQn;  //TIM3中断,NVIC中断管理在默认情况下都是0级组,所以不分组也能用
        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(TIM5, ENABLE);  //使能TIMx外设

void TIM5_IRQHandler(void)
{
   if(TIM_GetITStatus(TIM5,TIM_IT_CC2)!=RESET)
        {
          TIM_ClearITPendingBit(TIM5,TIM_IT_CC2);
                GPIOB->ODR ^=GPIO_Pin_0;
        }
}

为什么我设定了104us中断,可是我用示波器看那个GPIOB0引脚的时候是1ms中断呢,意思就是 TIM_OCInitStructure.TIM_Pulse = 104;这个值设不设都没关系,我也实验了,无论怎么改,最终都是以TIM_TimeBaseStructure.TIM_Period =999; 这个值为准,为什么呢?
求助大神。




正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2016-7-20
在线时间
13 小时
 楼主| 发表于 2016-7-26 17:28:31 | 显示全部楼层

求助,定时器的问题

本帖最后由 晴空万里的天 于 2016-7-26 17:30 编辑

示波器的图片
~4`XYY4[WVDJJN460UL[84D.png
回复

使用道具 举报

22

主题

213

帖子

0

精华

高级会员

Rank: 4

积分
682
金钱
682
注册时间
2015-2-13
在线时间
74 小时
发表于 2016-7-26 17:35:09 | 显示全部楼层
PWM 的频率 = 定时器频率 / (分频系数+1) / (重装载值+1) = 72M/(71+1)/(999+1)
TIM_OCInitStructure.TIM_Pulse = 104  是设置占空比
回复

使用道具 举报

3

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2016-7-20
在线时间
13 小时
 楼主| 发表于 2016-7-26 17:37:32 | 显示全部楼层
huishun1314 发表于 2016-7-26 17:35
PWM 的频率 = 定时器频率 / (分频系数+1) / (重装载值+1) = 72M/(71+1)/(999+1)
TIM_OCInitStructure. ...

我知道啊,我在这里用的是Timing,就是时间比较。理论上来说,我写了这个数值,达到这个计数值后应该会进入中断的,现在感觉好像是没进。
回复

使用道具 举报

2

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
156
金钱
156
注册时间
2013-1-20
在线时间
50 小时
发表于 2016-7-26 17:55:04 | 显示全部楼层
这句  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式

你设置的是向上计数模式

1.jpg


在向上计数模式中,计数器从0计数到自动加载值(TIMx_ARR计数器的内容),然后重新从0开始计数并且产生一个计数器溢出事件

2.jpg

TIMx_Pulse 设置了捕获比较寄存器的脉冲值,跟你设置的向上计数模式无关
1.jpg
回复

使用道具 举报

2

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
156
金钱
156
注册时间
2013-1-20
在线时间
50 小时
发表于 2016-7-26 17:55:45 | 显示全部楼层
这种问题多看看数据手册吧
回复

使用道具 举报

3

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2016-7-20
在线时间
13 小时
 楼主| 发表于 2016-7-26 18:03:06 | 显示全部楼层
gesang 发表于 2016-7-26 17:55
这种问题多看看数据手册吧

那程序怎么会进入那个CC2中断呢?计数溢出的话不是进入溢出中断吗?
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-2 11:37

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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