update evb_lx doc
@@ -1,17 +1,19 @@
|
||||
# TencentOS tiny定制开发板EVB_LX快速入门指南
|
||||
# GD32V-RISC-V物联网操作系统TencentOS-Tiny案例实践指南
|
||||
|
||||
| Revision | Date | Description |
|
||||
| -------- | --------- | ----------- |
|
||||
| 1.0 | 2020-2-12 | 文档初版 |
|
||||
| 2.0 | 2021-12-20 | GD32V-RISC-V物联网操作系统TencentOS-Tiny案例实践指南 |
|
||||
|
||||
## 1. 定制开发板EVB_LX硬件简介
|
||||
## 一、定制开发板EVB_LX硬件简介
|
||||
|
||||
### 1.1 开发板简介
|
||||
|
||||
EVB_LX+是腾讯物联网操作系统TencentOS tiny 团队联合兆易创新(GD32)、南京厚德物联网有限公司三方合作设计的一款物联网评估板,用于TencentOS tiny 基础内核、RISC-V新IP核架构和IoT组件功能体验和评估。
|
||||
开发板功能图如下所示:
|
||||
|
||||

|
||||
|
||||
|
||||
### 1.2 开发板特性
|
||||
**CPU** :GD32VF103RBT6, 108MHz,128K Flash,32KB SRAM
|
||||
|
||||
@@ -102,64 +104,679 @@ OLED液晶显示模块用来向用户显示系统状态、参数或者要输入
|
||||
Micro USB线的功能是供电及调试,将线一头与开发板的Micro接口(GD-Link)连接,另一头接到电脑的USB口上。(程序下载完了,也可以把usb线接到pc uart的端口,用于打印日志)
|
||||

|
||||
|
||||
## 二、 定制开发板EVB_LX软件开发环境准备
|
||||
|
||||
### 2.1 MounRiver Studio IDE下载与安装
|
||||
|
||||
MounRiver Studio(MRS)是一款面向RISC-V、ARM等内核MCU的集成开发环境,提供专业嵌入式项目所需的开发、调试环境、烧录工具已经完善的项目管理能力,是目前使用相对方便的GD32V开发环境。这里我们使用该IDE来进行risc-v相关应用开发。首先,我们到MounRiver Studio官网下载软件安装包,下载地址:http://www.mounriver.com/download
|
||||
|
||||

|
||||
|
||||
安装完成后打开软件可以进入到欢迎界面
|
||||
|
||||

|
||||
|
||||
|
||||
### 2.2 新建GD32V工程
|
||||
|
||||
菜单栏点击File->New->MounRiver project 开始创建工程
|
||||
|
||||

|
||||
|
||||
进入工程向导后,按照如下图所示选择芯片,填写工程信息。
|
||||
|
||||

|
||||
|
||||
完成后会生成工程,如图所示:
|
||||
|
||||

|
||||
|
||||
### 2.3 编译下载调试GD32V工程
|
||||
|
||||
MRS IDE导入的是默认的LED闪灯程序,由于我们开发板EVB LX的LED灯跟兆易创新官方评估板的GPIO不一样,使用的GPIOB,Pin2,这里我们修改下main.c中的led初始化代码。
|
||||
将如下代码复制替换main.c文件中的全部代码:
|
||||
|
||||
```
|
||||
#include "gd32vf103.h"
|
||||
#include "gd32vf103r_start.h"
|
||||
#include "systick.h"
|
||||
|
||||
void led_init(void);
|
||||
|
||||
/*!
|
||||
\brief main function
|
||||
\param[in] none
|
||||
\param[out] none
|
||||
\retval none
|
||||
*/
|
||||
int main(void)
|
||||
{
|
||||
led_init();
|
||||
|
||||
while(1){
|
||||
/* turn on LED */
|
||||
gpio_bit_set(GPIOB, GPIO_PIN_2);
|
||||
/* insert 200 ms delay */
|
||||
delay_1ms(200);
|
||||
|
||||
/* turn off LED */
|
||||
gpio_bit_reset(GPIOB, GPIO_PIN_2);
|
||||
|
||||
/* insert 200 ms delay */
|
||||
delay_1ms(200);
|
||||
}
|
||||
}
|
||||
|
||||
/*!
|
||||
\brief initialize the LEDs
|
||||
\param[in] none
|
||||
\param[out] none
|
||||
\retval none
|
||||
*/
|
||||
void led_init(void)
|
||||
{
|
||||
/* enable the LED clock */
|
||||
rcu_periph_clock_enable(RCU_GPIOB);
|
||||
/* configure LED GPIO port */
|
||||
gpio_init(GPIOB, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_2);
|
||||
|
||||
/* turn off LED */
|
||||
gpio_bit_reset(GPIOB, GPIO_PIN_2);
|
||||
}
|
||||
```
|
||||
|
||||
完成代码拷贝覆盖后,点击如下图所示图标编译工程,编译完成后可以在控制台输出看到编译结果。
|
||||
|
||||

|
||||
|
||||
如下图所示,点击debug按钮,就可以进入调试模式,程序下载到开发板上,可以打断点、单步、跳步执行,全速执行,查看寄存器,反汇编、内存等
|
||||
|
||||

|
||||
|
||||
执行全速运行后,可以看到开发板上的用户LED灯间隔闪烁。
|
||||
|
||||
除了调试按钮外,我们也可以点击下载按钮直接将程序烧写到开发板上,如下图所示:
|
||||
|
||||

|
||||
|
||||
本实验代码下载链接:https://share.weiyun.com/4XXWaOzU 密码:cy4m5f
|
||||
|
||||
GD32V-RISC-V物联网操作系统TencentOS-Tiny案例实践指南(20211220)\SourceCode\EVB_LX_GD32V_LED.rar
|
||||
|
||||
## 三、TencentOS Tiny内核移植
|
||||
|
||||
### 3.1 准备裸机工程
|
||||
移植TencentOS Tiny内核前,我们先准备一个简单的点灯工程,这里跟前面的步骤一样,我们先使用MounRiver Studio IDE 基于GD32V生成基础工程;
|
||||
基础的裸机工程包含LED、串口、液晶显示屏驱动。这里我把裸机工程给大家准备好了,大家下载EVB_LX_GD32V_Printf_Lcd.rar 解压后使用IDE打开即可。
|
||||
裸机工程代码下载链接:https://share.weiyun.com/4XXWaOzU 密码:cy4m5f
|
||||
|
||||
GD32V-RISC-V物联网操作系统TencentOS-Tiny案例实践指南(20211220)\SourceCode\EVB_LX_GD32V_Printf_Lcd.rar
|
||||
|
||||
### 3.2 准备内核源码
|
||||
在TencentOS Tiny 官方项目仓下载内核代码,下载地址: https://github.com/Tencent/TencentOS-tiny
|
||||
|
||||
拷贝如下目录的内核代码到新建的TencentOS-Tiny文件夹备用(请严格按照一下目录拷贝,不需要拷贝多余的)
|
||||
|
||||
| 一级目录 | 二级目录 | 三级目录 | 四级目录 | 五级目录 | 说明 |
|
||||
| ---------- | -------- | -------- | --------- | -------- | ---------------------------------------------------- |
|
||||
| arch | arm | risc-v | common | | TencentOS tiny 中断tick相关代码 |
|
||||
| | | | rv32i | gcc | TencentOS Tiny risc-v调度汇编 GCC |
|
||||
| | | | bumblebee | gcc | GD32V 中断配置相关代码 |
|
||||
| kernel | core | | | | TencentOS tiny内核源码 |
|
||||
| | hal | | | | TencentOS tiny驱动抽象层 |
|
||||
| | pm | | | | TencentOS tiny低功耗源码 |
|
||||
| TOS_CONFIG | | | | | TencentOS tiny配置头文件,用户自定义,从模板修改过来 |
|
||||
|
||||
|
||||
这里只介绍TencentOS tiny的内核移植,所以这里只需要用到 arch、kernel两个目录下的源码。
|
||||
|
||||
将全部内核源码复制到工程目录下,如下图:
|
||||
|
||||

|
||||
|
||||
然后我们在工程界面按F5刷新工程,就可以在源码目录看到TencentOS Tiny的内核源码了,如图所示:
|
||||
|
||||

|
||||
|
||||
### 3.3 添加内核初始化和相关任务代码
|
||||
|
||||
|
||||
1)首先在main.c 中包含内核头文件 #include "tos_k.h"
|
||||
|
||||
2)添加Tick处理函数 eclic_mtip_handler
|
||||
|
||||
```
|
||||
void eclic_mtip_handler() {
|
||||
port_systick_config((uint32_t)k_cpu_cycle_per_tick);
|
||||
if (tos_knl_is_running()) {
|
||||
tos_knl_irq_enter();
|
||||
tos_tick_handler();
|
||||
tos_knl_irq_leave();
|
||||
}
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
3) 新建两个测试任务
|
||||
|
||||
```
|
||||
#define TASK1_STK_SIZE 1024
|
||||
k_task_t task1;
|
||||
uint8_t task1_stk[TASK1_STK_SIZE];
|
||||
|
||||
|
||||
#define TASK2_STK_SIZE 1024
|
||||
k_task_t task2;
|
||||
uint8_t task2_stk[TASK2_STK_SIZE];
|
||||
|
||||
void task1_entry(void *arg)
|
||||
{
|
||||
int count = 0;
|
||||
while (1) {
|
||||
printf("###I am task1,count is %d\r\n",count++);
|
||||
tos_task_delay(2000);
|
||||
}
|
||||
}
|
||||
|
||||
void task2_entry(void *arg)
|
||||
{
|
||||
int count = 0;
|
||||
while (1) {
|
||||
printf("***I am task2,count is %d\r\n",count++);
|
||||
tos_task_delay(1000);
|
||||
}
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
4) 在main函数中while(1)前面增加操作系统初始化函数
|
||||
|
||||
|
||||
```
|
||||
printf("Welcome to TencentOS tiny(%s)\r\n", TOS_VERSION);
|
||||
tos_knl_init(); // TencentOS Tiny kernel initialize
|
||||
tos_task_create(&task1, "task1", task1_entry, NULL, 4, task1_stk, TASK1_STK_SIZE, 0); // Create task1
|
||||
tos_task_create(&task2, "task2", task2_entry, NULL, 3, task2_stk, TASK2_STK_SIZE, 0);// Create task2
|
||||
tos_knl_start();
|
||||
|
||||
|
||||
```
|
||||
|
||||
5)在工程里面配置TencentOS Tiny 头文件编译目录
|
||||
|
||||
如图,需要在IDE里面配置TencentOS Tiny的编译头文件目录,按如图所示配置即可:
|
||||

|
||||
|
||||
除了增加C编译的头文件,还要增加汇编文件的头文件目录,如下图所示:
|
||||
|
||||

|
||||
|
||||
6) 修改tos_config.h文件
|
||||
|
||||
我们在TencentOS_Tiny文件下新建TOS_CONFIG文件夹,在改文件夹下面新建tos_config.h,代码如下:
|
||||
|
||||
|
||||
```
|
||||
#ifndef INC_TOS_CONFIG_H_
|
||||
#define INC_TOS_CONFIG_H_
|
||||
|
||||
#include "gd32vf103.h"
|
||||
#include "stddef.h"
|
||||
|
||||
|
||||
#define TOS_CFG_TASK_PRIO_MAX 10u // 配置TencentOS tiny默认支持的最大优先级数量
|
||||
|
||||
|
||||
#define TOS_CFG_ROUND_ROBIN_EN 0u // 配置TencentOS tiny的内核是否开启时间片轮转
|
||||
|
||||
|
||||
#define TOS_CFG_OBJECT_VERIFY 0u // 配置TencentOS tiny是否校验指针合法
|
||||
|
||||
#define TOS_CFG_TASK_DYNAMIC_CREATE_EN 0u // TencentOS tiny 动态任务创建功能宏
|
||||
|
||||
|
||||
#define TOS_CFG_EVENT_EN 1u // TencentOS tiny 事件模块功能宏
|
||||
|
||||
#define TOS_CFG_MMBLK_EN 1u //配置TencentOS tiny是否开启内存块管理模块
|
||||
|
||||
#define TOS_CFG_MMHEAP_EN 1u //配置TencentOS tiny是否开启动态内存模块
|
||||
|
||||
#define TOS_CFG_MMHEAP_DEFAULT_POOL_EN 1u // TencentOS tiny 默认动态内存池功能宏
|
||||
|
||||
#define TOS_CFG_MMHEAP_DEFAULT_POOL_SIZE 0x1000 // 配置TencentOS tiny默认动态内存池大小
|
||||
|
||||
|
||||
#define TOS_CFG_MUTEX_EN 1u // 配置TencentOS tiny是否开启互斥锁模块
|
||||
|
||||
#define TOS_CFG_MESSAGE_QUEUE_EN 1u // 配置TencentOS tiny是否开启消息队列模块
|
||||
|
||||
#define TOS_CFG_MAIL_QUEUE_EN 1u // 配置TencentOS tiny是否开启消息邮箱模块
|
||||
|
||||
#define TOS_CFG_PRIORITY_MESSAGE_QUEUE_EN 1u // 配置TencentOS tiny是否开启优先级消息队列模块
|
||||
|
||||
#define TOS_CFG_PRIORITY_MAIL_QUEUE_EN 1u // 配置TencentOS tiny是否开启优先级消息邮箱模块
|
||||
|
||||
#define TOS_CFG_TIMER_EN 0u // 配置TencentOS tiny是否开启软件定时器模块
|
||||
|
||||
#define TOS_CFG_PWR_MGR_EN 0u // 配置TencentOS tiny是否开启外设电源管理模块
|
||||
|
||||
#define TOS_CFG_TICKLESS_EN 0u // 配置Tickless 低功耗模块开关
|
||||
|
||||
|
||||
#define TOS_CFG_SEM_EN 1u // 配置TencentOS tiny是否开启信号量模块
|
||||
|
||||
#define TOS_CFG_TASK_STACK_DRAUGHT_DEPTH_DETACT_EN 0u // 配置TencentOS tiny是否开启任务栈深度检测
|
||||
|
||||
#define TOS_CFG_IDLE_TASK_STK_SIZE 512u // 配置TencentOS tiny空闲任务栈大小
|
||||
|
||||
|
||||
#define TOS_CFG_CPU_SYSTICK_PRIO 0xF
|
||||
|
||||
|
||||
#define TOS_CFG_IRQ_STK_SIZE 128u
|
||||
|
||||
|
||||
#define TOS_CFG_CPU_TICK_PER_SECOND 1000u // 配置TencentOS tiny的tick频率
|
||||
|
||||
#define TOS_CFG_CPU_CLOCK (SystemCoreClock) // 配置TencentOS tiny CPU频率
|
||||
|
||||
|
||||
#define TOS_CFG_TIMER_AS_PROC 1u // 配置是否将TIMER配置成函数模式
|
||||
|
||||
|
||||
|
||||
#endif /* INC_TOS_CONFIG_H_ */
|
||||
|
||||
|
||||
|
||||
```
|
||||
|
||||
7)编译下载测试
|
||||
|
||||
编译完成下载到开发板,通过串口助手我们可以看到两个任务交替运行,打印task信息,说明内核移植成功,如下图所示:
|
||||
|
||||

|
||||
|
||||
本实验代码下载链接:https://share.weiyun.com/4XXWaOzU 密码:cy4m5f
|
||||
|
||||
GD32V-RISC-V物联网操作系统TencentOS-Tiny案例实践指南(20211220)\SourceCode\EVB_LX_GD32V_TencentOS_Tiny.rar
|
||||
|
||||
|
||||
## 四、 基于TencentOS Tiny 和E53_SC1模块采集光照强度实验
|
||||
|
||||
1) E53_SC1 扩展模块介绍
|
||||
E53_SC1扩展模块包含一个BH1750 传感器和一个高亮LED灯,功能示意图如下:
|
||||
|
||||

|
||||
|
||||
将模块插到开发板的E53接口即可
|
||||
|
||||
2) 编写BH1750驱动
|
||||
BH1750FIV是一个采用标准IIC总线接口的环境光强传感器,共有六种工作模式,分为连续型和一次型,连续型又分为高精度1、2和低精度模式,单次型同样分为高精度1、2和低精度模式。单次型与连续型的区别在于单次型读完一次数据就会自动转为PowerDown模式。
|
||||
比如一次型低分辨率模式的时序图如下图所示:
|
||||
|
||||

|
||||
|
||||
根据时序,编写的核心驱动程序如下,对BH1750 传感器进行初始化、启动测量,等待测量结果,读取测量值。
|
||||
|
||||
|
||||
```
|
||||
|
||||
void Init_BH1750(void)
|
||||
{
|
||||
uint8_t t_Data = 0x01;
|
||||
/* configure GPIO */
|
||||
gpio_config();
|
||||
/* configure I2C */
|
||||
i2c_config();
|
||||
|
||||
BH1750_I2C_Master_Transmit(BH1750_Addr,&t_Data,1);
|
||||
}
|
||||
|
||||
|
||||
void Start_BH1750(void)
|
||||
{
|
||||
uint8_t t_Data = 0x10;
|
||||
BH1750_I2C_Master_Transmit(BH1750_Addr,&t_Data,1);
|
||||
}
|
||||
|
||||
|
||||
void Init_E53_SC1(void)
|
||||
{
|
||||
Init_Light();
|
||||
Init_BH1750();
|
||||
}
|
||||
|
||||
void E53_SC1_Read_Data(void)
|
||||
{
|
||||
|
||||
Start_BH1750();
|
||||
delay_ms(180);
|
||||
BH1750_I2C_Master_Receive(BH1750_Addr+1,BUF,2);
|
||||
result=BUF[0];
|
||||
result=(result<<8)+BUF[1];
|
||||
E53_SC1_Data.Lux=(float)(result/1.2);
|
||||
|
||||
}
|
||||
|
||||
|
||||
```
|
||||
|
||||
3)基于上个章节移植好的TencentOS Tiny工程,在其中一个任务1中添加E53_SC1初始化,获取光照强度,打印在串口,并显示在液晶屏OLED上
|
||||
|
||||
详细代码如下:
|
||||
|
||||
|
||||
```
|
||||
void task1_entry(void *arg)
|
||||
{
|
||||
int count = 1;
|
||||
Init_E53_SC1();
|
||||
E53_SC1_LED_StatusSet(OFF);
|
||||
while (1) {
|
||||
printf("###I am task1,count is %d\r\n",count++);
|
||||
if (count/10==1)
|
||||
{
|
||||
E53_SC1_LED_StatusSet(ON);// Open E53 led
|
||||
}
|
||||
else if (count/10==6) {
|
||||
E53_SC1_LED_StatusSet(OFF);// Open E53 led
|
||||
}
|
||||
E53_SC1_Read_Data();
|
||||
printf("\r\n********E53_SC1_BH1750 Value is %d\r\n",(int)E53_SC1_Data.Lux);
|
||||
memset(payload, 0, sizeof(payload));
|
||||
snprintf(payload,sizeof(payload),"%d ",(int)E53_SC1_Data.Lux);
|
||||
OLED_ShowString(48, 3, (uint8_t*)payload, 8);
|
||||
|
||||
tos_task_delay(100);
|
||||
}
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
编译完成,可以在开发板上看到液晶屏实时显示了光照强度值,单位LUX;
|
||||
|
||||

|
||||
|
||||
同时串口会打印相应的logo,如下图:
|
||||
|
||||

|
||||
|
||||
|
||||
本实验代码下载链接:https://share.weiyun.com/4XXWaOzU 密码:cy4m5f
|
||||
|
||||
GD32V-RISC-V物联网操作系统TencentOS-Tiny案例实践指南(20211220)\SourceCode\EVB_LX_GD32V_TencentOS_Tiny_BH1750.rar
|
||||
|
||||
## 五、基于TencentOS Tiny 将 BH1750传感器采集的光照强度数据上传到腾讯云物联网平台和腾讯连连小程序
|
||||
|
||||
|
||||
基于TencentOS Tiny EVB LX RISC-V开发板要完成腾讯云IoT Explorer对接,需要完成两个部分的工作。
|
||||
一是:腾讯云IoT explorer 上完成项目、产品、设备创建、参数配置
|
||||
二是:基于TencentOS Tiny完成应用开发,向腾讯云上报业务数据。
|
||||
|
||||
|
||||
### 1. 云端操作步骤
|
||||
1.1. 新建项目
|
||||
登录[腾讯云物联网开发平台](https://cloud.tencent.com/product/iotexplorer),点击新建项目,填写项目名称和简介:
|
||||
|
||||

|
||||
|
||||
1.2. 新建产品
|
||||
点击项目名称进入到该项目中,点击新建产品:
|
||||
|
||||

|
||||
|
||||
产品新建成功后,可在产品列表页查看到:
|
||||
|
||||

|
||||
|
||||
1.3. 数据模板
|
||||
进入产品,点击【数据模板】,点击【导入JSON】,导入下面的JSON代码:
|
||||
```json
|
||||
{
|
||||
"version": "1.0",
|
||||
"properties": [
|
||||
{
|
||||
"id": "power_switch",
|
||||
"name": "电灯开关",
|
||||
"desc": "控制电灯开灭",
|
||||
"required": true,
|
||||
"mode": "rw",
|
||||
"define": {
|
||||
"type": "bool",
|
||||
"mapping": {
|
||||
"0": "关",
|
||||
"1": "开"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "brightness",
|
||||
"name": "光照强度",
|
||||
"desc": "",
|
||||
"mode": "r",
|
||||
"define": {
|
||||
"type": "int",
|
||||
"min": "0",
|
||||
"max": "20000",
|
||||
"start": "0",
|
||||
"step": "1",
|
||||
"unit": "lx"
|
||||
},
|
||||
"required": false
|
||||
}
|
||||
],
|
||||
"events": [],
|
||||
"actions": [],
|
||||
"profile": {
|
||||
"ProductId": "TCC64FUFGD",
|
||||
"CategoryId": "3"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
导入之后自动根据json文件创建的属性如下:
|
||||
|
||||

|
||||
|
||||
1.4. 创建设备
|
||||
点击【设备调试】,进入后点击【新建设备】,创建真实设备:
|
||||
|
||||

|
||||
|
||||
创建成功之后进入设备,查看到产品ID、设备名称、设备秘钥,记录下来,一会终端程序会使用到。
|
||||
|
||||

|
||||
|
||||
|
||||
### 2. 基于TencentOS Tiny 完成设备侧应用开发
|
||||
|
||||
本实验代码下载链接:https://share.weiyun.com/4XXWaOzU 密码:cy4m5f
|
||||
|
||||
GD32V-RISC-V物联网操作系统TencentOS-Tiny案例实践指南(20211220)\SourceCode\EVB_LX_GD32V_TencentOS_Tiny_IoT_Explorer.rar
|
||||
|
||||
进入 < EVB_LX_GD32V_TencentOS_Tiny_IoT_Explorer> 目录,打开EVB_LX_GD32V_TencentOS_Tiny_IoT_Explorer工程。
|
||||
|
||||

|
||||
|
||||
2.1. 修改WIFI接入信息
|
||||
打开`main.c`文件编辑,在application_entry函数中修改要接入WIFI的名称和密码(建议使用手机热点,不要有特殊字符):
|
||||
|
||||

|
||||
|
||||
2.2. 修改云端对接信息
|
||||
终端的MQTT客户端需要对应的产品ID、设备ID,密码,我们使用前面从云端获取到的产品ID、设备名称、设备密钥,然后利用如下的python脚本来生成mqtt 用户名 密码等信息:
|
||||
|
||||
python脚本如下,也可以到https://github.com/OpenAtomFoundation/TencentOS-tiny/blob/master/tools/mqtt_config_gen.py 获取。
|
||||
|
||||
```
|
||||
#!/usr/bin/python
|
||||
# -*- coding: UTF-8 -*-
|
||||
|
||||
import base64
|
||||
import hashlib
|
||||
import hmac
|
||||
import random
|
||||
import string
|
||||
import time
|
||||
from string import Template
|
||||
|
||||
# bind raw_input to input in Python 2
|
||||
try:
|
||||
input = raw_input
|
||||
except NameError:
|
||||
pass
|
||||
|
||||
product_id = input("product id:")
|
||||
dev_name = input("device name:")
|
||||
passwd = input("password:")
|
||||
sub = input("subscribe topic:[default:control]")
|
||||
if sub == "":
|
||||
sub = "control"
|
||||
pub = input("publish topic:[default:event]")
|
||||
if pub == "":
|
||||
pub = "event"
|
||||
|
||||
client_id = product_id + dev_name
|
||||
# expire time: 2^32 - 1 = 4294967295
|
||||
username = client_id+";21010406;12365;{}".format(4294967295)
|
||||
|
||||
def hmacsha1(content, passwd):
|
||||
passwd_byte = base64.b64decode(passwd)
|
||||
return hmac.new(passwd_byte, content, digestmod=hashlib.sha1).hexdigest()
|
||||
|
||||
username = username.encode("utf-8")
|
||||
passwd = passwd.encode("utf-8")
|
||||
sign = hmacsha1(username, passwd)
|
||||
|
||||
template = ('#ifndef TOS_MQTT_CONFIG_H\n'
|
||||
'#define TOS_MQTT_CONFIG_H\n'
|
||||
'\n'
|
||||
'#define MQTT_SERVER_IP "111.230.189.156"\n'
|
||||
'#define MQTT_SERVER_PORT "1883"\n'
|
||||
'#define MQTT_PRODUCT_ID "$product"\n'
|
||||
'#define MQTT_DEV_NAME "$dev"\n'
|
||||
'#define MQTT_CLIENT_ID "$product$dev"\n'
|
||||
'#define MQTT_USR_NAME "$product$dev;21010406;12365;4294967295"\n'
|
||||
'#define MQTT_PASSWORD "$sign;hmacsha1"\n'
|
||||
'#define MQTT_SUBSCRIBE_TOPIC "$product/$dev/$sub"\n'
|
||||
'#define MQTT_PUBLISH_TOPIC "$product/$dev/$pub"\n'
|
||||
'\n'
|
||||
'#endif\n'
|
||||
'\n')
|
||||
|
||||
src = Template(template)
|
||||
|
||||
d = {
|
||||
'product':product_id,
|
||||
'dev':dev_name,
|
||||
'sign':sign,
|
||||
'sub':sub,
|
||||
'pub':pub
|
||||
}
|
||||
|
||||
#do the substitution
|
||||
dst = src.substitute(d)
|
||||
print("===============Generate mqtt_config.h==================")
|
||||
print(dst)
|
||||
with open('mqtt_config.h', 'w') as f:
|
||||
f.write(dst)
|
||||
|
||||
|
||||
```
|
||||
|
||||
运行python脚本,一次输入产品ID、设备名称、设备密钥,就可以生成对用的mqtt信息了,如下图所示:
|
||||
|
||||
|
||||

|
||||
|
||||
|
||||
同样在main.c文件内,修改云端配置信息,使用上面脚本生成的信息替换:
|
||||
|
||||

|
||||
|
||||
|
||||
2.3. 编译工程
|
||||
点击编译按钮,编译整个工程并将程序下载到开发板,由于GD-Link的设计问题,这里下载到RISC-V开发板会非常慢,大家耐心等待一下。
|
||||
下载完成,打开热点,复位开发板,我们可以看到终端输出相关log,如下图:
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
### 3. 云端平台查看设备数据
|
||||
回到腾讯云物联网开发平台,可以看到设备状态变为【在线】:
|
||||
|
||||

|
||||
|
||||
点击【设备日志】一栏,可以看到设备上报的光照强度:
|
||||
|
||||

|
||||
|
||||
点击【在线调试】一栏,修改属性【期望值】后点击【发送】,可以对灯泡进行远程控制。
|
||||
|
||||

|
||||
|
||||
### 4、腾讯连连小程序操作步骤
|
||||
1. 添加家庭
|
||||
手机端在【微信】搜索【腾讯连连】小程序,首次使用需要进入后点击【我的】->【家庭管理】,添加一个你喜欢的名称即可。
|
||||
|
||||
2. 添加调试设备
|
||||
返回【首页】,点击右上角“加号”图标:
|
||||
|
||||

|
||||
|
||||
进入后点击右上角扫码图标:
|
||||
|
||||

|
||||
|
||||
在腾讯云物联网开发平台进入【设备调试】,点击对应设备后的【二维码】:
|
||||
|
||||

|
||||
|
||||
腾讯连连扫描此二维码即可成功添加设备,添加成功之后如图:
|
||||
|
||||

|
||||
|
||||
点击此设备即可实时查看数据,并下发控制指令:
|
||||
|
||||

|
||||
|
||||
|
||||
3. 修改腾讯连连显示面板
|
||||
进入【交互开发】,点击【面板配置】一栏:
|
||||
|
||||

|
||||
|
||||
在此页面中可以自己根据喜好配置小程序显示面板,保存之后,在腾讯连连小程序删除设备,重新扫描绑定设备即可生效。
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## 2. 定制开发板EVB_LX软件开发环境准备
|
||||
|
||||
### 2.1 Nuclei Studio IDE下载
|
||||
目前GD32V成熟的集成开发环境是由芯来科技提供的Nuclei Studio IDE,TencentOS tiny中的RISC-V项目也是基于Nuclei Studio IDE。首先我们下载Nuclei Studio IDE软件开发包,下载链接为https://www.nucleisys.com/download.php 如下图所示。
|
||||
|
||||

|
||||
|
||||
单击“Nuclei Studio:芯来集成开发环境(Nuclei Studio IDE)”即可进入下载页面。
|
||||
### 2.2 Nuclei Studio IDE安装
|
||||
下载下来的芯来集成开发环境(IDE)Nuclei Studio压缩包解压后包含若干个文件。
|
||||
Nuclei Studio软件包:该软件包中包含了Nuclei Studio IDE的软件。注意:具体版本以及文件名可能会不断更新;
|
||||
HBird_Driver.exe:此文件为芯来蜂鸟调试器的USB驱动安装文件,调试时需要安装此驱动使得其USB能够被识别;
|
||||
JDK安装文件:jdk-8u512-windows-x64.exe;
|
||||
|
||||
* 1.Nuclei Studio IDE是基于eclipse的,eclipse需要jdk环境支持,你的电脑如果没有安装jdk环境需要先安装jdk-8u512-windows-x64.exe,直接双击安装即可,如果已经安装可以跳过;
|
||||
* 2.安装HBird_Driver.exe
|
||||
* 3.Nuclei Studio软件本身为绿色软件无需安装,安装好JDK运行环境后,直接单击Nuclei Studio文件夹中eclipsec.exe即可启动Nuclei Studio。
|
||||
|
||||

|
||||
|
||||
直接单击NucleiStudio_IDE文件包中NucleiStudio文件夹下面的eclipse.exe可执行文件,即可启动Nuclei Studio;
|
||||
第一次启动Nuclei Studio后,将会弹出对话框要求设置Workspace目录,该目录将用于放置后续创建项目的文件夹,如图所示;
|
||||
|
||||

|
||||
|
||||
设置好Workspace目录之后,确保Workspace的路径中没有中文,单击“Launch”按钮,将会启动Nuclei Studio。第一次启动后的Nuclei Studio界面如图所示。
|
||||
|
||||

|
||||
|
||||
### 2.3 导入基于TencentOS tiny的RISC-V工程
|
||||
先下载TencentOS tiny项目,下载地址为:
|
||||
https://github.com/Tencent/TencentOS-tiny
|
||||
官方地址直接下载zip包或者直接使用下面的命令clone下来:
|
||||
|
||||
git clone https://github.com/Tencent/TencentOS-tiny.git
|
||||
|
||||
在菜单栏选择”File->Import“,出现如图对话框,选择”General“菜单下”Exit Project into Workspace“,设置导入方式,然后点击按钮”Next“。
|
||||
|
||||

|
||||
|
||||
选择导入的方式后,点击” Browse“按钮选择TencentOS tiny项目中GD32V工程路径。注意:进入到” TencentOS-tiny\board\TencentOS_tiny_EVB_LX\eclipse"这一级目录即可,如图所示。
|
||||
|
||||

|
||||
|
||||
### 2.4 编译下载调试基于TencentOS tiny的RISC-V工程
|
||||
|
||||
导入之后,就可看到TencentOS tiny的hello_world工程了,如图所示:
|
||||

|
||||
|
||||
Hello_world工程文件夹上右键 Debug As,选择Debug Configuration,配置调试参数,如下图所示:
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
然后点击Debug即可进入调试窗口,如下图所示,可以进行单步、跳步执行,设置断点等
|
||||
|
||||

|
BIN
doc/image/EVB_LX_guide/MRS_Install.png
Normal file
After Width: | Height: | Size: 53 KiB |
BIN
doc/image/EVB_LX_guide/MRS_welcome.png
Normal file
After Width: | Height: | Size: 338 KiB |
BIN
doc/image/EVB_LX_guide/PR_001.png
Normal file
After Width: | Height: | Size: 42 KiB |
BIN
doc/image/EVB_LX_guide/PR_002.png
Normal file
After Width: | Height: | Size: 56 KiB |
BIN
doc/image/EVB_LX_guide/PR_003.png
Normal file
After Width: | Height: | Size: 74 KiB |
BIN
doc/image/EVB_LX_guide/PR_004.png
Normal file
After Width: | Height: | Size: 90 KiB |
BIN
doc/image/EVB_LX_guide/PR_005.png
Normal file
After Width: | Height: | Size: 115 KiB |
BIN
doc/image/EVB_LX_guide/PR_006.png
Normal file
After Width: | Height: | Size: 87 KiB |
BIN
doc/image/EVB_LX_guide/a001.png
Normal file
After Width: | Height: | Size: 74 KiB |
BIN
doc/image/EVB_LX_guide/a002.png
Normal file
After Width: | Height: | Size: 40 KiB |
BIN
doc/image/EVB_LX_guide/a003.png
Normal file
After Width: | Height: | Size: 53 KiB |
BIN
doc/image/EVB_LX_guide/a004.png
Normal file
After Width: | Height: | Size: 21 KiB |
BIN
doc/image/EVB_LX_guide/a005.png
Normal file
After Width: | Height: | Size: 138 KiB |
BIN
doc/image/EVB_LX_guide/a006.png
Normal file
After Width: | Height: | Size: 53 KiB |
BIN
doc/image/EVB_LX_guide/c001.png
Normal file
After Width: | Height: | Size: 8.6 KiB |
BIN
doc/image/EVB_LX_guide/c002.png
Normal file
After Width: | Height: | Size: 18 KiB |
BIN
doc/image/EVB_LX_guide/c003.png
Normal file
After Width: | Height: | Size: 14 KiB |
BIN
doc/image/EVB_LX_guide/c004.png
Normal file
After Width: | Height: | Size: 24 KiB |
BIN
doc/image/EVB_LX_guide/c005.png
Normal file
After Width: | Height: | Size: 6.6 KiB |
BIN
doc/image/EVB_LX_guide/c006.png
Normal file
After Width: | Height: | Size: 29 KiB |
BIN
doc/image/EVB_LX_guide/c007.png
Normal file
After Width: | Height: | Size: 29 KiB |
BIN
doc/image/EVB_LX_guide/c008.png
Normal file
After Width: | Height: | Size: 32 KiB |
BIN
doc/image/EVB_LX_guide/c009.png
Normal file
After Width: | Height: | Size: 21 KiB |
BIN
doc/image/EVB_LX_guide/c010.png
Normal file
After Width: | Height: | Size: 67 KiB |
BIN
doc/image/EVB_LX_guide/c011.png
Normal file
After Width: | Height: | Size: 47 KiB |
BIN
doc/image/EVB_LX_guide/c012.png
Normal file
After Width: | Height: | Size: 38 KiB |
BIN
doc/image/EVB_LX_guide/c013.png
Normal file
After Width: | Height: | Size: 20 KiB |
BIN
doc/image/EVB_LX_guide/c014.png
Normal file
After Width: | Height: | Size: 30 KiB |
BIN
doc/image/EVB_LX_guide/c015.png
Normal file
After Width: | Height: | Size: 49 KiB |
BIN
doc/image/EVB_LX_guide/light_001.png
Normal file
After Width: | Height: | Size: 243 KiB |
BIN
doc/image/EVB_LX_guide/light_002.png
Normal file
After Width: | Height: | Size: 162 KiB |
BIN
doc/image/EVB_LX_guide/light_003.png
Normal file
After Width: | Height: | Size: 1.2 MiB |
BIN
doc/image/EVB_LX_guide/light_004.png
Normal file
After Width: | Height: | Size: 33 KiB |
BIN
doc/image/EVB_LX_guide/port_001.png
Normal file
After Width: | Height: | Size: 26 KiB |
BIN
doc/image/EVB_LX_guide/port_002.png
Normal file
After Width: | Height: | Size: 78 KiB |
BIN
doc/image/EVB_LX_guide/port_003.png
Normal file
After Width: | Height: | Size: 106 KiB |
BIN
doc/image/EVB_LX_guide/port_004.png
Normal file
After Width: | Height: | Size: 93 KiB |
BIN
doc/image/EVB_LX_guide/port_005.png
Normal file
After Width: | Height: | Size: 34 KiB |