[STM32F4] stm32定时器的异或模式是怎么用的?

[复制链接]
60|5
地瓜patch 发表于 2026-1-29 09:35 来自手机 | 显示全部楼层 |阅读模式
本帖最后由 地瓜patch 于 2026-1-29 09:40 编辑

我要测量霍尔传感器每次状态变化之间的时间周期,将定时器 3 配置为异或模式,让霍尔状态发生任何变化时都能触发中断。我编写了周期测量的代码,但最终测得的周期数据并不准确。
50852697aba4769e26.png

以下是测量的代码:
void TIM3_IRQHandler(void)


{


/* USER CODE BEGIN TIM3_IRQn 0 */





/* USER CODE END TIM3_IRQn 0 */


/* USER CODE BEGIN TIM3_IRQn 1 */





if (0U == LL_TIM_IsActiveFlag_UPDATE(TIM3))


{


}


else


{


uint8_t ResetHall=((uint8_t)


((LL_GPIO_IsInputPinSet( HALL_3_GPIO_Port, HALL_3_Pin ) << 2)


|(LL_GPIO_IsInputPinSet( HALL_2_GPIO_Port, HALL_2_Pin ) << 1)


| LL_GPIO_IsInputPinSet( HALL_1_GPIO_Port, HALL_1_Pin ) ));


LL_TIM_ClearFlag_UPDATE(TIM3);


reset_hall(resetHall);


OverFlowCounter +=1;


}


if (LL_TIM_IsActiveFlag_CC1 (TIM3)!=0U)


{


uint8_t updateHall=((uint8_t)


((LL_GPIO_IsInputPinSet( HALL_3_GPIO_Port, HALL_3_Pin ) << 2)


|(LL_GPIO_IsInputPinSet( HALL_2_GPIO_Port, HALL_2_Pin ) << 1)


| LL_GPIO_IsInputPinSet( HALL_1_GPIO_Port, HALL_1_Pin ) ));


update_hall(updateHall);





LL_TIM_ClearFlag_CC1(TIM3);


if (startCapture==0)


{


PastValue=LL_TIM_IC_GetCaptureCH1(TIM3);


startCapture=1;


}


else if(startCapture==1)


{





currentValue=LL_TIM_IC_GetCaptureCH1(TIM3);


if (currentValue>PastValue)


{


temp1=(currentValue-PastValue);


}


else if (currentValue<PastValue){


temp1=(0xFFFF-PastValue)+currentValue;


// temp1=PastValue-currentValue;


}





float ref_clock=(timerFrequency/(timerPrescaler));


temp2=ref_clock/temp1;





periodBuffer[bufferIndex] = temp2;


bufferIndex = (bufferIndex + 1) % NUM_SAMPLES;


float periodAverage = 0;


for (uint8_t i = 0; i < NUM_SAMPLES; i++) {


periodAverage += periodBuffer;}





periodAverage /=NUM_SAMPLES;


temp3= 1/periodAverage;





startCapture=0;


}


}


else


{


//Nothing to do


}


/* USER CODE END TIM3_IRQn 1 */


}




zhuotuzi 发表于 2026-2-1 15:07 | 显示全部楼层
这个模式主要用于定时器输出比较通道的波形生成,是个很实用的高级功能。
xinxianshi 发表于 2026-2-3 11:52 | 显示全部楼层
STM32 定时器的输出比较异或模式(Toggle) ,也常被称为 “翻转模式”
heisexingqisi 发表于 2026-2-6 15:30 | 显示全部楼层
STM32 定时器的输出比较(OC)异或模式(也常叫 “翻转模式”),本质是:当定时器的计数值(CNT)与输出比较寄存器(CCRx)的值匹配时,硬件自动将对应输出引脚(如 TIMx_CHx)的电平翻转(高→低、低→高),无需 CPU 干预,属于纯硬件操作,效率极高。

评论

原来这样,挺好用的  发表于 2026-2-11 23:11
xinpian101 发表于 2026-2-11 17:40 | 显示全部楼层
这个模式主要用于定时器输出比较通道的电平翻转控制,是实现 PWM 翻转、信号生成的常用技巧。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:出一块TI-PLABS-AMP-EVM

2704

主题

17325

帖子

30

粉丝
快速回复 在线客服 返回列表 返回顶部
0