CN / EN
CN / EN

提问

设计支持

您的项目私密技术问题如需获得一对一支持,请点击下方联系我们。

两种外设同时复用使用PWM1 GR551x

138***171

2024-02-19 12:02


两种外设同时复用使用PWM1,GR5513,GPIO_PIN_10复用为PWM1,使用B通道,GPIO_PIN_7复用为PWM1,使用A通道,怎么同时运行


0收藏

0赞成

Ping

汇顶员工
2024-02-19 14:55

参考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,        
        },    
    },									


1条评论

0赞成

0收藏

您的评论

138***171

2024-02-19 16:08

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);

}

会导致蜂鸣器一直响

这个是什么问题,应该怎么解决呢

0条评论

0赞成

0收藏

您的评论

Ping

汇顶员工
2024-02-19 17:04

用的是哪个版本的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);


0条评论

0赞成

0收藏

您的评论

登录后可回答问题,请 注册

我们时刻倾听您的声音
联系销售

扫描关注公众号

打开微信,使用“扫一扫”即可关注