基於RT1052 Aworks 使能GPIO輸出功能(五)
阿新 • • 發佈:2021-08-21
本文主要是通過遷移的思維,記錄本人初次使用周立功的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輸出初始化時,無法分別指定初始化之後的引腳的預設狀態,要麼全為高電平,要麼全為低電平。