机智云移植步骤
机智云移植步骤
1、机智云网址:机智云|智能物联网操作系统
- 注册过程中,如果 Edge 点击没反应,可以换个浏览器重新注册
2、登录成功后,创建项目

3、进入虚拟设备界面,手机APP扫描二维码,绑定项目

4、进入MCU界面,生成硬件方案

5、正常开发嵌入式程序,比如实现 OLED显示、DHT11监测、LED控制的标准库Demo,在这个基础上需要实现两个串口和1ms定时器
6、移植机智云,将画红框的文件夹复制到源代码目录,并在Keil软件内添加

7、USART2配置,MCU 方案需要用户实现一个串口, 用于设备 MCU 与 WIFI 模组之间数据通信。
void USART2_IRQHandler(void) //串口3中断服务程序
{
u8 Res;
if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) //接收中断(接收到的数据必须是0x0d 0x0a结尾)
{
USART_ClearITPendingBit(USART2,USART_IT_RXNE);
Res =USART_ReceiveData(USART2); //读取接收到的数据
gizPutData(&Res, 1);
}
}
8、配置 gizwits_product.c 中的 uartWrite()
for(i=0; i<len; i++)
{
USART_SendData(USART2, buf[i]);
while (USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);
if(i >=2 && buf[i] == 0xFF)
{
USART_SendData(USART2,0x55);
while (USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);
}
}
9、协议层使用到了一个系统时间,该事件单位为毫秒,所以要求用户实现一个毫秒定时器,并且实现中断服务函数 TIMER_IRQ_FUN(), 该函数调用 gizTimerMs()实现协议层系统时间的维护。
//定时器3中断服务程序
void TIM3_IRQHandler(void) //TIM3中断 20ms中断
{
if ( TIM_GetITStatus( TIM3, TIM_IT_Update) != RESET )
{
TIM_ClearITPendingBit(TIM3 , TIM_FLAG_Update);
gizTimerMs();
}
}
10、根据串口协议文档规定, 模组可以发送命令复位设备 MCU, 所以用户需要实现mcuRestart()接口完成设备的复位。
// gizwits_product
void mcuRestart(void)
{
__set_FAULTMASK(1);
NVIC_SystemReset();
}
11、如果用户需要打印日志调试信息,要求用户实现 printf 函数。协议层将用 GIZWITS_LOG宏替代 printf, 进行相关信息的打印。
/* 描述 :重定向c库函数printf到USART1*/
int fputc(int ch, FILE *f)
{
/* 将Printf内容发往串口 */
USART_SendData(USART1, (unsigned char) ch);
while (!(USART1->SR & USART_FLAG_TXE));
return (ch);
}
12、配置入网
#include "stm32f10x.h"
#include "led.h"
#include "usart.h"
#include "delay.h"
#include "oled.h"
#include "usart2.h"
#include "timer.h"
#include "dht11.h"
#include "gizwits_product.h"
#include "gizwits_protocol.h"
u8 temp;
u8 humi;
int main(void)
{
SystemInit();//配置系统时钟为72M
delay_init(72);
LED_Init();
LED_Off();
USART1_Config();//串口初始化
USART2_Config();//串口初始化
TIM3_Int_Init(1000-1,72-1); //定时1ms中断
while(DHT11_Init())
{
printf("DHT11 Error \r\n");
}
OLED_Init();
printf("Start \n");
delay_ms(1000);
//显示“温度:”
OLED_ShowChinese(0,0,0,16,1);
OLED_ShowChinese(16,0,1,16,1);
OLED_ShowChar(32,0,':',16,1);
//显示“湿度:”
OLED_ShowChinese(0,16,2,16,1);
OLED_ShowChinese(16,16,1,16,1);
OLED_ShowChar(32,16,':',16,1);
delay_ms(500);
userInit();
gizwitsInit();
delay_ms(500);
gizwitsSetMode(WIFI_AIRLINK_MODE);
while (1)
{
DHT11_Read_Data(&temp,&humi);//
//LED_Toggle();
delay_ms(100);
//显示温度数据
OLED_ShowNum(48,0,temp,2,16,1);
//显示湿度数据
OLED_ShowNum(48,16,humi,2,16,1);
userHandle();
gizwitsHandle((dataPoint_t *)¤tDataPoint);
}
}
13、实现下行动作执行
数 据 点 方 式 将 转 换 成 数 据 点 事 件 , 开 发 者 只 需 要 在 gizwits_product.c 文 件 的gizwitsEventProcess()相应事件下作具体处理即可。
switch(info->event[i])
{
case EVENT_led:
currentDataPoint.valueled = dataPointPtr->valueled;
GIZWITS_LOG("Evt: EVENT_led %d \n", currentDataPoint.valueled);
if(0x01 == currentDataPoint.valueled)
{
LED_On(); //user handle
}
else
{
LED_Off(); //user handle
}
break;
14、实现上行数据采集
该工程代码默认在 Gizwits/gizwits_product.c 文件中 userHandle()函数实现传感器数据采集, 并且该函数在 while 循环执行, 原则上用户只需要关心如何采集数据。
void userHandle(void)
{
currentDataPoint.valuetemp = temp;//Add Sensor Data Collection
currentDataPoint.valuehumi = humi;//Add Sensor Data Collection
}
浙公网安备 33010602011771号