蓝牙芯片调试中使用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亮度而言,太大,会造成拖影。