工作中遇到的问题
2015-11-20 09:23
344 查看
2015/11/20
1. STM32 的通用定时器
1. 1 确定定时器2~7的时钟源
从上图时钟树中,可以知道,定时器2~7的时钟来自于APB1,APB1最大为36MHZ;假设主频72MHZ, APB1使用主频二分频得到,那么APB1 = 36MHZ;APB1的分频因子为2;而定时器的时钟来源于APB1,但是,注意红色标注的位置有这句话: “如果APB1预分频系数=1,则频率不变,否则频率x2”;
此时APB1的分频系数不为 1,所以给到定时器2~7的时钟,等于APB1 * 2 = 36MHZ * 2 = 72MHZ;这只针对定时器2~7, 对于其他挂在APB1上的外设,时钟源还是36MHZ;
1.2 确定所用定时器的时钟
TIM_TimeBaseStructure.TIM_Period = period - 1;
TIM_TimeBaseStructure.TIM_Prescaler = prescaler - 1;
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(pTimerHandler->TIMER, &TIM_TimeBaseStructure);
以上用于配置定时器的基本信息,包括时钟分频,计数器,计数方式和 [b]TIM_ClockDivision[/b]
假设现在定时器2~7的时钟源为72MHZ
TIM_Prescaler
: 时钟分频因子;定时器的时钟 = 72MHZ / (TIM_Prescaler+ 1)
[b]TIM_Period: 定时器的计数值;[/b]
[b]TIM_CounterMode:定时其的计数方式,[b]TIM_CounterMode_Up 表示向上计数[/b][/b]
[b]重点说明[b]TIM_ClockDivision:这并不是对定时器源的时钟分频用的,根据数据手册上的解释,如下:[/b][/b]
[b][/b]
[b][b]这里并没有明确说明该变量作何用处,所以设置该位对于定时器的时钟没有任何影响,一般设置为[b]TIM_CKD_DIV1;也就是0;[/b][/b][/b]
[b][b]所以定时器每计数一次的时间 = ([b]TIM_Prescaler
/ 72000 000)s;[/b][/b][/b]
每次计数TIM_Period次产生一次中断;也就是定时器的中断时间 = TIM_Period * ([b]TIM_Prescaler
/ 72000 000);[/b]
1. STM32 的通用定时器
1. 1 确定定时器2~7的时钟源
从上图时钟树中,可以知道,定时器2~7的时钟来自于APB1,APB1最大为36MHZ;假设主频72MHZ, APB1使用主频二分频得到,那么APB1 = 36MHZ;APB1的分频因子为2;而定时器的时钟来源于APB1,但是,注意红色标注的位置有这句话: “如果APB1预分频系数=1,则频率不变,否则频率x2”;
此时APB1的分频系数不为 1,所以给到定时器2~7的时钟,等于APB1 * 2 = 36MHZ * 2 = 72MHZ;这只针对定时器2~7, 对于其他挂在APB1上的外设,时钟源还是36MHZ;
1.2 确定所用定时器的时钟
TIM_TimeBaseStructure.TIM_Period = period - 1;
TIM_TimeBaseStructure.TIM_Prescaler = prescaler - 1;
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(pTimerHandler->TIMER, &TIM_TimeBaseStructure);
以上用于配置定时器的基本信息,包括时钟分频,计数器,计数方式和 [b]TIM_ClockDivision[/b]
假设现在定时器2~7的时钟源为72MHZ
TIM_Prescaler
: 时钟分频因子;定时器的时钟 = 72MHZ / (TIM_Prescaler+ 1)
[b]TIM_Period: 定时器的计数值;[/b]
[b]TIM_CounterMode:定时其的计数方式,[b]TIM_CounterMode_Up 表示向上计数[/b][/b]
[b]重点说明[b]TIM_ClockDivision:这并不是对定时器源的时钟分频用的,根据数据手册上的解释,如下:[/b][/b]
[b][/b]
[b][b]这里并没有明确说明该变量作何用处,所以设置该位对于定时器的时钟没有任何影响,一般设置为[b]TIM_CKD_DIV1;也就是0;[/b][/b][/b]
[b][b]所以定时器每计数一次的时间 = ([b]TIM_Prescaler
/ 72000 000)s;[/b][/b][/b]
每次计数TIM_Period次产生一次中断;也就是定时器的中断时间 = TIM_Period * ([b]TIM_Prescaler
/ 72000 000);[/b]
相关文章推荐
- 阈值分割中全局阈值自动确定的一种方法
- Struts2后台使用Request和Session方法
- Selenium索引
- 第七周项目1-建立顺序环形队列算法库
- hdu1233 还是畅通工程 (kruskal求最小生成树)
- tomcat多域名绑定之server.xml配置
- Android编程实现仿iphone抖动效果的方法(附源码)
- 念念不忘 必有回响
- PAT 1011. World Cup Betting (20)
- 第11周 项目2-用二叉树求解代数表达式
- 移动端web开发技巧
- PHP写的异步高并发服务器,基于libevent
- 单例模式
- linux zip命令
- 如何下载Android源码(window和Linux)
- easyui combobox 下拉框后台列表查询
- 我所觉得好用且常用的Linux命令
- Java常用的7大排序算法汇总(转载)
- 埃尔多安回击“穆斯林都是恐怖分子”:坏人也可能是基督徒或犹太人
- Oralce 的sql问题