一、引脚配置

将PC8设置为定时器3通道3

通道3设置为PWM 分配系数为79 重装载值为1000-1

Pulse占空比设置为500(NVIC记得勾上)

二、详细代码

#include "main.h"
#include "tim.h"
#include "gpio.h"
/* USER CODE BEGIN PM */
uint16_t a;
uint16_t crr_cnt=0;
uint8_t flag=0;
/* USER CODE END PM */


void SystemClock_Config(void);

int main(void)
{
 
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_TIM3_Init();

	//开启定时器3的PWM模式 有中断
	HAL_TIM_PWM_Start_IT(&htim3,TIM_CHANNEL_3);
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */

  }
  /* USER CODE END 3 */
}

void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

  /** Configure the main internal regulator output voltage
  */
  HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1);
  /** Initializes the RCC Oscillators according to the specified parameters
  * in the RCC_OscInitTypeDef structure.
  */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLM = RCC_PLLM_DIV3;
  RCC_OscInitStruct.PLL.PLLN = 20;
  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
  RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2;
  RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }
  /** Initializes the CPU, AHB and APB buses clocks
  */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
  {
    Error_Handler();
  }
}

/* USER CODE BEGIN 4 */
void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim)
{
	/*函数里面加了static的变量是静态变量,不会因为函数的返回而消失,会驻留在内存里;
	在函数里,不加static是动态变量,函数一旦退出就消失,下次再进函数就重新被定义,一切重新开始。*/
//	static uint16_t crr_cnt=0;
//	static uint8_t flag=0;
	
	//ARR值1000 CCR值500 这样子占空比为50%
	//当标志位为0时
	if(flag == 0)
	{
		//占空比值每次加1
		crr_cnt+=1;
//		__HAL_TIM_SetCompare(&htim3,TIM_CHANNEL_3,crr_cnt);(修改占空比函数 也可以直接操作寄存器)
		//将值装入定时器3的CCR寄存器中
		TIM3 ->CCR3=crr_cnt;
		//当这个值满了 ARR为1000
		if(crr_cnt>=1000)
		{
			//标志位置1
			flag = 1;
			crr_cnt =999;
		}	
	}
	
	//当标志位为1时
	if(flag == 1)
	{
		//占空比值每次减1
		crr_cnt-=1;
//		__HAL_TIM_SetCompare(&htim3,TIM_CHANNEL_3,crr_cnt);
		//将值装入定时器3的CCR寄存器中
		TIM3 ->CCR3=crr_cnt;
		//当它达到500 CCR寄存器的值设置为500
		if(crr_cnt <=500)
		{
			//标志位清零 
			flag=0;
		}		
	}
	
	
}
/* USER CODE END 4 */


Logo

openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。

更多推荐