这部分内容参考NONOS_API参考手册第7、8页
初始化软定时器,其中,Led_Task_Run()为软件定时器的回调函数
user_init(void)
{
static os_timer_t os_timer;// 定时器结构体
os_printf("\n ## HELLO WORLD ## \n\n");
PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U, FUNC_GPIO12);//选择GPIO12
GPIO_OUTPUT_SET(GPIO_ID_PIN(12), 1);//GPIO12为高 LED
PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTCK_U, FUNC_GPIO13);//选择GPIO13
GPIO_OUTPUT_SET(GPIO_ID_PIN(13), 1);//GPIO13为高 LED
PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTMS_U,FUNC_GPIO14);//选择GPIO2
GPIO_DIS_OUTPUT(GPIO_ID_PIN(14)) ; // 设置GPIO2为输入
Led_Cmd(false);
os_timer_disarm( &os_timer );// 关闭该定时器
os_timer_setfn( &os_timer, (ETSTimerFunc *) ( Led_Task_Run ), NULL );// 配置该定时器回调函数
os_timer_arm( &os_timer, 500, true );// 启动该定时器
}
定义软定时器回调函数Led_Task_Run()
//led使能函数
void Led_Cmd(bool status )
{
if (status == true )
{
GPIO_OUTPUT_SET(GPIO_ID_PIN(12), 0);
}
else
{
GPIO_OUTPUT_SET(GPIO_ID_PIN(12), 1);
}
}
//软件定时器 回调函数
void Led_Task_Run()
{
static bool status = false;
os_printf("timer\n");
if ( status == true )
{
status = false;
}
else
{
status = true;
}
Led_Cmd( status );
}
软件定时器不能与while(1)共存,会无法跳转到回到函数中
如下操作,不可,程序只会留在while1中,只能实现按钮切换LED状态,无法使用定时器切换LED。
user_init(void)
{
static os_timer_t os_timer;// 定时器结构体
os_printf("\n ## HELLO WORLD ## \n\n");
PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U, FUNC_GPIO12);//选择GPIO12
GPIO_OUTPUT_SET(GPIO_ID_PIN(12), 1);//GPIO12为高 LED
PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTCK_U, FUNC_GPIO13);//选择GPIO13
GPIO_OUTPUT_SET(GPIO_ID_PIN(13), 1);//GPIO13为高 LED
PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTMS_U,FUNC_GPIO14);//选择GPIO2
GPIO_DIS_OUTPUT(GPIO_ID_PIN(14)) ; // 设置GPIO2为输入
Led_Cmd(false);
os_timer_disarm( &os_timer );// 关闭该定时器
os_timer_setfn( &os_timer, (ETSTimerFunc *) ( Led_Task_Run ), NULL );// 配置该定时器回调函数
os_timer_arm( &os_timer, 500, true );// 启动该定时器
while(1)
{
system_soft_wdt_feed();//这里我们喂下看门狗 ,不让看门狗复位
if(GPIO_INPUT_GET(GPIO_ID_PIN(14))==0x00)//读取GPIO2的值,按键按下为0
{
delay_ms(20); //延时20MS,去抖
if(GPIO_INPUT_GET(GPIO_ID_PIN(14))==0x00)
{
os_printf("Button_Down\n");
bz++;
if(bz==2)bz=0;
if(bz==1)GPIO_OUTPUT_SET(GPIO_ID_PIN(13), 0); //GPIO16为低
if(bz==0)GPIO_OUTPUT_SET(GPIO_ID_PIN(13), 1); //GPIO16为高
while(GPIO_INPUT_GET(GPIO_ID_PIN(14))==0x00); //等待按键释放
}
}
}
}
后加1:
不能放while1的原因是因为:
8266的程序不像其他单片机一样跑在main函数中。
而user_init()函数只是开放给用户的一个用户程序的初始化接口,用来配置各项功能的参数。
实际程序只有运行到初始化的特定位置的时候,才会调用一次user_init()函数。然后再运行其他的程序。配合这个初始化接口函数的还有回调函数,当初始化完成之后,满足特定条件,程序会调用回调函数,运行回调函数中的代码。
8266中大部分代码都不展示给用户,为不可见代码!也就是大部分时间在跑的代码。
程序结构如下图。