蓝牙芯片调试中使用pwm出现的蓝牙堵死的情况

问题:在调试CMT4522蓝牙芯片过程中,发现在蓝牙正连着的时候,若使用了pwm功能则会有概率的出现蓝牙堵死的情况,即蓝牙连接状态回调函数会出现GAPROLE_WAITING_AFTER_TIMEOUT状态

#include "led.h"
#include "gpio.h"
#include "log.h"
#include "pwm.h"

uint16_t s_light=0;

static pwm_ch_t pwm_ch;

void led_init(void){
    hal_gpio_pin_init(led_pin,GPIO_INPUT);
    hal_gpio_pull_set(led_pin,WEAK_PULL_UP);
    
    hal_pwm_module_init();
    
    pwm_ch.pwmN = PWM_CH3;
    pwm_ch.pwmPin = led_pin;
    pwm_ch.pwmDiv = PWM_CLK_DIV_128;
    pwm_ch.pwmMode = PWM_CNT_UP;
    pwm_ch.pwmPolarity = PWM_POLARITY_RISING;
    pwm_ch.cmpVal = 0;
    pwm_ch.cntTopVal = 100;
}

void led_stop(void){
    LOG("LED关\n");
    //hal_pwm_close_channel(PWM_CH0);
    //hal_pwm_ch_stop(pwm_ch);
    pwm_ch.cmpVal = 1000;
    hal_pwm_ch_start(pwm_ch);
}
void led_ctrl(uint16_t value){
    LOG("LED: %d\n",value);
    pwm_ch.cmpVal = 1000-value;
    hal_pwm_ch_start(pwm_ch);
}

这个是我pwm使用的方式

 

 引脚图

 

 出现断连

解决:凭经验感觉,从机设备在与app蓝牙连接后,应该是每隔一段时间发送心跳包来告知是否还连着,而出现超时,应该就是从机没有及时回应来自app的心跳(大概吧),造成了误判。那么单片机干什么去了呢,应该就是pwm。

 

 可以看到,我已经对pwm做了最大的分频系数选择,那现在只能对最大计数值做改变,来使单片机减少,去处理pwm是否到达比较值及是否到达满值的,频率,有时间去做其他事。(第二个箭头处)这里我改成了1000就好了,当然不要改的太大,就我这里使用作为控制led亮度而言,太大,会造成拖影。

posted @ 2022-12-13 15:06  kingzhan  阅读(146)  评论(0编辑  收藏  举报