我正在使用STM32F4发现板,并且正在使用ADC和USART来更改LED亮度和计时器周期。
我使用DMA来获取ADC值,为PWM选择TIM4,为USART选择USART1。 ADC,USART和PWM到目前为止运行良好,但是USART1_IRQHandler()
未能按预期运行。
在以下USART1_IRQHandler()
的实现中,如何使用PWM和ADC调整定时器周期和LED亮度?
void USART1_IRQHandler()
{
if (USART_GetITStatus(USART1, USART_IT_RXNE) )
{
delay(168000);
i = USART_ReceiveData(USART1);
if(i == '1'){
TIMOC_InitStruct.TIM_Pulse=pwm_value;
TIM_OC1Init(TIM4,&TIMOC_InitStruct);
TIM_OC1PreloadConfig(TIM4,TIM_OCPreload_Enable);
UARTSend("3 led aktif\r\n",sizeof("LED 4 ON\r\n"));
}
else if(i == '2')
{
TIMOC_InitStruct.TIM_Pulse=pwm_value;
TIM_OC1Init(TIM4,&TIMOC_InitStruct);
TIM_OC1PreloadConfig(TIM4,TIM_OCPreload_Enable);
TIMOC_InitStruct.TIM_Pulse=pwm_value;
TIM_OC2Init(TIM4,&TIMOC_InitStruct);
TIM_OC2PreloadConfig(TIM4,TIM_OCPreload_Enable);
UARTSend("2 led aktif\r\n",sizeof("LED 4 ON\r\n"));
}
else if(i == '4')
{
TIMOC_InitStruct.TIM_Pulse=pwm_value;
TIM_OC1Init(TIM4,&TIMOC_InitStruct);
TIM_OC1PreloadConfig(TIM4,TIM_OCPreload_Enable);
TIMOC_InitStruct.TIM_Pulse=pwm_value;
TIM_OC2Init(TIM4,&TIMOC_InitStruct);
TIM_OC2PreloadConfig(TIM4,TIM_OCPreload_Enable);
TIMOC_InitStruct.TIM_Pulse=pwm_value;
TIM_OC3Init(TIM4,&TIMOC_InitStruct);
TIM_OC3PreloadConfig(TIM4,TIM_OCPreload_Enable);
UARTSend("4 led aktif\r\n",sizeof("LED 4 ON\r\n"));
}
else if(i == '4')
{
TIMOC_InitStruct.TIM_Pulse=pwm_value;
TIM_OC1Init(TIM4,&TIMOC_InitStruct);
TIM_OC1PreloadConfig(TIM4,TIM_OCPreload_Enable);
TIMOC_InitStruct.TIM_Pulse=pwm_value;
TIM_OC2Init(TIM4,&TIMOC_InitStruct);
TIM_OC2PreloadConfig(TIM4,TIM_OCPreload_Enable);
TIMOC_InitStruct.TIM_Pulse=pwm_value;
TIM_OC3Init(TIM4,&TIMOC_InitStruct);
TIM_OC3PreloadConfig(TIM4,TIM_OCPreload_Enable);
TIMOC_InitStruct.TIM_Pulse=pwm_value;
TIM_OC4Init(TIM4,&TIMOC_InitStruct);
TIM_OC4PreloadConfig(TIM4,TIM_OCPreload_Enable);
UARTSend("4 led aktif\r\n",sizeof("LED 4 ON\r\n"));
}
else
{
Hello();
UARTSend("Please enter another number:\n",sizeof("Please enter another number:\n"));
}
} USART_ClearITPendingBit(USART1,USART_IT_RXNE);
}
关于您的USART1_IRQHandler,您是否检查中断是否处于活动状态
__HAL_RCC_UART4_CLK_ENABLE();
HAL_NVIC_SetPriority(USART1_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(USART1_IRQn);
并且如果您通过此调用启用它
UART_Receive_IT( &huart1 );
我正在使用STM32Cube,存储库V1.25.0。
现在,关于USART1_IRQHandler()中的代码,您可以使用快捷方式来处理您想做的事情。据我了解,您有4个LED可通过Timer4和4个通道进行控制。
脉冲是输出比较值(通道1的TIM4-> CCR1)。因此,我将使用等于“周期”(或零)的脉冲来启动计时器。请参见下面的注释。
从那以后,如果要更改亮度,只需使用]更改脉冲宽度>
__HAL_TIM_SET_COMPARE( htim4, TIM_CHANNEL_1, pwm_value);
或带有
TIM4->CCR1 = pwm_value;
您也可以使用]禁用任何频道>
__HAL_TIM_DISABLE_IT( htim4, TIM_CHANNEL_1); __HAL_TIM_ENABLE_IT( htim4, TIM_CHANNEL_1);
所以,你得到类似的东西
if(i == '1'){ TIM4->CCR1 = pwm_value; } else if(i == '2') { TIM4->CCR1 = pwm_value; TIM4->CCR2 = pwm_value; } ...
注意:我不知道您的LED如何连接。如果将led连接到Vcc,将另一端连接到MPU引脚,则LOW脉冲将打开led,而High脉冲将其关闭。