[ BLE4.0 ] 伦茨ST17H66开发-实现IO的基本输入输出

目录

一、前言

二、闪烁LED

        1.实现代码

        2.问题解决

        2.1关闭睡眠模式

        2.2使能保持模式

三、按键中断

四、工程源码


一、前言

        本文将介绍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立即熄灭。

四、工程源码

        源码已上传:【免费】simpleBlePeripheral-Task-LED.zip资源-CSDN文库

ST17H66伦茨科技最新推出的16脚蓝牙BLE芯片,具有256KB Flash +(96KB ROM)+64KB SRAM的存储空间。该芯片采用了蓝牙协议栈固化的设计,不再占用Flash空间。64KB的SRAM可以分区使用,可以在待机时保存更多用户数据,并支持设置大容量缓冲区,以支持更加复杂的功能。此外,ST17H66符合SIG规范的自组网应用,包括多节点的控制,以及2主4从的同时工作。伦茨科技还拥有自主研发的无线射频和低功耗蓝牙BLE5.2芯片,并提供蓝牙主控全集成芯片的解决方案及核心器件,适用于智能穿戴设备、蓝牙室内导航、智能家居、医疗健康、运动建身、数据传输、远程控制、个人外设及AIoT物联网等场景。\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* *3* [蓝牙方案|伦茨科技亚马逊直连幻彩灯方案](https://blog.csdn.net/Lenzetech/article/details/122939379)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [伦茨科技最新16脚蓝牙BLE5.1芯片-ST17H66](https://blog.csdn.net/Lenzetech/article/details/113542369)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

西西菜鸟

打赏支持获得问题解答机会

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值