2019-10-14 21:58发布
vention 发表于 2016-10-8 09:45 我把你的程序复制烧录在F103的开发板上,试过了,可行,可是有很多地方看不懂。比如,定时器2 TIM2是用来 ...
K.O.Carnivist 发表于 2016-10-8 12:38 TIM1的作用是:启动之后会计数更新6个周期,然后自己停止计数。这6个周期期间会按顺序输出4个脉冲,但输 ...
vention 发表于 2016-10-9 09:25 研究了你的话好久,但还是不懂 CCER_Buffer 数组中的值的计算。 uint16_t CCER_Buffer[6] = { ...
K.O.Carnivist 发表于 2016-10-9 09:49 啊? CCER = 0x0203 就是CH4高电平有效、输出禁止,CH3低电平有效、输出禁止,CH2高电平有效、输出禁止 ...
vention 发表于 2016-10-10 15:13 还有两小点不清楚的,望前辈提供资料查询。 ①: (uint32_t)0x40012C20; /* TIM1_CCER */ 地址是 ...
最多设置5个标签!
TIM1的作用是:启动之后会计数更新6个周期,然后自己停止计数。这6个周期期间会按顺序输出4个脉冲,但输出完后就停止了不会输出下一组。
TIM2的作用是定期启动TIM1。调整总周期就是调整TIM2的周期。
TIM1输出4个脉冲的过程由TIM1的6个周期完成,6个周期的状态分别是:
周期0:CH1输出使能,其他通道输出禁止。
周期1:CH1、CH2输出使能,其他通道输出禁止。
周期2:CH2、CH3输出使能,其他通道输出禁止。
周期3:CH3、CH4输出使能,其他通道输出禁止。
周期4:CH4输出使能,其他通道输出禁止。
周期5:所有通道输出禁止。
这6个状态就是由CCER中的CCxE来控制的,对应的就是CCER_Buffer。
可以看到对每个通道来说,有2个周期是输出使能的,在这2个周期中这个通道的行为是:
1. 第一周期的CNT=1时刻触发通道的比较事件,通道输出Toggle变为低电平。
2. 同时触发DMA改写CCER,这个通道输出使能。
3. 第二周期的CNT=1时刻触发比较事件,通道输出Toggle变为高电平。
4. 第三周期的CNT=1时刻触发比较事件,通道输出Toggle变为低电平。
5. 同时触发DMA改写CCER,这个通道输出禁止,即此后保持低电平。
其中第3~4步之间的时间就是输出的脉冲。
漏掉的一点是如何让第1步Toggle之后这个通道输出的是低电平,这个是由CCER中的CCxP来控制的。
研究了你的话好久,但还是不懂 CCER_Buffer 数组中的值的计算。
uint16_t CCER_Buffer[6] = {
0x0203,
0x0213,
0x0312,
0x1302,
0x1202,
0x0202}
啊?
CCER = 0x0203 就是CH4高电平有效、输出禁止,CH3低电平有效、输出禁止,CH2高电平有效、输出禁止,CH1低电平有效、输出使能……
CCER = 0x0213 就是CH4高电平有效、输出禁止,CH3低电平有效、输出禁止,CH2高电平有效、输出使能,CH1低电平有效、输出使能……
按CCER每一位的定义计算……
soga 秒懂
①
以 F103 为例,先在参考手册里面找 Memory and bus architecture 这一章的 Memory map,找到 TIM1 的基地址是 0x4001 2C00;然后在 Advanced-control timers 一章的 TIM1&TIM8 register map 里找到 TIMx_CCER 的偏移是 0x20。
或者写成 DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&(TIM1->CCER) 这样也行,不用查地址了。
②
参考手册里面 Timers 章节的寄存器描述,TIMx_SMCR 的描述下面有表格,写了每个定时器做从机的4个内部触发源分别来自哪个定时器。
一周热门 更多>