1. 程式人生 > 其它 >基於RT1052 Aworks 使能蜂鳴器(七)

基於RT1052 Aworks 使能蜂鳴器(七)

本文主要是通過遷移的思維,記錄本人初次使用周立功的Aworks框架進行BSP開發

前置知識,通過學習Aworks開發框架,對於PWM而關鍵在於PWM的ID號,只要在註冊PWM時,確認了其對應的ID號,程式設計起來就很輕鬆了。

/**
* \addtogroup grp_aw_if_pwm
* \copydoc aw_pwm.h
* @{
*/
/**
* \brief 設定PWM裝置的有效時間和週期
*
* \param[in] pid        PWM裝置通道號
* \param[in] duty_ns    有效時間(單位: 納秒)
* \param[in] period_ns  PWM波形輸出週期(單位: 納秒)
*
* \retval    AW_OK       成功
* \retval   -AW_ENXIO    \a pid 為不存在的通道號
* \retval   -AW_EINVAL   \a 無效引數
*
*/
aw_err_t aw_pwm_config(int pid, unsigned long duty_ns, unsigned long period_ns);

/**
* \brief 使能PWM裝置
*
* \param[in] pid  PWM裝置通道號
*
*/
aw_err_t aw_pwm_enable(int pid);

/**
* \brief 禁用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的裝置資源的關鍵在於如下該結構體,跟硬體相關。

/**
 * \brief iMX RT10xx eFlexPWM 裝置配置
 */
typedef struct awbl_imx10xx_eflex_pwm_devcfg {

    uint8_t          pid;             /**< \brief PWM ID */
    pwm_submodule_t  sub_modedle;     /**< \brief PWM對應的子模組 */
    pwm_channels_t   pwm_channel;     /**< \brief PWM對應通道 */
    pwm_mode_t       pwm_mode;        /**< \brief PWM模式 */
    int              gpio;            /**< \brief PWM對應的引腳 */
    uint32_t         func;            /**< \brief PWM引腳功能 */
    uint32_t         dfunc;           /**< \brief 禁能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

/**
 * \name 內部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控制蜂鳴器,就可以使用框架自帶的蜂鳴器介面。