本帖最后由 学习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的变化。
一周热门 更多>