目录
一、前言
本文将介绍ST17H66的基本输入和输出功能,主要实现任务为闪烁LED灯、按键中断响应。本文所使用的基础工程是基于OSAL创建自己的Task任务文章所实现的源码。
二、闪烁LED
1.实现代码
首先,查阅手册。找到IO口的使用方法。
根据其描述的相关要求,我们选择P20作为LED输出口。
向下找到GPIO的输出代码示例。
将其输出代码示例,我们完成一个两秒翻转一次LED的程序。
#include "MyTask.h"
uint8 Mytask_id;
bool led_flag = false;
void MyTask_Init( uint8 task_id ){
//保存任务id
Mytask_id = task_id;
//补全LED初始化代码
hal_gpio_pin_init(P20,GPIO_OUTPUT);
//2S闪烁一次
osal_start_reload_timer(Mytask_id,MyTask_LEDBL_EVT,2000);
//初始化完成事件
osal_set_event(task_id,MyTask_INIT_EVT);
}
uint16 MyTask_ProcessEvent( uint8 task_id, uint16 events ){
if(events & MyTask_INIT_EVT)
{
//创建任务定时器
osal_start_reload_timer(Mytask_id,MyTask_SIMPLE_EVT,2000);
return events ^ MyTask_INIT_EVT;
}
else if(events & MyTask_SIMPLE_EVT)
{
LOG("OutPut...\n");
return events ^ MyTask_SIMPLE_EVT;
}
else if(events & MyTask_LEDBL_EVT)
{
led_flag = !led_flag;
if(led_flag)
hal_gpio_write(P20,1);
else
hal_gpio_write(P20,0);
return events ^ MyTask_LEDBL_EVT;
}
return 0;
}
将程序烧录进开发板,发现效果并不理想,LED闪烁,但不是我们想要的亮-灭-亮的保持。
2.问题解决
经查阅开发用户手册,我们可以发现,工程默认是使能了PWR_MODE_SLEEP模式,而这导致了我们的LED灯一直不能保持状态。
针对这个问题,我们有两种解决方案。
2.1关闭睡眠模式
如果我们不需要低功耗模式,那么可以关闭睡眠模式。打开宏定义,将PWR_MODE_SLEEP改为PWR_MODE_NO_SLEEP。
重新编译并烧录,可以看到效果实现。
2.2使能保持模式
如果我们需要低功耗,即开启睡眠模式,但是有需要LED闪烁,应该怎么办呢?
其实,官方为我们提供了一种方法,可以在睡眠时,保持状态。
我们只需要在初始化的时候,使能该引脚的保持功能即可。
void MyTask_Init( uint8 task_id ){
//保存任务id
Mytask_id = task_id;
//补全LED初始化代码
hal_gpio_pin_init(P20,GPIO_OUTPUT);
//使能保持
hal_gpioretention_register(P20);
//2S闪烁一次
osal_start_reload_timer(Mytask_id,MyTask_LEDBL_EVT,2000);
//初始化完成事件
osal_set_event(task_id,MyTask_INIT_EVT);
}
通过这两种方法,实现闪烁LED的效果就顺利实现了。
三、按键中断
我们使用P18作为外部中断源,设置其下降沿为中断触发方式。实现按下按键控制LED灯立即熄灭,闪烁模式不管,只让LED暂时熄灭即可。
查阅手册,你能够发现官方提供的例程。
当你抄上以后,发现不对?!没有效果。这时我们反过来再看手册。原来是需要先使能。
再往下看,还需要引脚不能是高阻态,此处我们选择下降沿触发,所以设置为强上拉。
根据要求,修改完善程序。
//使能按键中断
hal_gpio_pin_init(P18,IE);
hal_gpio_pull_set(P18,STRONG_PULL_UP);
hal_gpioin_enable(P18);
hal_gpioin_register(P18,NULL,negedge_int_wakeup_cb);
中断处理函数代码:
__ATTR_SECTION_SRAM__ void negedge_int_wakeup_cb(GPIO_Pin_e pin,IO_Wakeup_Pol_e type)
{
if(type == NEGEDGE)
{
hal_gpio_write(P20,0);
}
else
{
AT_LOG("error\n");
}
}
烧录程序后,可以通过按键控制LED立即熄灭。