138***171
两种外设同时复用使用PWM1,GR5513,GPIO_PIN_10复用为PWM1,使用B通道,GPIO_PIN_7复用为PWM1,使用A通道,怎么同时运行
Ping
参考SDK下的projects\peripheral\pwm\app_pwm例程,配置GPIO后,根据实际业务逻辑调用app_pwm_init、app_pwm_start、app_pwm_stop、app_pwm_deinit等API进行操作,初始化配置示例如下,同一个通道频率必须相同,只能设置不同的占空比。
app_pwm_params_t pwm_params = {
.id = APP_PWM1_MODULE,
.pin_cfg = {
.channel_a = {
.type = APP_IO_TYPE_NORMAL,
.mux = APP_IO_MUX_5,
.pin = APP_IO_PIN_7,
.pull = APP_IO_NOPULL,
.enable = APP_PWM_PIN_ENABLE,
},
.channel_b = {
.type = APP_IO_TYPE_NORMAL,
.mux = APP_IO_MUX_5,
.pin = APP_IO_PIN_10,
.pull = APP_IO_NOPULL,
.enable = APP_PWM_PIN_ENABLE,
},
.channel_c = {
.type = APP_IO_TYPE_NORMAL,
.mux = APP_IO_MUX_5,
.pin = APP_IO_PIN_11,
.pull = APP_IO_NOPULL,
.enable = APP_PWM_PIN_DISABLE,
},
},
.active_channel = APP_PWM_ACTIVE_CHANNEL_ALL,
.init = {
.mode = PWM_MODE_FLICKER,
.align = PWM_ALIGNED_EDGE,
.freq = 100,
.bperiod = 500,
.hperiod = 200,
.channel_a = {
.duty = 30,
.drive_polarity = PWM_DRIVEPOLARITY_POSITIVE,
},
.channel_b = {
.duty = 50,
.drive_polarity = PWM_DRIVEPOLARITY_NEGATIVE,
},
.channel_c = {
.duty = 80,
.drive_polarity = PWM_DRIVEPOLARITY_POSITIVE,
},
},
138***171
void infrared_send_init(void)
{
gpio_infrared.mode=GPIO_MODE_MUX; //输入模式
gpio_infrared.pull=GPIO_PULLDOWN; //高电平发射红外,低电平不发射
gpio_infrared.mux=GPIO0_PIN7_MUX_PWM1_A; //引脚复用 PWM1_A
gpio_infrared.pin = GPIO_Ray_Beside; //侧边红外引脚
hal_gpio_init(GPIO0, &gpio_infrared); //GPIO0 初始化配置
red_1_handle.p_instance = PWM1_MODULE;
red_1_handle.active_channel = HAL_PWM_ACTIVE_CHANNEL_A;
red_1_handle.init.mode = PWM_MODE_FLICKER;
red_1_handle.init.align = PWM_ALIGNED_EDGE;
red_1_handle.init.freq = 38000; //PWM output freq = 38kHz
red_1_handle.init.channel_a.duty = 33; //8.77us高电平发射红外,17.53us低电平不发射红外
red_1_handle.init.channel_a.drive_polarity = PWM_DRIVEPOLARITY_POSITIVE; //驱动极性 为高电平
hal_pwm_init(&red_1_handle);
}
void app_bell_Init(void)
{
gpio_bell.pin=GPIO_PIN_BELL; //分配引脚
gpio_bell.pull=GPIO_PULLUP;
gpio_bell.mode=GPIO_MODE_MUX; //输出模式
gpio_bell.mux=GPIO0_PIN10_MUX_PWM1_B; //引脚复用模式 PWM1 B
hal_gpio_init(GPIO0, &gpio_bell); //初始化配置
bell_handle.p_instance = PWM1_MODULE; //pwm模式选择
bell_handle.active_channel = HAL_PWM_ACTIVE_CHANNEL_B; //PWM通道选择
bell_handle.init.mode = PWM_MODE_FLICKER; //固定占空比模式 //PWM_MODE_BREATH;呼吸模式
bell_handle.init.align = PWM_ALIGNED_EDGE; //对齐模式为边沿对齐
bell_handle.init.channel_b.duty = 20; //占空比50 调整声音大小
bell_handle.init.channel_b.drive_polarity = PWM_DRIVEPOLARITY_NEGATIVE; //驱动极性 为低电平
bell_handle.init.freq = bell_hz_change(); //PWM output freq
hal_pwm_init(&bell_handle); //初始化pwm
}
这是两个外设的初始化程序,上电同时初始化,但是会导致配置覆盖,例如下面的顺序初始化:
infrared_send_init(); //红外
app_bell_Init();//蜂鸣器
在主程序while循环里调用红外的发射
void nec_ir_start(void)
{
hal_pwm_start(&red_1_handle); //高电平9ms低电平4.5ms
sys_delay_us(9000);
hal_pwm_stop(&red_1_handle);
sys_delay_us(4500);
}
会导致蜂鸣器一直响
这个是什么问题,应该怎么解决呢
Ping
用的是哪个版本的SDK,初始化参数不对,可以参考下app_pwm_init的实现,应该是两路PWM的参数同时配置的,建议参考例程调用APP层接口去开发。
另外APP层循环调用注意下应用事项: GR551X SDK 调用app_pwm_stop接口后IO状态不定解决案例
/**
****************************************************************************************
* @brief Initialize the PWM mode according to the specified
* parameters in the pwm_init_t and initialize the associated handle.
* @param[in] p_pwm: Pointer to a PWM handle that contains the configuration information for the specified PWM module.
* @retval ::HAL_OK: Operation is OK.
* @retval ::HAL_ERROR: Parameter error or operation not supported.
* @retval ::HAL_BUSY: Driver is busy.
* @retval ::HAL_TIMEOUT: Timeout occurred.
****************************************************************************************
*/
hal_status_t hal_pwm_init(pwm_handle_t *p_pwm);
打开微信,使用“扫一扫”即可关注