stm32 - 如何在 USART1_IRQHandler 中使用 PWM 和 USART 更改 LED 的亮度?
问题描述
我正在使用 STM32F4 发现板,并且正在使用 ADC 和 USART 更改 LED 亮度和定时器周期。
我使用 DMA 获取 ADC 值,为 PWM 选择了 TIM4,为 USART 选择了 USART1。ADC、USART 和 PWM 到目前为止运行良好,但USART1_IRQHandler()
未按预期运行。
在以下实现中,如何使用 PWM 和 ADC 调整定时器周期和 LED 亮度USART1_IRQHandler()
?
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 引脚,低脉冲将打开 LED,高脉冲将其关闭。
推荐阅读
- java - 无法识别的字段 Jackson YAML Reader
- javascript - 有谁知道如何使起始编号和结束编号产生一个无序列的平方根列表?
- asp.net-core - DevOps Nu1607 NU1607:检测到版本冲突如果我没有指定 AspNetCore 版本
- java - 无法使用标签从命令行执行 maven 测试?
- python - 我是否在 Python 3 中正确/错误地使用编码将字符串转换为字节?
- codenameone - 使用 MapContainer 的 OutOfMemoryError
- python-3.x - 如何用唯一的文件名python重命名文件
- javascript - 如何验证变量实际上是一个 joi 模式?
- javascript - 大型语料库上的客户端文本搜索
- python - socket.io 仅在页面刷新时发出