• 基于RT1052 Aworks 使能蜂鸣器(七)


    本文主要是通过迁移的思维,记录本人初次使用周立功的Aworks框架进行BSP开发

    前置知识,通过学习Aworks开发框架,对于PWM而关键在于PWM的ID号,只要在注册PWM时,确认了其对应的ID号,编程起来就很轻松了。

    /**
    * addtogroup grp_aw_if_pwm
    * copydoc aw_pwm.h
    * @{
    */
    /**
    * rief 设置PWM设备的有效时间和周期
    *
    * param[in] pid        PWM设备通道号
    * param[in] duty_ns    有效时间(单位: 纳秒)
    * param[in] period_ns  PWM波形输出周期(单位: 纳秒)
    *
    * 
    etval    AW_OK       成功
    * 
    etval   -AW_ENXIO    a pid 为不存在的通道号
    * 
    etval   -AW_EINVAL   a 无效参数
    *
    */
    aw_err_t aw_pwm_config(int pid, unsigned long duty_ns, unsigned long period_ns);
    
    /**
    * rief 使能PWM设备
    *
    * param[in] pid  PWM设备通道号
    *
    */
    aw_err_t aw_pwm_enable(int pid);
    
    /**
    * rief 禁用PWM设备
    *
    * param[in] pid  PWM设备通道号
    *
    */
    aw_err_t aw_pwm_disable(int pid);
    

    1. 首先阅读原理图

    正常来说蜂鸣器只用一路PWM驱动,但是也有使用两路PWM来控制,用于控制频率与响度。
    分别是FLEXPWM2_PWMA03 flexpwm2 FLEXPWM2_PWMB03 flexpwm2,并找到其对应的GPIO引脚,方便设备资源的注册。

    2. 设备资源及驱动适配

    2.1 设备资源的注册

    在Aworks下注册PWM的设备资源的关键在于如下该结构体,跟硬件相关。

    /**
     * rief iMX RT10xx eFlexPWM 设备配置
     */
    typedef struct awbl_imx10xx_eflex_pwm_devcfg {
    
        uint8_t          pid;             /**< rief PWM ID */
        pwm_submodule_t  sub_modedle;     /**< rief PWM对应的子模块 */
        pwm_channels_t   pwm_channel;     /**< rief PWM对应通道 */
        pwm_mode_t       pwm_mode;        /**< rief PWM模式 */
        int              gpio;            /**< rief PWM对应的引脚 */
        uint32_t         func;            /**< rief PWM引脚功能 */
        uint32_t         dfunc;           /**< rief 禁能PWM后的默认引脚功能 */
    
    } awbl_imx10xx_eflex_pwm_devcfg_t;
    

    这两个PWM的ID号分别为PWM2 PWM3,在Aworks框架下已定义。所以控制蜂鸣器的通PWMM道号就是PWM2 PWM3。

    aw_local aw_const awbl_imx10xx_eflex_pwm_devcfg_t __g_imx1050_eflex_pwm2_devcfg_list[] = {
         /* PWM ID ,子模块号, 通道号,PWM模式, GPIO, PWM引脚功能, 默认引脚功能 */
        {
            PWM2,
            kPWM_Module_3,
            kPWM_PwmA,
            kPWM_SignedCenterAligned,
            GPIO1_0,
            GPIO1_0_FLEXPWM2_PWMA03,
            __PWM_PIN_DFUNC_CFG
        },
        {
            PWM3,
            kPWM_Module_3,
            kPWM_PwmB,
            kPWM_SignedCenterAligned,
            GPIO1_1,
            GPIO1_1_FLEXPWM2_PWMB03,
            __PWM_PIN_DFUNC_CFG
        }
    };
    

    2.2 设备驱动的注册

    在aw_prj_config.c文件当中

    #ifdef AW_DRV_IMX1050_EFLEX_PWM
        awbl_imx10xx_eflex_pwm_drv_register();
    #endif
    

    2.3 设备宏开关

    只需要在aw_prj_params.h打开如下定义

    aw_prj_params.h
    
    #define AW_DEV_IMX1050_EFLEX_PWM2
    

    即可注册相关的设备资源与设备驱动。

    aw_prj_param_auto_cfg.h
    
    /**
     * 
    ame 内部eFlexPWM
     * @{
     */
    
    #if defined AW_DEV_IMX1050_EFLEX_PWM1 || 
        defined AW_DEV_IMX1050_EFLEX_PWM2 || 
        defined AW_DEV_IMX1050_EFLEX_PWM4
    #ifndef AW_COM_PWM
    #define AW_COM_PWM
    #endif
    
    #define AW_DRV_IMX1050_EFLEX_PWM
    #endif
    /** @} */
    

    3. 如何测试

    void buzzer_test(){
    	//  buzzer on  1s;
    	aw_pwm_config(PWM3, 100000000, 100000000);
    	aw_pwm_enable(PWM3);
    	aw_pwm_config(PWM2, 50000000, 100000000);
    	aw_pwm_enable(PWM2);
    	aw_mdelay(1000);
    	aw_pwm_disable(PWM2);
    	aw_pwm_disable(PWM3);
    }
    

    4. 总结

    在适配蜂鸣器硬件驱动时,笔者先通过RT1052数据手册的了解硬件上PWM的相关信息,才能理解PWM设备资源相关的信息。文章本身也是默认PWM的驱动是正常的,作为开发者只需要适配原理图的硬件设计。只要抓住设备资源的注册,设备驱动的注册,使能设备宏开关。只要抓住这三点,默认设备驱动正常,稍加修改设备资源文件即可,并使能设备宏开关,编写测试程序,就可以验证硬件是否是正常的。在Aworks的框架内部有针对蜂鸣器的操作接口,但是由于我们是两路的PWM,硬件不适合使用该框架注册,如果是一路PWM控制蜂鸣器,就可以使用框架自带的蜂鸣器接口。

  • 相关阅读:
    hadoop集群搭建
    javamail
    编码之后的字符串和数组长度解惑
    后台架构剖析
    搜索引擎选择: Elasticsearch与Solr
    WHRER条件里的数据类型必须和字段数据类型一致
    Phantomjs
    倒排索引
    Gremlin--一种支持对图表操作的语言
    Android Intent 用法全面总结
  • 原文地址:https://www.cnblogs.com/lianghong881018/p/15169457.html
Copyright © 2020-2023  润新知