⏩ 大家好哇!我是小光,嵌入式爱好者,一个想要成为系统架构师的大三学生。
⏩最近在开发一个STM32H723ZGT6的板子,使用STM32CUBEMX做了很多驱动,包括ADC、UART、RS485、EEPROM(IIC)、FLASH(SPI)等等。
⏩本篇文章对STM32CUBEMX配置STM32CUBEMX配置 定时器中断 和 上升沿中断以实现检测1s以内的脉冲个数做一个详细的教程。
⏩感谢你的阅读,不对的地方欢迎指正。
脉冲捕获
MX配置上升沿检测
我这里配置PA3为GPIO中断模式
配置PA3为上升沿中断,下拉
配置中断优先级
MX配置定时器中断
1.定时器配置
我们板子的时钟是550MHZ,分给TIM2的时钟是275MHZ,所以我配的PSC是27500-1,ARR=10000-1.
定时的时间T=2750010000/(550 10^6)=1s,也就是1s中断一次
2.中断配置
中断优先级配置
驱动编写
上升沿中断
加在main.c和it.c都行
c
unsigned int Nums_Rising = 0;//脉冲个数
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if(GPIO_Pin == GPIO_PIN_3)
{
// GPIO_PinState pinState = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_3);
Nums_Rising++;
__HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin);
}
}
定时器中断
main.c添加
c
extern unsigned int Nums_Rising;//1s内脉冲个数
/******************************************************************************
* @ 函数名 : HAL_TIM_PeriodElapsedCallback
* @ 功 能 : 定时器超时中断回调函数
* @ 参 数 : htim 定时器名
* @ 返回值 : 无
******************************************************************************/
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
static unsigned int i = -1,nums_pulse[10],counts = 0;
static double sums = 0.0;
double aver_pulse = 0.0;
if(htim->Instance == TIM2)
{
if(counts < 10)counts++;
else sums -= nums_pulse[i];
sums += Nums_Rising;
nums_pulse[i] = Nums_Rising;
aver_pulse = sums / (counts * 1.0);
printf("Counts_Rate = %.2f Hz\r\n",aver_pulse);//打印脉冲个数
HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_10); //对PB5进行翻转
Nums_Rising = 0;
i = (i + 1) % 10;
}
}
顺便还实现了一个滑动窗口滤波。
最后能测量脉冲的范围是0.1hz~4Mhz,在这个范围误差小于1%。