- env配置
在bsp的env钟开启SignalLed软件包
RT-Thread online packages
peripheral libraries and drivers --->
[*] SignalLed:a signal led package for rt-thread
- 本文背景
软件包作者在以下链接中提供了一个例子https://github.com/WKJay/SignalLed#readme,但是在这个例子中作者并没有将信号灯主心跳函数写在线程中或者定时器中。这导致了在测试过程中,如果使用这个例子,就无法在测试后自动退出例程,回到tshell界面。
- 解决方法
自行编写测试函数,导出到msh命令列表中。下面的例子适用于潘多拉STM32L4 IoT开发板。将该例子放到Keil工程的Application分组中即可。
#include <rtthread.h>
#include <rtdevice.h>
#include <board.h>
#include "drv_gpio.h"
#include "signal_led.h"
/*
* 程序清单:信号灯线程 signal_led_example.c
*
*/
//定义信号灯的硬件引脚
#define LED0_PIN PIN_LED_R
#include "signal_led.h"
//定义信号灯对象
led led0;
/* 设置信号灯一个周期内的闪烁模式
* 格式为 “亮、灭、亮、灭、亮、灭 …………” 长度不限
* 注意: 该配置单位为毫秒,且必须大于 “LED_TICK_TIME” 宏,且为整数倍(不为整数倍则向下取整处理)
* 必须以英文逗号为间隔,且以英文逗号结尾,字符串内只允许有数字及逗号,不得有其他字符出现
*/
char *led0BlinkMode = "200,200,200,200,200,1000,";
//定义开灯函数
void led0_switch_on(void)
{
rt_pin_write(LED0_PIN, PIN_LOW);
}
//定义关灯函数
void led0_switch_off(void)
{
rt_pin_write(LED0_PIN, PIN_HIGH);
}
/* 定时器的控制块 */
static rt_timer_t timer_led;
/* 定时器 timer_led 超时函数 */
static void timeout_led(void *parameter)
{
//检测还剩的循环次数,当次数减到0时就停止定时器并删除它
//uint8_t count = led0.loopTemp;
//if(count == 0)
//{
//rt_timer_stop(timer_led);
//rt_timer_delete(timer_led);
//}
//每隔 LED_TICK_TIME(50) 毫秒循环调用心跳函数
led_ticks();
}
/* 信号灯示例 */
int signal_led_sample(void)
{
//初始化信号灯对象
led_init(&led0, LED0_PIN, led0_switch_on, led0_switch_off);
//设置信号灯工作模式,循环5次
led_set_mode(&led0, 5, led0BlinkMode);
/* 创建定时器1 周期定时器 */
timer_led = rt_timer_create("led_timer", timeout_led,
RT_NULL, LED_TICK_TIME,
RT_TIMER_FLAG_PERIODIC);
/* 启动定时器1 */
if (timer_led != RT_NULL) rt_timer_start(timer_led);
//开启信号灯
led_start(&led0);
return 0;
}
/* 导出到 msh 命令列表中 */
MSH_CMD_EXPORT(signal_led_sample, led start sample);
参考资料: