1. 程式人生 > 其它 >基於RT1052 Aworks 使能GPIO輸出功能(五)

基於RT1052 Aworks 使能GPIO輸出功能(五)

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

在Aworks支援led_gpios類的驅動,和linux下的gpio-leds類似。在其框架之下只需要記錄對應的GPIO的led id號,上層即可呼叫通用介面進行操作。

/**
 * \brief 設定LED狀態
 * \param[in] id   LED編號, 可用編號由具體平臺決定
 * \param[in] on   LED的點亮狀態, true為點亮, false為熄滅
 *
 * \retval  AW_OK      操作成功
 * \retval -AW_ENODEV  裝置不存在
 */
aw_err_t aw_led_set (int id, aw_bool_t on);

/**
 * \brief 點亮LED
 * \param[in] id   LED編號, 可用編號由具體平臺決定.
 *
 * \retval  AW_OK      操作成功
 * \retval -AW_ENODEV  裝置不存在
 */
aw_err_t aw_led_on (int id);

/**
 * \brief 熄滅LED
 * \param[in] id   LED編號, 可用編號由具體平臺決定
 *
 * \retval  AW_OK      操作成功
 * \retval -AW_ENODEV  裝置不存在
 */
aw_err_t aw_led_off (int id);

/**
 * \brief 翻轉LED
 * \param[in] id   LED編號, 可用編號由具體平臺決定
 *
 * \retval  AW_OK      操作成功
 * \retval -AW_ENODEV  裝置不存在
 */
aw_err_t aw_led_toggle (int id);

1. 首先閱讀原理圖

設計中有五個輸出引腳,如下所示:
如下五個引腳在Aworks 當中被註冊成LED裝置。

2. 裝置資源及驅動適配

2.1 裝置資源的註冊

在Aworks下注冊GPIO的裝置資源註冊的關鍵在於awbl_hwconf_gpio_led.h 對應的陣列。

/* LED裝置GPIO資訊 */
aw_local aw_const uint16_t __g_led_gpios[] = {
    GPIO1_18,     /*  MCU_WP */
	GPIO2_28,     /*  CAN_STB */
	GPIO2_29,     /*  CAN_EN */
	GPIO2_31,     /*  CAN_WAKE */
	GPIO1_30,     /*  INPUT_DET_EN */
};

預設AWBL_HWCONF_GPIO_LED巨集已註冊到其硬體裝置列表當中g_awbl_devhcf_list。有了裝置資源之後,我們需要註冊裝置驅動。

2.2 裝置驅動的註冊

在Aworks框架下,其驅動的註冊在 aw_prj_config.c 如下所示

#ifdef AW_DRV_GPIO_LED
    awbl_led_gpio_drv_register();
#endif

2.3 裝置巨集開關

使能led模組只需要在aw_prj_params.h 新增相關的巨集即可,如下所示

#define AW_DEV_GPIO_LED                 /**< \brief LED */

至此我們就確定的GPIO的led id號如下所示,可以使用Aworks框架進行程式設計。

3. 如何測試

測試程式碼如下所示:

/*----------------------------------------------*
 * macros                                       *
 *----------------------------------------------*/
#define MCU_WP_LED_ID           0
#define CAN_STB_LED_ID          1
#define CAN_EN_LED_ID           2
#define CAN_WAKE_LED_ID         3
#define INPUT_DET_EN_LED_ID     4
/*----------------------------------------------*
 * routines' implementations                    *
 *----------------------------------------------*/

/**
 * @brief set MCU_WP pin to  high level
 *
 * @param [in] None
 * @param [out] None
 * 
 * @return 
 * 
 * @history
 * 1.Date         : 2020-9-26 13:25:36
 *   Author       : panzidong
 *   Modification : Created function
 */
void gpio_mcu_wp_on(){
  aw_led_on(MCU_WP_LED_ID);
}
/**
 * @brief set MCU_WP pin to low level
 *
 * @param [in] None
 * @param [out] None
 * 
 * @return 
 * 
 * @history
 * 1.Date         : 2020-9-26 13:26:44
 *   Author       : panzidong
 *   Modification : Created function
 */
void gpio_mcu_wp_off(){
  aw_led_off(MCU_WP_LED_ID);
}
/**
 * @brief set CAN_STB pin to high level
 *
 * @param [in] None
 * @param [out] None
 * 
 * @return 
 * 
 * @history
 * 1.Date         : 2020-9-26 13:27:3
 *   Author       : panzidong
 *   Modification : Created function
 */
void gpio_can_stb_on(){
  aw_led_on(CAN_STB_LED_ID);
}

/**
 * @brief set CAN_STB pin to low level
 *
 * @param [in] None
 * @param [out] None
 * 
 * @return 
 * 
 * @history
 * 1.Date         : 2020-9-26 13:27:44
 *   Author       : panzidong
 *   Modification : Created function
 */
void gpio_can_stb_off(){
  aw_led_off(CAN_STB_LED_ID);
}
/**
 * @brief set CAN_EN pin to high level
 *
 * @param [in] None
 * @param [out] None
 * 
 * @return 
 * 
 * @history
 * 1.Date         : 2020-9-26 13:28:5
 *   Author       : panzidong
 *   Modification : Created function
 */
void gpio_can_en_on(){
  aw_led_on(CAN_EN_LED_ID);
}

/**
 * @brief set CAN_EN pin to low level
 *
 * @param [in] None
 * @param [out] None
 * 
 * @return 
 * 
 * @history
 * 1.Date         : 2020-9-26 13:28:32
 *   Author       : panzidong
 *   Modification : Created function
 */
void gpio_can_en_off(){
  aw_led_off(CAN_EN_LED_ID);
}
/**
 * @brief set CAN_WAKE pin to high level
 *
 * @param [in] None
 * @param [out] None
 * 
 * @return 
 * 
 * @history
 * 1.Date         : 2020-9-26 13:29:36
 *   Author       : panzidong
 *   Modification : Created function
 */
void gpio_can_wake_on(){
  aw_led_on(CAN_WAKE_LED_ID);
}
/**
 * @brief set CAN_WAKE pin to low level
 *
 * @param [in] None
 * @param [out] None
 * 
 * @return 
 * 
 * @history
 * 1.Date         : 2020-9-26 13:29:53
 *   Author       : panzidong
 *   Modification : Created function
 */
void gpio_can_wake_off(){
  aw_led_off(CAN_WAKE_LED_ID);
}
/**
 * @brief set INPUT_DET_EN pin to high level
 *
 * @param [in] None
 * @param [out] None
 * 
 * @return 
 * 
 * @history
 * 1.Date         : 2020-9-26 13:30:47
 *   Author       : panzidong
 *   Modification : Created function
 */
void gpio_input_det_en_on(){
  aw_led_on(INPUT_DET_EN_LED_ID);
}
/**
 * @brief set INPUT_DET_EN pin to low level
 *
 * @param [in] None
 * @param [out] None
 * 
 * @return 
 * 
 * @history
 * 1.Date         : 2020-9-26 13:31:18
 *   Author       : panzidong
 *   Modification : Created function
 */
void gpio_input_det_en_off(){
  aw_led_off(INPUT_DET_EN_LED_ID);
}

#ifdef GPIO_LED_TEST
void gpio_led_test(aw_bool_t on){

    if(on == 1){
        gpio_mcu_wp_on();
        gpio_can_stb_on();
        gpio_can_en_on();
        gpio_can_wake_on();
        gpio_input_det_en_on();
    }else{
        gpio_mcu_wp_off();
        gpio_can_stb_off();
        gpio_can_en_off();
        gpio_can_wake_off();
        gpio_input_det_en_off();
    }
}
#endif  // GPIO_LED_TEST

4. 總結

在Aworks下GPIO輸出引用的註冊很簡單,但是也有不完美的地方,所有的GPIO輸出初始化時,無法分別指定初始化之後的引腳的預設狀態,要麼全為高電平,要麼全為低電平。