LED 闪烁例程
硬件说明
LED 连接在开发板的某个 GPIO 端口上,通过控制该端口的高低电平来实现 LED 的亮灭。
软件说明
- 初始化 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
- 设置延时,使 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。
软件说明
- 配 置 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
- 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) 按键按下为低电平,松开为高电平
软件说明
- KEY0(LEFT) 对应的单片机引脚定义
cpp
#define PIN_KEY0 GET_PIN(C, 0) // PC0: KEY0 --> KEY
- 为了实验效果清晰可见,板载 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++;
外部中断控制蜂鸣器例程
硬件说明
软件说明
- 查对应原理图可知,WK_UP、KEY1 按下为低电平,松开为高电平。所以在 main 函数中,WK_UP和 KEY1 按键设置为上拉输入模式,PIN_BEEP 引脚设置为输出模式。
- 然后使用 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)
{
}
- 在中断回调函数中判断入参,根据不同入参进行相应的操作
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 通道)
软件说明
- 选择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++;
- 主要使用了红外软件包的以下三个函数
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 时钟
软件说明
- 在 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));
- 下面代码创建可一个 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 根数据线传输数据,一根地址选择线作为芯片的使能信号
软件说明
- 在 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 发送命令、读取数据等
软件说明
- 初始化传感器 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 模块完成网络通信
软件说明
- KEY0(LEFT) 对应的单片机引脚定义
cpp
#define PIN_KEY0 GET_PIN(C, 0) // PC0: KEY0 --> KEY
- 为了实验效果清晰可见,板载 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 请求方式上传一段
数据到指定服务器,并接收服务器响应数据
- 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;
}
- 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 模块完成网络通信
软件说明
- KEY0(LEFT) 对应的单片机引脚定义
cpp
#define PIN_KEY0 GET_PIN(C, 0) // PC0: KEY0 --> KEY
- 为了实验效果清晰可见,板载 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++;