
//============================================================================== // TIMER16用于频率检测 //============================================================================== void STM32G0_TIM16_INPUT_Init(void) { LL_TIM_InitTypeDef TIM_InitStruct = {0}; LL_TIM_IC_InitTypeDef TIM_IC_InitStruct = {0}; LL_APB2_GRP1_EnableClock (LL_APB2_GRP1_PERIPH_TIM16); //TIM16基本配置------------- TIM_InitStruct.Prescaler = 6400 - 1;//分频后的时钟为:64000000/6400=10KHZ=0.1mS TIM_InitStruct.CounterMode = LL_TIM_COUNTERMODE_UP; TIM_InitStruct.Autoreload = 0xFFFF; TIM_InitStruct.ClockDivision = LL_TIM_CLOCKDIVISION_DIV1; TIM_InitStruct.RepetitionCounter = 0; LL_TIM_Init (TIM16, &TIM_InitStruct); //TIM16输入配置------------ LL_TIM_SetRemap (TIM16, LL_TIM_TIM16_TI1_RMP_GPIO);//输入选择=GPIO(TIM16_CH1) TIM_IC_InitStruct.ICActiveInput = LL_TIM_ACTIVEINPUT_DIRECTTI;//输入 TIM_IC_InitStruct.ICFilter = LL_TIM_IC_FILTER_FDIV1;//滤波 TIM_IC_InitStruct.ICPolarity = LL_TIM_IC_POLARITY_FALLING;//下降沿 TIM_IC_InitStruct.ICPrescaler = LL_TIM_ICPSC_DIV1;//分频 LL_TIM_IC_Init (TIM16, LL_TIM_CHANNEL_CH1, &TIM_IC_InitStruct); LL_TIM_CC_EnableChannel (TIM16, LL_TIM_CHANNEL_CH1); //使能TIM16_CH1 LL_TIM_EnableCounter (TIM16); //使能定时器计数 } //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
基于STM32U575的RFID信息审查系统?
STM32CubeProgrammer 安装错误,请帮忙解决,谢谢
STM32CubeMX 配置STM32G070RBT6TR时无法使能PVD中断
STM32G070RBT6TR STM32CubeMX ADC配置后使用的是内部参考电压且零点的读数太大了
测评在哪里发?
Group Study vs. Solo Study: What Works Best?
STM32G070CBT6使用硬件SPI无法读出W25Q128的ID
STM32G0B0CET6的usb的时钟只能用48MHz的晶振来实现吗?
STM32G070RET6,中断优先级配置没有效果
如图:STM32F437的TIM10支持从模式吗?
谢谢大佬关注!您说的原理是正确的。但我的问题现在仍没找到原因。初始化程序是用STM32 CUBE MX生存的。
// TIMER16_CH1捕获中断
void TIM16_IRQHandler(void)
{
#define FLOW_BUFF_SIZE 64//可以修改!
//---------------------------
su8 FLOW_BUFF_counter = 0;
su16 FLOW_Buff[FLOW_BUFF_SIZE] = {0};
u32 sum = 0;
u8 j = 0;
if(LL_TIM_IsActiveFlag_CC1OVR(TIM16) == 0)
{
return;
}
LL_TIM_ClearFlag_CC1OVR(TIM16);
if(FLOW_BUFF_counter < FLOW_BUFF_SIZE)
{
FLOW_BUFF_counter++;
}
else
{
FLOW_BUFF_counter = 0;
}
FLOW_Buff[FLOW_BUFF_counter] = LL_TIM_IC_GetCaptureCH1(TIM16);
}
FLOW_Buff数组中的数是不规则的。输入是20KHZ的方波。麻烦大佬帮我再仔细看看。感谢!
谢谢大家的关注!问题解决了。原因是:定时器关闭了自动重载(不知道能不能开启自动重载,在发生捕获后,计数器会不会又从重载值开始计数),所以定时器就无限循环计数下去。当发生捕获时,仅当计数器的值保存在CCR1中。所以要计算频率就得读取两次捕获,计算差值,才是信号的周期值。另外,当捕获频率较低的信号时,一定要计算好定时器的预分频值。这样可以防止在一个计数周期内没有捕获,而在下一个周期才发生了捕获。当然捕获的值就没有规律可言了。谢谢大家关注!
捕获,尤其是连续捕获,很容易跨越一个周期的。但是只要时间差在一个周期内,很容易的。计数器的值设置为上限,直接减就可以了。 跨多周期就麻烦一点,每次计数上限都要中断额外计数,相当于整数部分。