Timer 如何修复代码,使STM32 Nucleo板上的LED闪烁与1秒50%占空比PWM同步?
我的董事会是 我将TIM4、CH2配置为PWM,这样TIM4输出应为HI半秒,LO半秒。以下是block.ioc时钟和引脚配置 我自动生成了代码,并尝试添加我自己的代码,用PWM的H/L切换LED。我想做的是:Timer 如何修复代码,使STM32 Nucleo板上的LED闪烁与1秒50%占空比PWM同步?,timer,stm32,hal,pwm,stm32cubeide,Timer,Stm32,Hal,Pwm,Stm32cubeide,我的董事会是 我将TIM4、CH2配置为PWM,这样TIM4输出应为HI半秒,LO半秒。以下是block.ioc时钟和引脚配置 我自动生成了代码,并尝试添加我自己的代码,用PWM的H/L切换LED。我想做的是: if(定时器4==高)发光二极管状态=!LED_状态 以下是实际代码: HAL_Init(); /* USER CODE BEGIN Init */ /* USER CODE END Init */ /* Configure the system clock */
if(定时器4==高)发光二极管状态=!LED_状态
以下是实际代码:
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_ETH_Init();
MX_USART3_UART_Init();
MX_USB_OTG_FS_PCD_Init();
MX_DAC1_Init();
MX_TIM3_Init();
MX_TIM4_Init();
/* USER CODE BEGIN 2 */
HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_2);
uint16_t timer_init_val = __HAL_TIM_GET_COUNTER(&htim4);
uint16_t timer_poll;
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
timer_poll = __HAL_TIM_GET_COUNTER(&htim4);
if(timer_poll - timer_init_val >= 500) {
HAL_GPIO_TogglePin(GPIOB,LD1_Pin);
}
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
我知道这很可能行不通。事实上我很困惑,因为将>=500替换为您所写的内容会执行以下操作:
if (((timer_poll - timer_init_val) % 1000) < 500)
{
HAL_GPIO_WritePin(GPIOB, LD1_Pin, 0);
}
else
{
HAL_GPIO_WritePin(GPIOB, LD1_Pin, 1);
}
if((计时器轮询-计时器初始化值)%1000)<500)
{
HAL_GPIO_WritePin(GPIOB,LD1_引脚,0);
}
其他的
{
HAL_GPIO_WritePin(GPIOB,LD1_引脚,1);
}
但当计时器结束时,这仍然不是完全干净的。要进行排序,您可以将计时器的周期调整为序列周期的倍数。这确实有效!但我不明白的是为什么我必须使用这个模和减法。我不是在block.ioc中设置了它吗?这样定时器4在50%占空比、1秒周期PWM?的情况下是高还是低。这样我就可以在定时器4高时写入LED状态1?你根本不用PWM!PWM是一种硬件输出,直接从定时器输出到交替功能模式下的引脚。您在软件中读取计时器,然后在GPIO模式下从软件输出到引脚。这对于LED这样的计时不需要纳秒精度的东西来说是绝对好的。它的优点是,您可以使用任何引脚,而不仅仅是具有正确替代功能的引脚。