本帖最后由 aHaoii 于 2023-11-20 16:50 编辑
继刚刚点亮灯以后,便准备试试其它功能,不如整个呼吸灯吧。
纯粹用变量操作延时肯定没什么意思,所以用PWM来驱动。
【1】找例程
还是老样子,在官方的例程上进行修改。
找到该文件夹:
打开里面有很多外设的例子,看到pwm_v1,pwm_v2,就是我们要找的。
分别看这两个文件夹下pwm_basic的readme,发现pwm_v1只支持bl602, bl702这些芯片,而我们的Ai-M61-32S-Kit用的是bl618。
因此,找到pwm_v2,看pwm_basic的readme,OK,是我们需要的。
【2】修改例程
这是pwm_basic下原始的main.c内容:
因为我们需要将连接RGB灯的IO口设置为PWM功能,所以默认的代码需要修改。
找到board_pwm_gpio_init的定义,如下:
- void board_pwm_gpio_init()
- {
- struct bflb_device_s* gpio;
- gpio = bflb_device_get_by_name("gpio");
- bflb_gpio_init(gpio, GPIO_PIN_24, GPIO_FUNC_PWM0 | GPIO_ALTERNATE | GPIO_PULLDOWN | GPIO_SMT_EN | GPIO_DRV_1);
- bflb_gpio_init(gpio, GPIO_PIN_25, GPIO_FUNC_PWM0 | GPIO_ALTERNATE | GPIO_PULLUP | GPIO_SMT_EN | GPIO_DRV_1);
- bflb_gpio_init(gpio, GPIO_PIN_26, GPIO_FUNC_PWM0 | GPIO_ALTERNATE | GPIO_PULLDOWN | GPIO_SMT_EN | GPIO_DRV_1);
- 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_28, GPIO_FUNC_PWM0 | GPIO_ALTERNATE | GPIO_PULLDOWN | 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);
- bflb_gpio_init(gpio, GPIO_PIN_30, GPIO_FUNC_PWM0 | GPIO_ALTERNATE | GPIO_PULLDOWN | GPIO_SMT_EN | GPIO_DRV_1);
- bflb_gpio_init(gpio, GPIO_PIN_31, GPIO_FUNC_PWM0 | GPIO_ALTERNATE | GPIO_PULLUP | GPIO_SMT_EN | GPIO_DRV_1);
- }
复制代码 可以发现该代码将GPIO24-31全部设置成了PWM,我们不需要这么多,因此复制一部分就行,如下:
- struct bflb_device_s* gpio;
- gpio = bflb_device_get_by_name("gpio");
- bflb_gpio_init(gpio, GPIO_PIN_12, GPIO_FUNC_PWM0 | GPIO_ALTERNATE | GPIO_PULLDOWN | GPIO_SMT_EN | GPIO_DRV_1);
复制代码 并添加一个头文件,该头文件有GPIO_PULLDOWN 这些东西的定义。
【3】占空比调节实现呼吸灯效果
- bflb_pwm_v2_channel_set_threshold(pwm, PWM_CH0, 100, 500);
复制代码 前面的.period设置为1000,意思就是计数器从1-1000计数,100-500之间输出高,其它为低。(个人这么理解,还没细看)
因此修改该参数即可达到占空比控制实现呼吸灯效果。
完整代码如下:
- int main(void)
- {
- board_init();
- struct bflb_device_s* gpio;
- gpio = bflb_device_get_by_name("gpio");
- bflb_gpio_init(gpio, GPIO_PIN_12, GPIO_FUNC_PWM0 | GPIO_ALTERNATE | GPIO_PULLDOWN | GPIO_SMT_EN | GPIO_DRV_1);
-
- pwm = bflb_device_get_by_name("pwm_v2_0");
- /* 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,
- };
- bflb_pwm_v2_init(pwm, &cfg);
- bflb_pwm_v2_channel_set_threshold(pwm, PWM_CH0, 1, 2); /* duty = (500-100)/1000 = 40% */
- bflb_pwm_v2_channel_positive_start(pwm, PWM_CH0);
- bflb_pwm_v2_start(pwm);
- uint32_t val = 2;
- bool flag = true;
- while (1) {
- if(flag){
- val++;
- }
- else{
- val--;
- }
- if(val>=999 || val <= 2){
- flag = !flag;
- }
- bflb_pwm_v2_channel_set_threshold(pwm, PWM_CH0, 1, val);
- bflb_mtimer_delay_ms(1);
- }
- }
复制代码
【4】编译烧录
在编译前需要修改一下Makefile,把Makefile这里改成bl616的配置。
然后make flash COMX=COM3即可,COM3取决于自己电脑。
成功后即可看到红色呼吸灯闪烁效果。
烧录操作参见该贴:
【教程】点灯!解决Ai-M61-32S-Kit到手不亮
http://bbs.ai-thinker.com/forum.php?mod=viewthread&tid=43396
(出处: 物联网开发者社区-安信可论坛)
——————————————————————————————
2023.11.20
|