有谁知道如何使用一个定时器去启动另外一个定时器吗?
比如使用TIM8去启动TIM1。
我按照参考手册上说的去操作,没有成功,TIM1没有被开启
下面是参考手册上的节选
使用一个定时器启动另一个定时器
本例中使用定时器 1 的更新事件使能定时器 2。相关连接图,请参见图 159。只要定时器 1 生成更新事件,定时器 2 便根据分频后的内部时钟从当前值(可以不为 0)开始计数。定时 器 2 收到触发信号时,其 CEN 位自动置 1,并且计数器开始计数,直到向 TIM2_CR1 寄存 器的 CEN 位写入“0”后停止计数。两个计数器的时钟频率都基于 CK_INT 通过预分频器执 行 3 分频 (fCK_CNT = fCK_INT/3)。
● 将定时器 1 配置为主模式,发送其更新事件 (UEV) 作为触发输出(TIM1_CR2 寄存器
中的 MMS=010)。
● 配置定时器 1 的周期(TIM1_ARR 寄存器)。
● 配置定时器 2 以接收来自定时器 1 的输入触发(TIM2_SMCR 寄存器中的 TS=000)。
● 将定时器 2 配置为触发模式(TIM2_SMCR 寄存器中的 SMS=110)。
● 通过向 CEN 位(TIM1_CR1 寄存器)写入“1”启动定时器 1。
下面是我的程序;;
[mw_shl_code=c,true]
void PulseGeneratorsPeremetersSet(u16 uwOnTimeUs, u16 uwOffTimeUs)
{
u32 unArr;
u16 uwCcr1, uwCcr2, uwCcr3, uwCcr4;
uwCcr1 = 4; //2us
uwCcr4 = uwOffTimeUs + uwOnTimeUs; //middle
unArr = uwCcr4 * 2;
uwCcr2 = uwOnTimeUs * 2; //spark
uwCcr3 = (uwOffTimeUs + uwOnTimeUs - 1) * 2; //1us ahead
RCC ->APB2ENR |= 3 << 0; //使能TIM1 TIM8时钟
RCC ->AHB1ENR |= 1 << 2; //使能PortC时钟
RCC ->AHB1ENR |= 1 << 6; //使能PortE时钟
GPIO_Set(GPIOC, PIN6 | PIN7 | PIN8 | PIN9, GPIO_MODE_AF, GPIO_OTYPE_PP, GPIO_SPEED_100M, GPIO_PUPD_PU); //复用, 输出,上拉
GPIO_Set(GPIOE, PIN9 | PIN11 | PIN13 | PIN14, GPIO_MODE_AF, GPIO_OTYPE_PP, GPIO_SPEED_100M, GPIO_PUPD_PU); //复用, 输出,上拉
//PC6、7、8、9复用为TIM8的CH1、2、3、4
GPIO_AF_Set(GPIOC, 6, 3);
GPIO_AF_Set(GPIOC, 7, 3);
GPIO_AF_Set(GPIOC, 8, 3);
GPIO_AF_Set(GPIOC, 9, 3);
//PE9、11、13、14复用为TIM1的CH1、2、3、4
GPIO_AF_Set(GPIOE, 9, 1);
GPIO_AF_Set(GPIOE, 11, 1);
GPIO_AF_Set(GPIOE, 13, 1);
GPIO_AF_Set(GPIOE, 14, 1);
TIM1 ->ARR = unArr; //自动装填值,该值与分频数决定PWM的周期长度(从而也确定频率)
TIM8 ->ARR = unArr; //自动装填值,该值与分频数决定PWM的周期长度(从而也确定频率)
TIM1 ->
SC = 84 - 1; //分频器。经过unPsc个TIM1的周期后,TIM1的CNT计数器加1,CNT的数值达到unArr后,产生中断或者事件,然后从0开始计数 每个CNT为0.5us
TIM8 ->
SC = 84 - 1; //分频器。经过unPsc个TIM8的周期后,TIM8的CNT计数器加1,CNT的数值达到unArr后,产生中断或者事件,然后从0开始计数 每个CNT为0.5us
TIM1 ->CCMR1 |= 6 << 4; //CH1 PWM模式1 先有效电平后无效电平 有效电平、无效电平是高还是低,由CCER的CCxP位决定
TIM1 ->CCMR1 |= 6 << 12; //CH2 PWM模式1 先有效电平后无效电平 有效电平、无效电平是高还是低,由CCER的CCxP位决定
TIM1 ->CCMR2 |= 6 << 4; //CH3 PWM模式1 先有效电平后无效电平 有效电平、无效电平是高还是低,由CCER的CCxP位决定
TIM1 ->CCMR2 |= 6 << 12; //CH4 PWM模式1 先有效电平后无效电平 有效电平、无效电平是高还是低,由CCER的CCxP位决定
TIM8 ->CCMR1 |= 6 << 4; //CH1 PWM模式1 先有效电平后无效电平 有效电平、无效电平是高还是低,由CCER的CCxP位决定
TIM8 ->CCMR1 |= 6 << 12; //CH2 PWM模式1 先有效电平后无效电平 有效电平、无效电平是高还是低,由CCER的CCxP位决定
TIM8 ->CCMR2 |= 6 << 4; //CH3 PWM模式1 先有效电平后无效电平 有效电平、无效电平是高还是低,由CCER的CCxP位决定
TIM8 ->CCMR2 |= 6 << 12; //CH4 PWM模式1 先有效电平后无效电平 有效电平、无效电平是高还是低,由CCER的CCxP位决定
TIM1 ->CCMR1 |= 1 << 3; //CH1 预装载使能
TIM1 ->CCMR1 |= 1 << 11; //CH2 预装载使能
TIM1 ->CCMR2 |= 1 << 3; //CH3 预装载使能
TIM1 ->CCMR2 |= 1 << 11; //CH4 预装载使能
TIM8 ->CCMR1 |= 1 << 3; //CH1 预装载使能
TIM8 ->CCMR1 |= 1 << 11; //CH2 预装载使能
TIM8 ->CCMR2 |= 1 << 3; //CH3 预装载使能
TIM8 ->CCMR2 |= 1 << 11; //CH4 预装载使能
TIM1 ->CCER |= 1 << 0; //OC1输出使能
TIM1 ->CCER |= 1 << 4; //OC2输出使能
TIM1 ->CCER |= 1 << 8; //OC3输出使能
TIM1 ->CCER |= 1 << 12; //OC4输出使能
TIM8 ->CCER |= 1 << 0; //OC1输出使能
TIM8 ->CCER |= 1 << 4; //OC2输出使能
TIM8 ->CCER |= 1 << 8; //OC3输出使能
TIM8 ->CCER |= 1 << 12; //OC4输出使能
TIM1 ->CCER &= ~(1 << 1); //OC1高电平有效
TIM1 ->CCER &= ~(1 << 5); //OC2高电平有效
TIM1 ->CCER |= 1 << 9; //OC3低电平有效
TIM1 ->CCER &= ~(1 << 13); //OC4高电平有效
TIM8 ->CCER &= ~(1 << 1); //OC1高电平有效
TIM8 ->CCER &= ~(1 << 5); //OC2高电平有效
TIM8 ->CCER |= 1 << 9; //OC3低电平有效
TIM8 ->CCER &= ~(1 << 13); //OC4高电平有效
//设置捕获值
TIM1 ->CCR1 = uwCcr1;
TIM1 ->CCR2 = uwCcr2;
TIM1 ->CCR3 = uwCcr3;
TIM1 ->CCR4 = uwCcr4;
//设置捕获值
TIM8 ->CCR1 = uwCcr1;
TIM8 ->CCR2 = uwCcr2;
TIM8 ->CCR3 = uwCcr3;
TIM8 ->CCR4 = uwCcr4;
TIM1 ->CR1 |= 1 << 7; //ARR寄存器缓冲
TIM1 ->BDTR |= 1 << 15; //MOE = 1
TIM8 ->CR1 |= 1 << 7; //ARR寄存器缓冲
TIM8 ->BDTR |= 1 << 15; //MOE = 1
TIM8 ->SMCR |= 1 << 7; //主模式
//设定更新输出
TIM8 ->CR2 &= ~(7 < 4);
TIM8 ->CR2 |= 2 << 4;
TIM1 ->SMCR &= ~(7 << 4); //TRG0触发,注意TS的更改要先于SMS
//触发模式
TIM1 ->SMCR &= ~(7 << 0);
TIM1 ->SMCR |= 7 << 0;
TIM8 ->CNT = 0;
TIM1 ->CNT = uwOffTimeUs + uwOnTimeUs;
}
//成功返回0
u8 PulseOutputStart(void)
{
TIM8 ->CR1 |= 1 << 0; //使能定时器8,输出pulse1
return 0;
}[/mw_shl_code]
一周热门 更多>