我正在使用STM32F4发现板,我正在使用ADC和USART更改LED亮度和定时器周期。
我使用DMA获取ADC值,选择TIM4用于PWM,选择USART1用于USART。到目前为止,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 aktifrn",sizeof("LED 4 ONrn"));
}
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 aktifrn",sizeof("LED 4 ONrn"));
}
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 aktifrn",sizeof("LED 4 ONrn"));
}
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 aktifrn",sizeof("LED 4 ONrn"));
}
else
{
Hello();
UARTSend("Please enter another number:n",sizeof("Please enter another number:n"));
}
} USART_ClearITPendingBit(USART1,USART_IT_RXNE);
}
关于您的USART1_IRQ处理器,您是否使用检查中断是否处于活动状态
__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脉冲将关闭它。