利用PWM的调节功能可以实现LED的呼吸灯效果,为调整呼吸灯的快慢,可为其配置一个时间很短的延时函数。
该延时函数的内容为:
- void Delay(void)
- {
- volatile uint32_t delay = 0x2ffff;
- while(delay--);
- }
为进行PWM调节,其初始化函数为:
- void TMR_Config(void)
- {
- RCM_EnableAPB1PeriphClock(RCM_APB1_PERIPH_TMR5);
- tmrBaseConfig.countMode = TMR_COUNTER_MODE_UP;
- tmrBaseConfig.clockDivision = TMR_CLOCK_DIV_1;
- tmrBaseConfig.period = 999;
- tmrBaseConfig.division = 119;
- tmrBaseConfig.repetitionCounter = 0;
- TMR_ConfigTimeBase(TMR5, &tmrBaseConfig);
- tmrOCConfig.mode = TMR_OC_MODE_PWM1;
- tmrOCConfig.outputState = TMR_OC_STATE_ENABLE;
- tmrOCConfig.outputNState = TMR_OC_NSTATE_DISABLE;
- tmrOCConfig.polarity = TMR_OC_POLARITY_HIGH;
- tmrOCConfig.nPolarity = TMR_OC_NPOLARITY_HIGH;
- tmrOCConfig.idleState = TMR_OC_IDLE_STATE_RESET;
- tmrOCConfig.nIdleState = TMR_OC_NIDLE_STATE_RESET;
- tmrOCConfig.pulse = 0;
- TMR_ConfigOC2(TMR5, &tmrOCConfig);
- TMR_EnablePWMOutputs(TMR5);
- TMR_Enable(TMR5);
- }
对PWM输出引脚的配置函数为:
- void TMR_GPIO_Config(void)
- {
- GPIO_Config_T gpioConfig;
- RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_GPIOA);
- gpioConfig.speed = GPIO_SPEED_50MHz;
- gpioConfig.mode = GPIO_MODE_AF_PP;
- gpioConfig.pin = GPIO_PIN_1;
- GPIO_Config(GPIOA, &gpioConfig);
- }
经前面几个函数的配合,实现呼吸灯效果的主程序为:
- int main(void)
- {
- uint8_t f=0;
- BOARD_LED_Config(LED2);
- TMR_GPIO_Config();
- TMR_Config();
- while (1)
- {
- if(f==0)
- {
- t=t+1;
- if(t>100) f=1;
- }
- else
- {
- t=t-1;
- if(t<1) f=0;
- }
- tmrOCConfig.pulse = t;
- TMR_ConfigOC2(TMR5, &tmrOCConfig);
- Delay();
- }
- }
经程序的编译和下载,则可在PA1引脚所连接的LED模块上见到所呈现的呼吸灯效果。
演示效果:
|