🌼本篇利用上面两篇示例综合,利用
STM32F103VET6引脚PB1测量STM32G070RBT6引脚上的PA8引脚上产生的PWM频率。
STM32F103VET6重写EXTI回调函数代码PB1作为EXTI中断输入口。

static uint16_t cnt = 0;
//重写回调函数
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
/*判断是中断引脚*/
if(GPIO_Pin == GPIO_PIN_1)
{
cnt++;
}
if(GPIO_Pin == GPIO_PIN_7)
{
HAL_GPIO_TogglePin(GPIOE, GPIO_PIN_5);//状态翻转
printf("PE7 KEYPRESS \n");
}
if(GPIO_Pin == GPIO_PIN_8)
{
HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_5);//状态翻转
printf("PE8 KEYPRESS \n");
}
}
EXTI中断接收的数据进行滤波处理。
- 定时时间=(Prescaler +1)* (Counter Period +1)/ 频率
- 这里定时时间是
0.1s

//TIM1中断回调函数
uint32_t pwm_sum =0;
uint32_t pwm_avg =0;
uint32_t pwm_final =0;
void HAL_TIM_PeriodElapsedCallback (TIM_HandleTypeDef *htim)//回调函数
{
if(htim->Instance == TIM1)//判断进入回调函数方式
{
pwm_sum += cnt*10 ;//累加
pwm_sum -= pwm_avg;//减去上次的平均值
pwm_avg = pwm_sum *1.0/5;//更新pwm平均值,5根据实际误差自行调整
pwm_final = pwm_avg;//当前PWM的频率
cnt =0;
}
}
这里需要说明的是以上代码涉及到滤波算法,不采用滤波算法代码如下:
void HAL_TIM_PeriodElapsedCallback (TIM_HandleTypeDef *htim)//回调函数
{
if(htim->Instance == TIM1)//判断进入回调函数方式
{
cnt ++;
}
}
while循环在只放置打印函数while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
HAL_Delay(1000);
printf("PWM frequency= %u Hz \n",pwm_final);
}
while循环放如下代码:while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
cnt =0;
HAL_Delay(1000);
printf("PWM frequency= %u Hz \n",cnt);
}
STM32G070RBT6PWM频率输出参数设置 htim1.Instance = TIM1;
htim1.Init.Prescaler = 63;
htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
htim1.Init.Period = 80 -1;//500 -> 2KHz, 1000 -> 1KHz,100 ->10KHz,80 ->12.5KHz
htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim1.Init.RepetitionCounter = 0;
当
htim1.Init.Period = 50 -1;小于60时,需要调整main.c主循环while中的__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1,25);//设置PWM占空比






链接:https://pan.baidu.com/s/1Pq9X8zCguQM2dzNscgmUGw
提取码:qfbq