基于CubeMX使用stm32f1系列的内部时钟中断捕获PWM高电平
此项目需要使用两个系统内部时钟
CubeMX设置如下
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
然后就可以生成代码了
我使用的是Jlink RTT作为调试,因为主要做的是PWM高电平读取ADC值,具体步骤就不详细写明
在main函数外定义一个全局变量,来接收ADC的返回值
//adc值
uint16_t ADC_Value = 0;
//开启PWM输出方波
HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_2);
//建议在使能中断前先清除中断标志位,因为是第一次开启也可以不清
__HAL_TIM_CLEAR_IT(htim, TIM_IT_UPDATE);
//使能定时器1中断
HAL_TIM_Base_Start_IT(&htim1);
中断回调函数代码
//定时器溢出中断回调函数
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
//判断中断源
if(htim->Instance == htim1.Instance)
{
//PWM触发中断
//清除标志位
__HAL_TIM_CLEAR_IT(&htim2, TIM_IT_UPDATE);
//使能定时器 2中断
HAL_TIM_Base_Start_IT(&htim2);
}
else if(htim->Instance == htim2.Instance)
{
//定时器 2触发中断
//启动ADC进行检测
HAL_ADC_Start(&hadc1);
//判断检测是否成功
if(HAL_OK == HAL_ADC_PollForConversion(&hadc1 , 10))
{
//接收ADC的值
ADC_Value = HAL_ADC_GetValue(&hadc1);
}
//结束一次ADC检测
HAL_ADC_Stop(&hadc1);
//使用JLink RTT输出ADC的值
SEGGER_RTT_printf(0,"ADC = %d!!!\n",ADC_Value);
//停止定时器 2使能
HAL_TIM_Base_Stop_IT(&htim2);
}
}
结果展示