基于CubeMX使用stm32f1系列的内部时钟中断捕获PWM高电平

此项目需要使用两个系统内部时钟

CubeMX设置如下

 1.

2.

基于CubeMX使用stm32f1系列的内部时钟中断捕获PWM高电平_第1张图片

 3.

基于CubeMX使用stm32f1系列的内部时钟中断捕获PWM高电平_第2张图片

4.

基于CubeMX使用stm32f1系列的内部时钟中断捕获PWM高电平_第3张图片

5.

基于CubeMX使用stm32f1系列的内部时钟中断捕获PWM高电平_第4张图片

6.

基于CubeMX使用stm32f1系列的内部时钟中断捕获PWM高电平_第5张图片

7.

基于CubeMX使用stm32f1系列的内部时钟中断捕获PWM高电平_第6张图片

8.

基于CubeMX使用stm32f1系列的内部时钟中断捕获PWM高电平_第7张图片

9.

基于CubeMX使用stm32f1系列的内部时钟中断捕获PWM高电平_第8张图片

10.

基于CubeMX使用stm32f1系列的内部时钟中断捕获PWM高电平_第9张图片

然后就可以生成代码了

我使用的是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);
	}


}

结果展示

基于CubeMX使用stm32f1系列的内部时钟中断捕获PWM高电平_第10张图片

 

你可能感兴趣的:(单片机,嵌入式硬件)