LED 闪烁例程
硬件说明
LED 连接在开发板的某个 GPIO 端口上,通过控制该端口的高低电平来实现 LED 的亮灭。
软件说明
- 初始化 GPIO 端口
/* 配置 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 闪烁
/* 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 灯 引 脚
#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 灯变换
/* 控 制 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) 对应的单片机引脚定义
#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!” 并且指示灯亮,否则指示灯熄灭
/* 读 取 按 键 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 函数使能这两个按键中断。
/* 使 能 中 断 */
rt_pin_irq_enable(PIN_KEY1, PIN_IRQ_ENABLE);
rt_pin_irq_enable(PIN_WK_UP, PIN_IRQ_ENABLE);
while (1)
{
}
- 在中断回调函数中判断入参,根据不同入参进行相应的操作
/* 中 断 回 调 */
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按下后将会把最近一次接收到的红外数据通过红外发射头发送出去
/* 按 键 扫 描 */
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++;
- 主要使用了红外软件包的以下三个函数
/* 选 择 解 码 器 */
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 后再次获取系统时间
/* 设 置 日 期 */
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 命令行中
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 像素的三行英文字符,一条横线和一个同心圆
/* 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 总线的名称;初始化若失败,则返回空,程序不会被执行,若成功,则返回传感器设备对象;然后将返回的设备对象分别传入读取湿度与温度的函数
/* 等 待 传 感 器 正 常 工 作 */
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 管理例程
软件说明
初始化信号量,注册回调函数
/* 执行扫描 */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连接
/* 热点连接 */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 扫描命令格式
wifi scan
WiFi 连接
wifi join test_ssid 12345678
WiFi 断开
wifi disc
运行效果
MQTT 协议通信例程
硬件说明
依赖星火 1 号板卡上的 WiFi 模块完成网络通信
软件说明
- KEY0(LEFT) 对应的单片机引脚定义
#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!” 并且指示灯亮,否则指示灯熄灭
/* 读 取 按 键 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 里面
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 请求发送
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) 对应的单片机引脚定义
#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!” 并且指示灯亮,否则指示灯熄灭
/* 读 取 按 键 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++;