一、简述:
本文使用RT_Thread通用GPIO设备驱动进行控制IO口,我们需要了解GPIO设备驱动框架,同时也要驱动LED灯完成本节实验目的。
二、GPIO设备驱动框架:
IO设备驱动框架综述:
RT_Thread IO设备模型框架位于硬件和应用层之间,共分成三层,从上到下分别是 I/O 设备管理层、设备驱动框架层、设备驱动层。
设备驱动框架层是对同类硬件设备驱动的抽象,将不同厂家的同类硬件设备驱动中相同的部分抽取出来,将不同部分留出接口,由驱动程序实现。
PIN设备说明
我们这里控制LED灯,需要使用PIN设备驱动框架,RT_Thread PIN设备支持接口如下图所示
获取引脚编号
/** wm_io.h中引脚定义如下*/
enum tls_io_name {
WM_IO_PA_00 = 0, /**< gpio a0 */
WM_IO_PA_01, /**< gpio a1 */
WM_IO_PA_02, /**< gpio a2 */
WM_IO_PA_03, /**< gpio a3 */
WM_IO_PA_04, /**< gpio a4 */
WM_IO_PA_05, /**< gpio a5 */
WM_IO_PA_06, /**< gpio a6 */
WM_IO_PA_07, /**< gpio a7 */
WM_IO_PA_08, /**< gpio a8 */
WM_IO_PA_09, /**< gpio a9 */
WM_IO_PA_10, /**< gpio a10 */
WM_IO_PA_11, /**< gpio a11 */
WM_IO_PA_12, /**< gpio a12 */
WM_IO_PA_13, /**< gpio a13 */
WM_IO_PA_14, /**< gpio a14 */
WM_IO_PA_15, /**< gpio a15 */
WM_IO_PB_00, /**< gpio b0 */
WM_IO_PB_01, /**< gpio b1 */
WM_IO_PB_02, /**< gpio b2 */
WM_IO_PB_03, /**< gpio b3 */
WM_IO_PB_04, /**< gpio b4 */
WM_IO_PB_05, /**< gpio b5 */
WM_IO_PB_06, /**< gpio b6 */
WM_IO_PB_07, /**< gpio b7 */
WM_IO_PB_08, /**< gpio b8 */
WM_IO_PB_09, /**< gpio b9 */
WM_IO_PB_10, /**< gpio b10 */
WM_IO_PB_11, /**< gpio b11 */
WM_IO_PB_12, /**< gpio b12 */
WM_IO_PB_13, /**< gpio b13 */
WM_IO_PB_14, /**< gpio b14 */
WM_IO_PB_15, /**< gpio b15 */
WM_IO_PB_16, /**< gpio b16 */
WM_IO_PB_17, /**< gpio b17 */
WM_IO_PB_18, /**< gpio b18 */
WM_IO_PB_19, /**< gpio b19 */
WM_IO_PB_20, /**< gpio b20 */
WM_IO_PB_21, /**< gpio b21 */
WM_IO_PB_22, /**< gpio b22 */
WM_IO_PB_23, /**< gpio b23 */
WM_IO_PB_24, /**< gpio b24 */
WM_IO_PB_25, /**< gpio b25 */
WM_IO_PB_26, /**< gpio b26 */
WM_IO_PB_27, /**< gpio b27 */
WM_IO_PB_28, /**< gpio b28 */
WM_IO_PB_29, /**< gpio b29 */
WM_IO_PB_30, /**< gpio b30 */
WM_IO_PB_31 /**< gpio b31 */
};
硬件原理图如下
TB_01最小系统开发板中LED分别是PB14、PB15、PB16、PB17、PB18,对应RT_Thread中IO编号是19、20、21、22、23,注意这里不是直接使用WM_IO_PB_14、WM_IO_PB_15、WM_IO_PB_16、WM_IO_PB_17、WM_IO_PB_18,目前调试看下来映射的是引脚编号,之后联盛德官方提供的W60x package可能会解决此问题。
三、点灯程序
#include
#include
#define W600_IO_LED1 19
#define W600_IO_LED2 20
#define W600_IO_LED3 21
#define W600_IO_LED4 22
#define W600_IO_LED5 23
int main(void)
{
/* set wifi work mode */
rt_wlan_set_mode(RT_WLAN_DEVICE_STA_NAME, RT_WLAN_STATION);
rt_wlan_set_mode(RT_WLAN_DEVICE_AP_NAME, RT_WLAN_AP);
/* init led */
rt_pin_mode(W600_IO_LED1, PIN_MODE_OUTPUT);
rt_pin_mode(W600_IO_LED2, PIN_MODE_OUTPUT);
rt_pin_mode(W600_IO_LED3, PIN_MODE_OUTPUT);
rt_pin_mode(W600_IO_LED4, PIN_MODE_OUTPUT);
rt_pin_mode(W600_IO_LED5, PIN_MODE_OUTPUT);
while (1)
{
rt_pin_write(W600_IO_LED1, PIN_LOW);
rt_pin_write(W600_IO_LED2, PIN_LOW);
rt_pin_write(W600_IO_LED3, PIN_LOW);
rt_pin_write(W600_IO_LED4, PIN_LOW);
rt_pin_write(W600_IO_LED5, PIN_LOW);
rt_kprintf("led on\r\n");
rt_thread_mdelay(2000);
rt_pin_write(W600_IO_LED1, PIN_HIGH);
rt_pin_write(W600_IO_LED2, PIN_HIGH);
rt_pin_write(W600_IO_LED3, PIN_HIGH);
rt_pin_write(W600_IO_LED4, PIN_HIGH);
rt_pin_write(W600_IO_LED5, PIN_HIGH);
rt_kprintf("led off\r\n");
rt_thread_mdelay(2000);
}
return 0;
}
四、编译
VSCode环境
打开Env控制程序,cd到bsp/w60x当前目录,输入scons
Keil环境
五、烧录运行
使用串口工具烧录,烧录完成后,Log信息如下,符合要求,每隔2秒打印一次信息。
LED结果如下图所示:
六、结语
本节完,如您在使用过程中有任何问题,请加QQ群进一步交流
QQ交流群:906015840 (备注:物联网项目交流)
github仓库地址:https://github.com/solitary-sand/rt_thread
一叶孤沙出品:一沙一世界,一叶一菩提