本帖最后由 fanq211 于 2023-12-8 16:26 编辑
点灯进阶
参考帖子 (九)零基础开发小安派-Eyes-S1【外设篇】——PWM
阅读手册, 通过GPIO29 和GPIO27 实现PWM 控制LED灯
原理图
手册如下:
查看Ai-M61-32S 简介就有个疑惑 怎么都是PWM0, 然后看AiPi-Eyes-DU 源码,就有疑问 PWM的通道如何关联?
阅读bl616_bl618_ds_zh_cn_1.4.pdf 才理解. 原来PWM0 是有多个通道, 同一个PWM下的同一个通道,在芯片上可能有多个管脚,但只能选一个管脚, 一旦同通道的PWM通道被选用了. 另一个管脚就不能再选做PWM了,能用作其他功能使用.
如AiPi-Eyes-DU 控制 GPIO12 GPIO15 GPIO14 对应PWM_CH0 PWM_CH2 PWM_CH3
改用 GPIO29 和GPIO27 后 就会发现 GPIO27 和 GPIO14的 PWM通道冲突, GPIO27做PWM后,GPIO14就能不做PWM
基于AiPi-Eyes-DU 修改main.c 源码修改后如下.
int main(void)
{
int i;
board_init();
pwm = bflb_device_get_by_name("pwm_v2_0");
gpio = bflb_device_get_by_name("gpio");
bflb_gpio_init(gpio, GPIO_PIN_27, GPIO_FUNC_PWM0 | GPIO_ALTERNATE | GPIO_PULLUP | GPIO_SMT_EN | GPIO_DRV_1);
bflb_gpio_init(gpio, GPIO_PIN_29, GPIO_FUNC_PWM0 | GPIO_ALTERNATE | GPIO_PULLUP | GPIO_SMT_EN | GPIO_DRV_1);
/* period = .XCLK / .clk_div / .period = 40MHz / 40 / 1000 = 1KHz */
struct bflb_pwm_v2_config_s cfg = {
.clk_source = BFLB_SYSTEM_XCLK,
.clk_div = 40,
.period = 1000,
};
/*初始化PWM输出*/
bflb_pwm_v2_init(pwm, &cfg);
bflb_pwm_v2_start(pwm);
while (1) {
//GPIO_27
bflb_pwm_v2_channel_positive_start(pwm, PWM_CH3);
for(i=100;i>0;i--)
{
bflb_pwm_v2_channel_set_threshold(pwm, PWM_CH3, i, 100);
bflb_mtimer_delay_ms(10);
}
for(i=1;i<100;i++)
{
bflb_pwm_v2_channel_set_threshold(pwm, PWM_CH3, i, 100);
bflb_mtimer_delay_ms(10);
}
bflb_pwm_v2_channel_positive_stop(pwm, PWM_CH3);
//GPIO_29
bflb_pwm_v2_channel_positive_start(pwm, PWM_CH1);
for(i=100;i>0;i--)
{
bflb_pwm_v2_channel_set_threshold(pwm, PWM_CH1, i, 100);
bflb_mtimer_delay_ms(10);
}
for(i=1;i<100;i++)
{
bflb_pwm_v2_channel_set_threshold(pwm, PWM_CH1, i, 100);
bflb_mtimer_delay_ms(10);
}
bflb_pwm_v2_channel_positive_stop(pwm, PWM_CH1);
}
}
编译 烧写 运行
在开发板上按住 IO2 按键并按一下 EN 按键进入烧录模式
make flash COMX=/dev/ttyCH341USB0
烧写完后 后再按一次 EN
关键是手册手册啊.~~~~~
|