本文主要是通过迁移的思维,记录本人初次使用周立功的Aworks框架进行BSP开发
其实对于输入型GPIO来说,要么是一个普通的输入引脚,要么当作特定的按键使用,有对应的键值。在本文中我们将其注册成普通的输入GPIO使用。
aw_err_t aw_gpio_pin_cfg(int pin, uint32_t flags);
aw_err_t aw_gpio_get(int pin);
这两个函数就满足了我们的需要,其说明如下所示:
/**
* \param[in] pin 引脚编号
* \param[in] flags 配置标志,其格式请参考上面的详细描述
*
* \retval AW_OK 操作成功
* \retval -AW_ENXIO \a pin 不存在
* \retval -AW_EIO 操作出错
*
* \par 示例:配置引脚功能 (使用“通用定义”标志域)
* \code
* #include "aw_gpio.h"
*
* // 配置引脚PIO0_1为GPIO输入功能
* aw_gpio_pin_cfg(PIO0_1, AW_GPIO_INPUT);
*
* // 配置引脚PIO0_1为GPIO输入功能,并使能引脚上拉电阻
* aw_gpio_pin_cfg(PIO0_1, AW_GPIO_INPUT | AW_GPIO_PULL_UP);
*
* // 配置引脚PIO0_1为GPIO输出功能,并使能引脚上拉电阻
* aw_gpio_pin_cfg(PIO0_1, AW_GPIO_OUTPUT | AW_GPIO_PULL_UP);
* \endcode
*/
aw_err_t aw_gpio_pin_cfg(int pin, uint32_t flags);
/**
* \brief 读取GPIO引脚的输入值/输出值
*
* 读取引脚 \a pin 当前的输入值(\a pin 被配置为GPIO输入功能)或输出值
* (\a pin 被配置为GPIO输出功能)
*
* \par 实现相关
* 当引脚被配置为GPIO输出功能时, aw_gpio_get() 返回的可以是设置的输出值,
* 也可以是引脚上的实际电平
*
* \param[in] pin 引脚编号
*
* \retval 0 \a pin 的输入值或输出值为0(低电平)
* \retval 1 \a pin 的输入值或输出值为1(高电平)
* \retval -AW_ENXIO \a pin 不存在
*
* \par 示例
* \code
* #include "aw_gpio.h"
*
* int val;
*
* // 配置引脚 PIO0_11 为GPIO输入功能,上拉电阻使能
* aw_gpio_pin_cfg(PIO0_11, AW_GPIO_INPUT | AW_GPIO_PULL_UP);
*
* val = aw_gpio_get(PIO0_11); //读取引脚 PIO0_11 的输入值
*
* // 配置引脚 PIO0_11 为GPIO输出功能
* aw_gpio_pin_cfg(PIO0_11, AW_GPIO_OUTPUT);
*
* val = aw_gpio_get(PIO0_11); //读取引脚 PIO0_11 当前的输出值
* \endcode
*/
aw_err_t aw_gpio_get(int pin);
1. 首先阅读原理图
设计中有两个GPIO当作输入,不需要注册相关的设备资源和驱动
由应用开发自行调用aw_gpio_pin_cfg进行初始化,以兼容Awroks编程接口。在imx1050_pin.h文件当中,定义了所有引脚的编号,我们可重定义相关宏之后,进行操作。
2. 如何测试
测试代码如下所示:
/*----------------------------------------------*
* macros *
*----------------------------------------------*/
#define Ignition_MCU GPIO1_19
#define CAN_ERROR GPIO2_30
/*----------------------------------------------*
* routines' implementations *
*----------------------------------------------*/
/**
* @brief Ignition_MCU pin mux init
*
* @param [in] None
* @param [out] None
*
* @return
*
* @history
* 1.Date : 2020-9-26 11:11:27
* Author : panzidong
* Modification : Created function
*/
void gpio_ignition_mcu_init(){
aw_gpio_pin_cfg(Ignition_MCU, AW_GPIO_INPUT | AW_GPIO_PULL_UP );
}
/**
* @brief get Ignition_MCU pin level
*
* @param [in] None
* @param [out] None
*
* @return
*
* @history
* 1.Date : 2020-9-26 11:12:13
* Author : panzidong
* Modification : Created function
*/
int get_ignition_mcu_level(){
return aw_gpio_get(Ignition_MCU);
}
/**
* @brief CAN_ERR pin mux init
*
* @param [in] None
* @param [out] None
*
* @return
*
* @history
* 1.Date : 2020-9-26 11:12:44
* Author : panzidong
* Modification : Created function
*/
void gpio_can_error_init(){
aw_gpio_pin_cfg(CAN_ERROR, AW_GPIO_INPUT | AW_GPIO_PULL_UP );
}
/**
* @brief get CAN_ERR pin level
*
* @param [in] None
* @param [out] None
*
* @return
*
* @history
* 1.Date : 2020-9-26 11:13:27
* Author : panzidong
* Modification : Created function
*/
int get_can_error_level(){
return aw_gpio_get(CAN_ERROR);
}
#define GPIO_INPUT_TEST
#ifdef GPIO_INPUT_TEST
/**
* @brief Print Ignition_MCU and CAN_ERR pin level
*
* @param [in] None
* @param [out] None
*
* @return
*
* @history
* 1.Date : 2020-9-26 11:14:12
* Author : panzidong
* Modification : Created function
*/
void gpio_input_test(){
gpio_ignition_mcu_init();
gpio_can_error_init();
aw_kprintf("\r\n Ignition_MCU level: %s \r\n",
get_ignition_mcu_level()?"High":"Low");
aw_kprintf("\r\n CAN_ERROR level: %s \r\n",
get_can_error_level()?"High":"Low");
}
#endif
3. 总结
在做底层适配时,首先得了解在框架之下,该类型驱动的操作接口,以便于编写出测试代码。在aworks框架之下,不同类型的驱动都有相对应的头文件,在文件当中包含了其操作的接口。