OpenEdv-开源电子网

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

TIM_ClockDivision能影响输出比较吗?

[复制链接]

94

主题

369

帖子

0

精华

高级会员

Rank: 4

积分
865
金钱
865
注册时间
2016-8-25
在线时间
485 小时
发表于 2016-9-14 13:05:22 | 显示全部楼层 |阅读模式
10金钱
本帖最后由 学习stm32f4 于 2016-9-14 13:20 编辑

大家好,事情的起因是在学习F407-PWM输出实验时,看到原子哥是将LED初始化函数与定时器初始化函数分开写的,即写到两个.c文件里。
在定时器初始化函数TIM14_PWM_Init(u32 arr,u32 psc)里,有对PF9的初始化。
在LED初始化函数LED_Init()里,也有对PF9的初始化。
这两个文件对PF9的操作,只有对GPIO_InitStructure.GPIO_Mode的赋值是不同的。
那么,最初的问题是:若将LED_Init()里的程序挪到TIM14_PWM_Init()里是否可以呢?
经过试验,发现DS0的亮度不再变化,本以为不能将LED_Init()里对PF9的初始化与TIM14_PWM_Init()里对PF9的初始化放在同一个文件里。


但是,我把原子哥的LED_Init()及其相关文件注释掉后,再下载到探索板后,发现LED正常工作,这表明单独初始化LED不是必须的。
然后我把自己参照视频讲解写的程序中关于单独初始化LED的文件、命令语句全部注释掉后,发现LED不工作。很费解。。。


于是我就逐行对照原子哥的程序与自己仿照的程序,终于发现:
原子哥的代码:
[mw_shl_code=c,true]        
TIM_TimeBaseStructure.TIM_Prescaler=psc;
        TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
        TIM_TimeBaseStructure.TIM_Period=arr;
        TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
        TIM_TimeBaseInit(TIM14,&TIM_TimeBaseStructure);
[/mw_shl_code]
自己仿照的代码:
[mw_shl_code=c,true]        
TIM_TimeBaseInitStructure.TIM_Prescaler=psc;
        TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;
        TIM_TimeBaseInitStructure.TIM_Period=arr;
        TIM_TimeBaseInit(TIM14,&TIM_TimeBaseInitStructure);
[/mw_shl_code]
原来是缺少了对TIM_TimeBaseStructure.TIM_ClockDivision的赋值。将TIM_ClockDivision加入自己仿照的程序后,DS0正常工作。
但是在学习定时器中断实验这一节的视频时,里面讲到TIM_ClockDivision是在输入捕获中用到的。而且TIM_ClockDivision的作用确实是输入捕获功能中对输入脉冲边沿信号的采样频率的设置。


由于PWM输出实验用的是输出比较功能,而TIM_ClockDivision是为输入捕获设置参数,那么它在PWM输出实验为何会有如此的影响呢?
附件是仿照的工程文件,有兴趣的stm32爱好者可以注释掉“timer.c”文件的第27行试试,观察与注释掉该行前后DS0的变化。


Template.rar

7.91 MB, 下载次数: 45

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

使用道具 举报

1

主题

2

帖子

0

精华

新手入门

积分
17
金钱
17
注册时间
2021-3-16
在线时间
3 小时
发表于 2021-4-18 02:24:43 | 显示全部楼层
我也刚好学到这里,这个问题也同样困扰了我。
然后我试着把
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV2
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV4
都试了一下,不管用哪个参数,并不会影响程序功能正常运行。
由于TIM_ClockDivision是一个uint16_t的变量,所以我随便给这个参数赋了一个0xffff的值,发现编译能通过,但是LED就不亮了。
打开库函数TIM_TimeBaseInit查看,函数体内有对TIM_ClockDivision的有效性进行判断,我用STlink调试单步运行时,到有效性判断这步时直接跳过了,也没提示错误。但是深入的调试手段我还没掌握也无法进一步进行调试
然后再对这个参数进行逐一使用以下数据进行测试:
TIM_TimeBaseStructure.TIM_ClockDivision=0x0300;    //亮
TIM_TimeBaseStructure.TIM_ClockDivision=0x0387;    //不亮
TIM_TimeBaseStructure.TIM_ClockDivision=0x0307;    //不亮
TIM_TimeBaseStructure.TIM_ClockDivision=0x0305;    //亮
TIM_TimeBaseStructure.TIM_ClockDivision=0x0385;    //亮
库函数对TIM_ClockDivision参数的配置是对TIMx_CR1寄存器的写操作
翻开手册
看到TIMx_CR1的bit1(UDIS)是更新禁止位,如果这个位被置1了,那么就禁止了更新中断事件的生成.
到这里基本上就明了了,虽然初始化TIM_ClockDivision这个参数是对Tdts的配置,但是如果不初始化这个参数,由于库函数还是会给这个寄存器写入参数,调用函数如果不给定值,就相当于给了个随机值,就有可能把更新事件使能位给禁止了。
不过这里我还是不明白,库函数里有对TIM_ClockDivision这个参数的有效性进行判断,为什么我写入像0x0305、0x0385这些数,程序照样能跑呢?
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-28 03:44

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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