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++;
相关推荐
6.941 小时前
Scala——身份证号码查询籍贯
学习·scala
爱吃西瓜的小菜鸡1 小时前
【C语言】矩阵乘法
c语言·学习·算法
西洼工作室2 小时前
【java 正则表达式 笔记】
java·笔记·正则表达式
初学者7.2 小时前
Webpack学习笔记(2)
笔记·学习·webpack
新手上路狂踩坑3 小时前
Android Studio的笔记--BusyBox相关
android·linux·笔记·android studio·busybox
创意锦囊5 小时前
随时随地编码,高效算法学习工具—E时代IDE
ide·学习·算法
stm 学习ing5 小时前
HDLBits训练3
c语言·经验分享·笔记·算法·fpga·eda·verilog hdl
尘觉5 小时前
算法的学习笔记—扑克牌顺子(牛客JZ61)
数据结构·笔记·学习·算法
1 9 J5 小时前
Java 上机实践11(组件及事件处理)
java·开发语言·学习·算法
Blankspace学5 小时前
Wireshark软件下载安装及基础
网络·学习·测试工具·网络安全·wireshark