RT-Thread 星火1号学习笔记

LED 闪烁例程

硬件说明

LED 连接在开发板的某个 GPIO 端口上,通过控制该端口的高低电平来实现 LED 的亮灭。

软件说明

  1. 初始化 GPIO 端口
cpp 复制代码
/* 配置 LED 灯引脚 */
#define PIN_LED_B              GET_PIN(F, 11)      // PF11 :  LED_B        --> LED
#define PIN_LED_R              GET_PIN(F, 12)      // PF12 :  LED_R        --> LED
  1. 设置延时,使 LED 闪烁
cpp 复制代码
/* LED 灯 亮 */
rt_pin_write(PIN_LED_R, PIN_LOW);
LOG_D("led on, count: %d", count);
rt_thread_mdelay(500);
/* LED 灯 灭 */
rt_pin_write(PIN_LED_R, PIN_HIGH);
LOG_D("led off");
rt_thread_mdelay(500);

RGB LED 例程

硬件说明

RGB-LED 属于共阳 LED ,阴极分别与单片机的引脚连接,其中红色 LED 对应 PF12 号引脚,蓝色 LED 对应 PF11 号引脚。单片机对应的引脚输出低电平即可点亮对应的 LED ,输出高电平则会熄灭对应的 LED。

软件说明

  1. 配 置 LED 灯 引 脚
cpp 复制代码
#define PIN_LED_B GET_PIN(F, 11) // PF11 : LED_B --> LED
#define PIN_LED_R GET_PIN(F, 12) // PF12 : LED_R --> LED
  1. RGB-LED 灯变换
cpp 复制代码
/* 控 制 RGB 灯 */
rt_pin_write(PIN_LED_R, _blink_tab[group_current][0]);
rt_pin_write(PIN_LED_B, _blink_tab[group_current][1]);
/* 输 出 LOG 信 息 */
LOG_D("group: %d | red led [%-3.3s] | | blue led [%-3.3s]",
	group_current,
	_blink_tab[group_current][0] == LED_ON ? "ON" : "OFF",
	_blink_tab[group_current][1] == LED_ON ? "ON" : "OFF");
count++;
/* 延 时 一 段 时 间 */
rt_thread_mdelay(500);

按键输入例程

硬件说明

KEY0(LEFT) 引脚连接单片机 PC0(LEFT) 引脚, KEY0(LEFT) 按键按下为低电平,松开为高电平

软件说明

  1. KEY0(LEFT) 对应的单片机引脚定义
cpp 复制代码
#define PIN_KEY0 GET_PIN(C, 0) // PC0: KEY0 --> KEY
  1. 为了实验效果清晰可见,板载 RGB 红色 LED 作为 KEY0(LEFT) 的状态指示灯,设置 RGB 红灯引脚的模式为输出模式,然后设置 PIN_KEY0 引脚为输入模式,最后在 while 循环中通过rt_pin_read(PIN_KEY0) 判断KEY0(LEFT) 的电平状态,并作 50ms 的消抖处理,如果成功判断 KEY0(LEFT) 为低电平状态(即按键按
    下)则打印输出 "KEY0 pressed!" 并且指示灯亮,否则指示灯熄灭
cpp 复制代码
/* 读 取 按 键 KEY0 的 引 脚 状 态 */
if (rt_pin_read(PIN_KEY0) == PIN_LOW)
{
	rt_thread_mdelay(50);
	if (rt_pin_read(PIN_KEY0) == PIN_LOW)
	{
		/* 按 键 已 被 按 下, 输 出 log, 点 亮 LED 灯 */
		LOG_D("KEY0 pressed!");
		rt_pin_write(PIN_LED_R, PIN_LOW);
	}
}
else
{
	/* 按 键 没 被 按 下, 熄 灭 LED 灯 */
	rt_pin_write(PIN_LED_R, PIN_HIGH);
}
rt_thread_mdelay(10);
count++;

外部中断控制蜂鸣器例程

硬件说明

软件说明

  1. 查对应原理图可知,WK_UP、KEY1 按下为低电平,松开为高电平。所以在 main 函数中,WK_UP和 KEY1 按键设置为上拉输入模式,PIN_BEEP 引脚设置为输出模式。
  2. 然后使用 rt_pin_attach_irq 函数分别设置 KEY1 和 WK_UP 按键中断为下降沿触发中断并且绑定回调函数、设置回调函数相应的入参, 使用 rt_pin_irq_enable 函数使能这两个按键中断。
cpp 复制代码
/* 使 能 中 断 */
rt_pin_irq_enable(PIN_KEY1, PIN_IRQ_ENABLE);
rt_pin_irq_enable(PIN_WK_UP, PIN_IRQ_ENABLE);
while (1)
{
}
  1. 在中断回调函数中判断入参,根据不同入参进行相应的操作
cpp 复制代码
/* 中 断 回 调 */
void irq_callback(void *args)
{
	rt_uint32_t sign = (rt_uint32_t) args;
	switch (sign)
	{
	case PIN_WK_UP :
		rt_pin_write(PIN_BEEP,PIN_HIGH);
		LOG_D("WK_UP interrupt. beep on.");
		break;
	case PIN_KEY1 :
		rt_pin_write(PIN_BEEP,PIN_LOW);
		LOG_D("KEY1 interrupt. beep off.");
		break;
	default:
		LOG_E("error sign= %d !", sign);
		break;
	}
}

红外遥控例程

硬件说明

红外发射脚 GPIO_IR_TRANSMEET 接单片机引脚 PB1,红外接收头引脚 GPIO_IR_RECV接单片机引脚 PF8(TIM3_CH4 通道)

软件说明

  1. 选择NEC 解码器,初始化 GPIO 引脚。然后在 while 循环中扫描按键、打印输出接收到的红外数据,当 KEY0按下后将会把最近一次接收到的红外数据通过红外发射头发送出去
cpp 复制代码
/* 按 键 扫 描 */
key = key_scan();
if(key == PIN_KEY0)
{
	/* 有 按 键 按 下, 蓝 灯 亮 起 */
	rt_pin_write(PIN_LED_B, PIN_LOW);
	infrared_data.data.nec.repeat = 0;
	/* 发 送 红 外 数 据 */
	infrared_write("nec",&infrared_data);
	rt_thread_mdelay(200);
	LOG_I("SEND OK: addr:0x%02X key:0x%02X repeat:%d",
		infrared_data.data.nec.addr, infrared_data.data.nec.key,
			infrared_data.data.nec.repeat);
}
else if(infrared_read("nec",&infrared_data) == RT_EOK)
{
	/* 读 取 到 红 外 数 据, 红 灯 亮 起 */
	rt_pin_write(PIN_LED_R, PIN_LOW);
	LOG_I("RECEIVE OK: addr:0x%02X key:0x%02X repeat:%d",
		infrared_data.data.nec.addr, infrared_data.data.nec.key,
			infrared_data.data.nec.repeat);
}
rt_thread_mdelay(10);
/* 熄 灭 蓝 灯 */
rt_pin_write(PIN_LED_B, PIN_HIGH);
/* 熄 灭 红 灯 */
rt_pin_write(PIN_LED_R, PIN_HIGH);
count++;
  1. 主要使用了红外软件包的以下三个函数
cpp 复制代码
/* 选 择 解 码 器 */
rt_err_t ir_select_decoder(const char* name);
/* 读 取 红 外 数 据。 */
rt_err_t infrared_read(const char* decoder_name,struct infrared_decoder_data* data);
/* 接 收 红 外 数 据。 */
rt_err_t infrared_write(const char* decoder_name, struct infrared_decoder_data* data
);

RTC 和 RTC 闹钟的使用例程

硬件说明

例程使用的 RTC 设备依赖于 LSE 时钟

软件说明

  1. 在 main 函数中,获取到了 RTC 设备,然后设置一次系统时间,随后获取一次系统时间以便检测时间是否设置成功,最后延时 1s 后再次获取系统时间
cpp 复制代码
/* 设 置 日 期 */
ret = set_date(2018, 12, 3);
if (ret != RT_EOK)
{
	rt_kprintf("set RTC date failed\n");
	return ret;
}
/* 设 置 时 间 */
ret = set_time(11, 15, 50);
if (ret != RT_EOK)
{
	rt_kprintf("set RTC time failed\n");
	return ret;
}
/* 获 取 时 间 */
now = time(RT_NULL);
rt_kprintf("%s\n", ctime(&now));
/* 延 时 1 秒 */
rt_thread_mdelay(1000);
/* 获 取 时 间 */
now = time(RT_NULL);
rt_kprintf("%s\n", ctime(&now));
  1. 下面代码创建可一个 RTC 闹钟,然后设置 5 秒后唤醒,最后把该函数导入 msh 命令行中
cpp 复制代码
void user_alarm_callback(rt_alarm_t alarm, time_t timestamp)
{
	rt_kprintf("user alarm callback function.\n");
}
void alarm_sample(void)
{
	struct rt_alarm_setup setup;
	struct rt_alarm * alarm = RT_NULL;
	static time_t now;
	struct tm p_tm;
	if (alarm != RT_NULL)
	return;
	/* 获 取 当 前 时 间 戳, 并 把 下 5 秒 时 间 设 置 为 闹 钟 时 间 */
	now = time(NULL) + 5;
	gmtime_r(&now,&p_tm);
	setup.flag = RT_ALARM_ONESHOT;
	setup.wktime.tm_year = p_tm.tm_year;
	setup.wktime.tm_mon = p_tm.tm_mon;
	setup.wktime.tm_mday = p_tm.tm_mday;
	setup.wktime.tm_wday = p_tm.tm_wday;
	setup.wktime.tm_hour = p_tm.tm_hour;
	setup.wktime.tm_min = p_tm.tm_min;
	setup.wktime.tm_sec = p_tm.tm_sec;
	alarm = rt_alarm_create(user_alarm_callback, &setup);
	if(RT_NULL != alarm)
	{
		rt_alarm_start(alarm);
	}
}
/* export msh cmd */
MSH_CMD_EXPORT(alarm_sample,alarm sample);

LCD 显示例程

硬件说明

通过 fsmc 模拟出驱动时序和单片机进行通讯。使用了 8 根数据线传输数据,一根地址选择线作为芯片的使能信号

软件说明

  1. 在 main 函数中,通过调用已经封装好的 LCD API 函数,首先执行的是清屏操作,将 LCD 全部刷成白色。然后设置画笔的颜色为黑色,背景色为白色。接着显示 RT-Thread 的 LOGO。最后会显示一些信息,包括 16x16 像素,24x24 像素和 32x32 像素的三行英文字符,一条横线和一个同心圆
cpp 复制代码
/* show RT-Thread logo */
lcd_show_image(0, 0, 240, 69, image_rttlogo);

/* set the background color and foreground color */
lcd_set_color(WHITE, BLACK);

/* show some string on lcd */
lcd_show_string(10, 69, 16, "Hello, RT-Thread!");
lcd_show_string(10, 69 + 16, 24, "RT-Thread");
lcd_show_string(10, 69 + 16 + 24, 32, "RT-Thread");

/* draw a line on lcd */
lcd_draw_line(0, 69 + 16 + 24 + 32, 240, 69 + 16 + 24 + 32);

/* draw a concentric circles */
lcd_draw_point(120, 194);
for (int i = 0; i < 46; i += 4)
{
	lcd_draw_circle(120, 194, i);
}

运行效果

AHT10 温湿度传感器例程

硬件说明

单片机通过软件 iic I2C3(soft) scl(PE0)、I2C3(soft) sda(PE1) 对传感器 aht10 发送命令、读取数据等

软件说明

  1. 初始化传感器 aht10,传入参数 i2c2 为该传感器挂载的 i2c 总线的名称;初始化若失败,则返回空,程序不会被执行,若成功,则返回传感器设备对象;然后将返回的设备对象分别传入读取湿度与温度的函数
cpp 复制代码
/* 等 待 传 感 器 正 常 工 作 */
rt_thread_mdelay(2000);
/* 初 始 化 aht10 */
dev = aht10_init(i2c_bus_name);
if (dev == RT_NULL)
{
	LOG_E("The sensor initializes failure");
	return 0;
}
while (count++ < 100)
{
	/* 读 取 湿 度 */
	humidity = aht10_read_humidity(dev);
	LOG_D("humidity : %d.%d %%", (int)humidity, (int)(humidity * 10) % 10);
	/* 读 取 温 度 */
	temperature = aht10_read_temperature(dev);
	LOG_D("temperature: %d.%d", (int)temperature, (int)(temperature * 10) % 10);
	rt_thread_mdelay(1000);
}

WiFi 管理例程

软件说明

初始化信号量,注册回调函数

cpp 复制代码
/* 执行扫描 */
    rt_sem_init(&scan_done,"scan_done",0,RT_IPC_FLAG_FIFO);
    rt_wlan_register_event_handler(RT_WLAN_EVT_SCAN_REPORT, wlan_scan_report_hander,&i);
    rt_wlan_register_event_handler(RT_WLAN_EVT_SCAN_DONE, wlan_scan_done_hander,RT_NULL);

    if(rt_wlan_scan() == RT_EOK)
    {
        LOG_D("the scan is started... ");
    }else
    {
        LOG_E("scan failed");
    }
    /*等待扫描完毕 */
    rt_sem_take(&scan_done,RT_WAITING_FOREVER);

然后连接一个测试用的 AP (名字: test_ssid , 密码: 12345678 ),并等待联网成功,打印网络信息;接着在等待 5 秒之后,断开和 AP 的连接;最后,调用接口初始化自动连接的相关配置,开启自动连接功能。在开启自动连接之后,Wlan Manager 会根据存储介质中的历史记录进行 AP连接

cpp 复制代码
/* 热点连接 */
    LOG_D("start to connect ap ...");
    rt_sem_init(&net_ready, "net_ready", 0, RT_IPC_FLAG_FIFO);

    /* 注册 wlan ready 回调函数 */
    rt_wlan_register_event_handler(RT_WLAN_EVT_READY, wlan_ready_handler, RT_NULL);
    /* 注册 wlan 断开回调函数 */
    rt_wlan_register_event_handler(RT_WLAN_EVT_STA_DISCONNECTED, wlan_station_disconnect_handler, RT_NULL);
    /* 同步连接热点 */
    result = rt_wlan_connect(WLAN_SSID, WLAN_PASSWORD);
    if (result == RT_EOK)
    {
        rt_memset(&info, 0, sizeof(struct rt_wlan_info));
        /* 获取当前连接热点信息 */
        rt_wlan_get_info(&info);
        LOG_D("station information:");
        print_wlan_information(&info,0);
        /* 等待成功获取 IP */
        result = rt_sem_take(&net_ready, NET_READY_TIME_OUT);
        if (result == RT_EOK)
        {
            LOG_D("networking ready!");
            msh_exec("ifconfig", rt_strlen("ifconfig"));
        }
        else
        {
            LOG_D("wait ip got timeout!");
        }
        /* 回收资源 */
        rt_wlan_unregister_event_handler(RT_WLAN_EVT_READY);
        rt_sem_detach(&net_ready);
    }
    else
    {
        LOG_E("The AP(%s) is connect failed!", WLAN_SSID);
    }

Shell 操作 WiFi

wifi 扫描命令格式

cpp 复制代码
wifi scan

WiFi 连接

cpp 复制代码
wifi join test_ssid 12345678

WiFi 断开

cpp 复制代码
wifi disc

运行效果

MQTT 协议通信例程

硬件说明

依赖星火 1 号板卡上的 WiFi 模块完成网络通信

软件说明

  1. KEY0(LEFT) 对应的单片机引脚定义
cpp 复制代码
#define PIN_KEY0 GET_PIN(C, 0) // PC0: KEY0 --> KEY
  1. 为了实验效果清晰可见,板载 RGB 红色 LED 作为 KEY0(LEFT) 的状态指示灯,设置 RGB 红灯引脚的模式为输出模式,然后设置 PIN_KEY0 引脚为输入模式,最后在 while 循环中通过rt_pin_read(PIN_KEY0) 判断KEY0(LEFT) 的电平状态,并作 50ms 的消抖处理,如果成功判断 KEY0(LEFT) 为低电平状态(即按键按
    下)则打印输出 "KEY0 pressed!" 并且指示灯亮,否则指示灯熄灭
cpp 复制代码
/* 读 取 按 键 KEY0 的 引 脚 状 态 */
if (rt_pin_read(PIN_KEY0) == PIN_LOW)
{
	rt_thread_mdelay(50);
	if (rt_pin_read(PIN_KEY0) == PIN_LOW)
	{
		/* 按 键 已 被 按 下, 输 出 log, 点 亮 LED 灯 */
		LOG_D("KEY0 pressed!");
		rt_pin_write(PIN_LED_R, PIN_LOW);
	}
}
else
{
	/* 按 键 没 被 按 下, 熄 灭 LED 灯 */
	rt_pin_write(PIN_LED_R, PIN_HIGH);
}
rt_thread_mdelay(10);
count++;

运行效果

HTTP Client 功能实现例程

软件说明

要实现设备通过 GET 请求方式从指定服务器中获取数据,之后通过 POST 请求方式上传一段

数据到指定服务器,并接收服务器响应数据

  1. GET 请求发送, 会根据传入的 URL 发送 get 请求然后返回结果存储在 response 里面
cpp 复制代码
int webclient_get_smpl(const char *uri)
{
    char *response = RT_NULL;
    size_t resp_len = 0;
    int index;

    if (webclient_request(uri, RT_NULL, RT_NULL, 0, (void **)&response, &resp_len) < 0)
    {
        rt_kprintf("webclient send get request failed.");
        return -RT_ERROR;
    }

    rt_kprintf("webclient send get request by simplify request interface.\n");
    rt_kprintf("webclient get response data: \n");
    for (index = 0; index < rt_strlen(response); index++)
    {
        rt_kprintf("%c", response[index]);
    }
    rt_kprintf("\n");

    if (response)
    {
        web_free(response);
    }

    return 0;
}
  1. POST 请求发送
cpp 复制代码
int webclient_post_smpl(const char *uri, const char *post_data, size_t data_len)
{
    char *response = RT_NULL;
    char *header = RT_NULL;
    size_t resp_len = 0;
    int index = 0;

    webclient_request_header_add(&header, "Content-Length: %d\r\n", strlen(post_data));
    webclient_request_header_add(&header, "Content-Type: application/octet-stream\r\n");

    if (webclient_request(uri, header, post_data, data_len, (void **)&response, &resp_len) < 0)
    {
        rt_kprintf("webclient send post request failed.");
        web_free(header);
        return -RT_ERROR;
    }

    rt_kprintf("webclient send post request by simplify request interface.\n");
    rt_kprintf("webclient post response data: \n");
    for (index = 0; index < resp_len; index++)
    {
        rt_kprintf("%c", response[index]);
    }
    rt_kprintf("\n");

    if (header)
    {
        web_free(header);
    }

    if (response)
    {
        web_free(response);
    }

    return 0;
}

运行效果

连接成功的回调函数里面启动 http 客户端发送 get 请

求和 post 请求。并且打印返回的结果

TLS 安全连接例程

硬件说明

mbedTLS 例程需要依赖星火 1 号板卡上的 WiFi 模块完成网络通信

软件说明

  1. KEY0(LEFT) 对应的单片机引脚定义
cpp 复制代码
#define PIN_KEY0 GET_PIN(C, 0) // PC0: KEY0 --> KEY
  1. 为了实验效果清晰可见,板载 RGB 红色 LED 作为 KEY0(LEFT) 的状态指示灯,设置 RGB 红灯引脚的模式为输出模式,然后设置 PIN_KEY0 引脚为输入模式,最后在 while 循环中通过rt_pin_read(PIN_KEY0) 判断KEY0(LEFT) 的电平状态,并作 50ms 的消抖处理,如果成功判断 KEY0(LEFT) 为低电平状态(即按键按
    下)则打印输出 "KEY0 pressed!" 并且指示灯亮,否则指示灯熄灭
cpp 复制代码
/* 读 取 按 键 KEY0 的 引 脚 状 态 */
if (rt_pin_read(PIN_KEY0) == PIN_LOW)
{
	rt_thread_mdelay(50);
	if (rt_pin_read(PIN_KEY0) == PIN_LOW)
	{
		/* 按 键 已 被 按 下, 输 出 log, 点 亮 LED 灯 */
		LOG_D("KEY0 pressed!");
		rt_pin_write(PIN_LED_R, PIN_LOW);
	}
}
else
{
	/* 按 键 没 被 按 下, 熄 灭 LED 灯 */
	rt_pin_write(PIN_LED_R, PIN_HIGH);
}
rt_thread_mdelay(10);
count++;
相关推荐
Clockwiseee18 分钟前
文件上传总结
运维·服务器·学习·文件上传
Suckerbin21 分钟前
基于HTTP头部字段的SQL注入:SQLi-labs第17-20关
网络·笔记·网络协议·安全·http·网络安全
苜柠1 小时前
Wpf学习片段
学习
欢乐熊嵌入式编程1 小时前
智能手表固件升级 OTA 策略文档初稿
嵌入式硬件·学习·智能手表
起床学FPGA2 小时前
异步FIFO的学习
学习·fpga开发
依年南台2 小时前
搭建大数据学习的平台
大数据·学习
孤寂大仙v2 小时前
【Linux笔记】——进程信号的产生
linux·服务器·笔记
小虎卫远程打卡app2 小时前
视频编解码学习10之成像技术原理
学习·计算机视觉·视频编解码
愚戏师3 小时前
Linux复习笔记(三) 网络服务配置(web)
linux·运维·笔记
X Y O3 小时前
神经网络初步学习——感知机
人工智能·神经网络·学习·感知机