机智云移植步骤

机智云移植步骤

1、机智云网址:机智云|智能物联网操作系统

  • 注册过程中,如果 Edge 点击没反应,可以换个浏览器重新注册

2、登录成功后,创建项目

image-20260527160236685

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

image-20260527160437597

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

image-20260527160610416

5、正常开发嵌入式程序,比如实现 OLED显示、DHT11监测、LED控制的标准库Demo,在这个基础上需要实现两个串口和1ms定时器

6、移植机智云,将画红框的文件夹复制到源代码目录,并在Keil软件内添加

image-20260527160955418

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 *)&currentDataPoint);
		
		
  }
}

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   
}
posted @ 2026-05-27 16:42  Q&25  阅读(18)  评论(0)    收藏  举报