写在前面:
本文章旨在总结备份、方便以后查询,由于是个人总结,如有不对,欢迎指正;另外,内容大部分来自网络、书籍、和各类手册,如若侵权请告知,马上删帖致歉。
这章用来学习 PWM控制,并用 LED来观察验证,先来看看与 PWM相关的主要的官方 API接口,至于简单、不怎么用的就不放出来了,自己去看手册
下面分析的主要用到也就这两个
首先在配置 PWM输出前要先把想要设置的 GPIO配置好
#define USER_GLED_GPIO 12
#define USER_GLED_GPIO_PIN GPIO_Pin_12
/******************************************************************************
* FunctionName : gled_gpio_config
* Description : green(GPIO12)配置
* Parameters : none
* Returns : none
*******************************************************************************/
LOCAL void ICACHE_FLASH_ATTR gled_gpio_config(void)
{
GPIO_ConfigTypeDef pGPIOConfig;
pGPIOConfig.GPIO_IntrType = GPIO_PIN_INTR_DISABLE;
pGPIOConfig.GPIO_Pullup = GPIO_PullUp_EN;
pGPIOConfig.GPIO_Mode = GPIO_Mode_Output;
pGPIOConfig.GPIO_Pin = USER_GLED_GPIO_PIN; // gled
gpio_config(&pGPIOConfig);
GPIO_OUTPUT_SET(GPIO_ID_PIN(USER_GLED_GPIO), 0); // close gled
}
然后配置我们需要的 PWM参数,在这里我是设了三个 led的参数,但用到的只是 GPIO12(gled)而已;至于你想要几个,根据自己的意愿去修改就好了
#define PWM_0_OUT_IO_MUX PERIPHS_IO_MUX_MTDI_U
#define PWM_0_OUT_IO_NUM 12
#define PWM_0_OUT_IO_FUNC FUNC_GPIO12
/******************************************************************************
* FunctionName : led_pwm_init
* Description : led PWM初始化
* Parameters : none
* Returns : none
*******************************************************************************/
LOCAL void ICACHE_FLASH_ATTR led_pwm_init(void)
{
/* 初始化 PWM,周期, pwm_duty_init占空比, 3通道数, 通道 IO */
uint32 io_info[][3] ={ {PWM_0_OUT_IO_MUX,PWM_0_OUT_IO_FUNC,PWM_0_OUT_IO_NUM},
{PWM_1_OUT_IO_MUX,PWM_1_OUT_IO_FUNC,PWM_1_OUT_IO_NUM},
{PWM_2_OUT_IO_MUX,PWM_2_OUT_IO_FUNC,PWM_2_OUT_IO_NUM} };
uint32 pwm_duty_init[3] = {0, 0, 0};
// pwm_init(1000, pwm_duty_init,3,io_info); // 周期1000us,也就是1khz的频率,各通道初始占空比0
pwm_init(450, &pwm_duty_init[0], 1, &io_info[0]); // 只占用 1个通道、设定IO 12绿灯
/* 重设占空比。
pwm_set_duty(duty, channel); // 0 ~ 2(三通道)
pwm_set_period(uint32 period); // set period
pwm_start();
*/
}
弄完了之后,对 PWM-LED进行初始化
/******************************************************************************
* FunctionName : uesr_LED_Init
* Description : LED初始化
* Parameters : none
* Returns : none
*******************************************************************************/
void ICACHE_FLASH_ATTR uesr_LED_Init(void)
{
// rled_gpio_config();
gled_gpio_config();
// bled_gpio_config();
led_pwm_init();
}
好了,我们就可以来调用一个函数来验证
void ICACHE_FLASH_ATTR GLED_ON(void)
{
// GPIO_OUTPUT_SET(12, 1); //GPIO12输出高电平
/* PWM输出 */
pwm_set_duty(100, 0); // 重配置 LED PWM占空比、占用通道0
// pwm_set_period(450); // 重设置周期
pwm_start(); // LED闪烁启动
}
在这里我只是把它亮度降低了而已(看占空比参数),当然你可以用个循环来对 pwm_set_duty()函数的 duty值进行自增或自减来实现渐变