蓝桥杯嵌入式——定时器PWM模式实现呼吸灯
通道3设置为PWM 分配系数为79 重装载值为1000-1。Pulse占空比设置为500(NVIC记得勾上)将PC8设置为定时器3通道3。
·
一、引脚配置

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


所有评论(0)