基于RT1052 Aworks 使能GPIO输出功能(五)

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

在Aworks支持led_gpios类的驱动,和linux下的gpio-leds类似。在其框架之下只需要记录对应的GPIO的led id号,上层即可调用通用接口进行操作。

/**
 * rief 设置LED状态
 * param[in] id   LED编号, 可用编号由具体平台决定
 * param[in] on   LED的点亮状态, true为点亮, false为熄灭
 *
 * 
etval  AW_OK      操作成功
 * 
etval -AW_ENODEV  设备不存在
 */
aw_err_t aw_led_set (int id, aw_bool_t on);

/**
 * rief 点亮LED
 * param[in] id   LED编号, 可用编号由具体平台决定.
 *
 * 
etval  AW_OK      操作成功
 * 
etval -AW_ENODEV  设备不存在
 */
aw_err_t aw_led_on (int id);

/**
 * rief 熄灭LED
 * param[in] id   LED编号, 可用编号由具体平台决定
 *
 * 
etval  AW_OK      操作成功
 * 
etval -AW_ENODEV  设备不存在
 */
aw_err_t aw_led_off (int id);

/**
 * rief 翻转LED
 * param[in] id   LED编号, 可用编号由具体平台决定
 *
 * 
etval  AW_OK      操作成功
 * 
etval -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                 /**< rief 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输出初始化时,无法分别指定初始化之后的引脚的默认状态,要么全为高电平,要么全为低电平。

原文地址:https://www.cnblogs.com/lianghong881018/p/15169444.html