友友们谁知道单独改ccr的值灯会变亮变暗,调用TIM_SetCompare1函数后,灯不会亮了
不知道你这个问题是否已经解决, 如果还没有解决的话:
- 以下回答来自chatgpt: 回答: 在呼吸灯实验中,我们需要使用定时器来控制LED的亮度变化,利用TIM_SetCompare1函数来调整ccr值,以实现控制LED的占空比,从而控制LED的亮度。我们在使用TIM_SetCompare1函数调整ccr值时,可能会遇到ccr值没有更新的情况,导致LED的亮度无法实现呼吸灯效果的问题。 这可能是因为定时器中断没有开启,导致ccr值没有更新。因此,我们需要在代码中开启定时器中断,并且在定时器中断服务函数中更新ccr值,以保证ccr值的实时更新。 具体步骤如下: 1. 开启定时器中断 在定时器初始化函数中,需要开启定时器中断,以触发定时器中断服务函数的执行。例如,在TIM2初始化函数中,可以添加以下代码开启定时器中断: ```c NVIC_InitTypeDef NVIC_InitStruct; NVIC_InitStruct.NVIC_IRQChannel = TIM2_IRQn; NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0; NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStruct); ``` 2. 在定时器中断服务函数中更新ccr值 在定时器中断服务函数TIM2_IRQHandler()中,需要根据不同的需求,更新ccr值。例如,在实现呼吸灯效果时,可以通过以下代码实现: ```c void TIM2_IRQHandler(void) { if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) { static uint16_t step = 1; if (ccr2 >= 999) { step = -1; } else if (ccr2 <= 1) { step = 1; } ccr2 += step; TIM_SetCompare2(TIM2, ccr2); TIM_ClearITPendingBit(TIM2, TIM_IT_Update); } } ``` 在该代码中,每当定时器溢出时,ccr2的值会向上或向下调整,从而实现LED的呼吸灯效果。 这样,通过开启定时器中断,并在定时器中断服务函数中更新ccr值,就能够解决ccr值没有更新的问题,从而实现呼吸灯效果。
如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^