本节例程下载:链接:https://pan.baidu.com/s/1o9GxA9W 密码:erg9
SDK v1.2.0 API的手册:链接:https://pan.baidu.com/s/1kWr1oZd 密码:ylgk
1、实验目的
初步了解GPIO控制、定时器的操作。
2、代码展示
#include "ets_sys.h"//定时器中断相关
#include "osapi.h"//定时器和字符串的API函数
#include "gpio.h"//GPIO相关函数
#include "user_interface.h" //包含 os_timer相关结构体
//#include "driver/uart.h"
//#include "spi_flash.h"
//#include "espconn.h"
//#include "user_config.h"
//#include "smartconfig.h"
LOCAL os_timer_t timer;//定义定时器结构体
char flag = 1; //
void timer_callback(){
if(flag)
{
GPIO_OUTPUT_SET(GPIO_ID_PIN(2), 0);
flag = 0;
}
else
{
GPIO_OUTPUT_SET(GPIO_ID_PIN(2), 1);
flag = 1;
}
}
void user_init(void)
{
PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U,FUNC_GPIO2);
os_timer_disarm(&timer);
os_timer_setfn(&timer,(os_timer_func_t *)timer_callback,NULL);
os_timer_arm(&timer,1000,1);
}
void user_rf_pre_init(){}
3、代码解读
程序里面涉及到的函数有三个,
user_init()
是入口函数,相当于main函数,
user_rf_pre_init()
是SDK1.1.0及之后版本需要增加的函数,暂时我还不知道怎么用。
timer_callback()
是一个定时器回调函数。
首先定义一个定时器函数和一个状态变量,用于判断LED灯的状态
LOCAL os_timer_t timer;
char flag = 1;
首先入口函数中选择GPIO2管脚
PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U,FUNC_GPIO2);
然后定义定时器,语法可参考编程手册,里面说的都很详细了
os_timer_disarm(&timer);
os_timer_setfn(&timer,(os_timer_func_t *)timer_callback,NULL);
os_timer_arm(&timer,1000,1);
os_timer_setfn(&timer(os_timer_func_t*)timer_callback,NULL);
其中 timer_callback
就是回调函数。
GPIO_OUTPUT_SET(GPIO_ID_PIN(2), 0);
这句的意思就是GPIO2输出低电平,1为高电平,其它的口类似,具体的语法解释也可以参考编程手册,都有详细说明。
程序写好后Clean一下项目再编译一下生成0x00000.bin
和0x40000.bin
,按照前面的教程将这两个文件刷进模块,记住这里只要刷两个文件就可以了,所以刷写的时候只要勾选这两个文件前面的复选框,固件刷进去后断电重新加电模块开始工作。
4、硬件操作
不需要,灯GPIO2是EPS-12E自带的!
5、总结
分享一个前辈总结的GPIO控制
设置其为读取状态功能则这样初始化: GPIO_DIS_OUTPUT(GPIO_ID_PIN(14)) ;
选中某个引脚,然后控制。
以下是输出控制
PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO0_U, FUNC_GPIO0);
GPIO_OUTPUT_SET(GPIO_ID_PIN(0), level);
PIN_FUNC_SELECT(PERIPHS_IO_MUX_U0TXD_U, FUNC_GPIO1);
GPIO_OUTPUT_SET(GPIO_ID_PIN(1), level);
PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO2_U, FUNC_GPIO2);
GPIO_OUTPUT_SET(GPIO_ID_PIN(2), level);
PIN_FUNC_SELECT(PERIPHS_IO_MUX_U0RXD_U, FUNC_GPIO3);
GPIO_OUTPUT_SET(GPIO_ID_PIN(3), level);
PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO4_U, FUNC_GPIO4);
GPIO_OUTPUT_SET(GPIO_ID_PIN(4), level);
PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO5_U, FUNC_GPIO5);
GPIO_OUTPUT_SET(GPIO_ID_PIN(5), level);
PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U, FUNC_GPIO12);
GPIO_OUTPUT_SET(GPIO_ID_PIN(12), level);
PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTCK_U, FUNC_GPIO13);
GPIO_OUTPUT_SET(GPIO_ID_PIN(13), level);
PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTMS_U, FUNC_GPIO14);
GPIO_OUTPUT_SET(GPIO_ID_PIN(14), level);
PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDO_U, FUNC_GPIO15);
GPIO_OUTPUT_SET(GPIO_ID_PIN(15), level);
gpio16_output_conf();
gpio16_output_set(level);
以下是输入采集
PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO0_U, FUNC_GPIO0);
result = GPIO_INPUT_GET(GPIO_ID_PIN(0));
PIN_FUNC_SELECT(PERIPHS_IO_MUX_U0TXD_U, FUNC_GPIO1);
result = GPIO_INPUT_GET(GPIO_ID_PIN(1));
PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO2_U, FUNC_GPIO2);
result = GPIO_INPUT_GET(GPIO_ID_PIN(2));
PIN_FUNC_SELECT(PERIPHS_IO_MUX_U0RXD_U, FUNC_GPIO3);
result = GPIO_INPUT_GET(GPIO_ID_PIN(3));
PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO4_U, FUNC_GPIO4);
result = GPIO_INPUT_GET(GPIO_ID_PIN(4));
PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO5_U, FUNC_GPIO5);
result = GPIO_INPUT_GET(GPIO_ID_PIN(5));
PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U, FUNC_GPIO12);
result = GPIO_INPUT_GET(GPIO_ID_PIN(12));
PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTCK_U, FUNC_GPIO13);
result = GPIO_INPUT_GET(GPIO_ID_PIN(13));
PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTMS_U, FUNC_GPIO14);
result = GPIO_INPUT_GET(GPIO_ID_PIN(14));
PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDO_U, FUNC_GPIO15);
result = GPIO_INPUT_GET(GPIO_ID_PIN(15));
gpio16_input_conf();
result = gpio16_input_get();
定时器控制
1、先定义结构体
LOCAL os_timer_t timer;
2、初始化定时器
os_timer_disarm(&timer);//关闭定时器,相当于清零计时器计数
os_timer_setfn(&timer, (os_timer_func_t *)timer_callback, NULL);//初始化定时器
os_timer_arm(&timer, 1000, 0);//开始定时器计数,1000毫秒后,会调用前面的callback函数 (后面的0表示只运行一次 为1表示循环运行)
3、设置需要被调用的程序
void timer_callback()
{
uart0_sendStr("\r\n《定时器测试》\r\n");
}