STM32连接机智云(踩雷日记)
目录
一、前期准备
二、固件烧写
三、创建机智云产品
四、MCU开发
好记性不如赖笔头,为了自己以后开发物联网项目,同时方便大家学习利用机智云进行物联网开发,我觉得有必要把自己的学习经历写下来。
一、前期准备
STM32核心板或者开发板一个(板子上带有LED)
网上这种便宜的ESP01S一个
USB转TTL模块一个
二、固件烧写
ESP8266烧写机智云的官方固件,才能与机智云进行通信。
固件可以去机智云官网下载,也可以直接用我提供的压缩包里的固件,我的固件也是从官网下载的,后面我以我的这个固件进行讲解。
工具包
GAgent文件下载解压后包含7个bin文件
这里我得说下我踩的第一大坑了,一开始我找网上资料说的是让烧写32Mbit的。完事了死活连接不上(我还以为是我程序的问题,我改了一下午程序,离谱的是他竟然能烧写进去)。后来我换成了8Mbit,很快就连接上了。ESP01和ESP01S应该都是8Mbit的。
准备好GAgent固件后,那么就需要一个固件的下载工具。固件下载工具,我们用的是机智云官方推荐的乐鑫原厂固件烧写工具,在我提供的压缩包里也有。
8266固件烧写接线方式
3.3 | 3.3 |
RX | TX |
IO0 | GND |
TX | RX |
GND | GND |
接下来打开软件,选择第一个。
下面就开始进行烧写 (记得把你要烧写的固件勾选上)
如果一直卡在等待上电同步就把你的RST引脚接下地,在拔出来。
等待下载
下载完成
三、创建机智云产品
首先在机智云官网注册一个开发者账号,然后进入到开发者中心,然后开始创建新产品,如下图所示
在个人项目页面左侧栏上,点击数据点,然后点击新建数据点,会弹出一个配置小页面 我们可以看到数据点定义基本内容可分为标识名,读写类型,数据类型及备 注。
读写类型:定义数据点的作用范围,包含有 4 种类型,分别是:只读、可写、报警、故障, 以下是官方对读写类型的介绍:
① 只读:表示该数据点为非控制,数据只支持从设备上报。
② 可写:表示该数据点可控制。设备端可上报数据点数据,云端/客户端(移动端)可对该数 据点数据做出下发控制。
③ 报警:表示该数据点非控制,数据只支持从设备(设备端)上报,数据类型需为布尔值。
④ 故障:表示该数据点非控制,数据只支持从设备(设备端)上报,数据类型需为布尔值。 云端对设备上报的该数据点做统计,可在“运行状态”查看。
虚拟设备能模拟 真实设备的上传数据行为,快速的验证接口功能的开发。终端设备没做好,但是想验证功能逻 辑,那么虚拟设备功能就可以派上用场了,在产品开发前会显得尤其重要。
虽说没有终端设备,我们可以用虚拟设备代替,但是手机上没有 APP 还是没有用,因为控制不到设备,也显示不到设备上传云端的服务数据,那应该怎么办呢?Don’t worry 机智云已经为开发者想好了,提供一个非常便利调试的 Demo App,还有针对不同移动端平台 Android、IOS 的 SDK APP 开发资源,在上侧栏,下载中心->通信产品调试app,就可以下载了
点击启动虚拟设备,页面跳转后点击显示二维码(虚拟设备二维码)
二维码生成后,在手机 App 上点击右上角- -然后点击扫描绑定设备
我们点击 APP LEDkey按钮,开关的数据也同步上传到服务器了
四、MCU开发
到此为止一切正常,然后我们开始写程序,首先先让机智云自动生成数据点和设备接入等的代码,然后移植到工程当中,先到基本信息这把Product Secret复制下来,接下来要用
生成代码包,并下载。
压缩包内包含以下文件,我们只使用Gizwits和Utils两个文件夹,并复制
接下来我用正点原子定时器中断实验的代码来进行移植
把刚才那两个文件夹复制到工程里
然后复制一个usart3工程 到工程里
接下来就是把这些代码和头文件添加到工程里,我就不多说了。
接下来就是修改代码了
gizwits_product.c文件修改如下:
/**
************************************************************
* @file gizwits_product.c
* @brief Gizwits control protocol processing, and platform-related hardware initialization
* @author Gizwits
* @date 2017-07-19
* @version V03030000
* @copyright Gizwits
*
* @note 机智云.只为智能硬件而生
* Gizwits Smart Cloud for Smart Products
* 链接|增值ֵ|开放|中立|安全|自有|自由|生态
* www.gizwits.com
*
***********************************************************/#include <stdio.h>
#include <string.h>
//#include "hal_key.h"//注释掉
#include "gizwits_product.h"
#include "common.h"#include "usart3.h"//添加上
#include "led.h"//添加上static uint32_t timerMsCount;
uint8_t aRxBuffer;/** User area the current device state structure*/
extern dataPoint_t currentDataPoint;//修改
//extern keysTypedef_t keys;//注释掉//extern TIM_HandleTypeDef htim2;//注释掉
//extern UART_HandleTypeDef huart1;//注释掉
//extern UART_HandleTypeDef huart2;//注释掉/**@} */
/**@name Gizwits User Interface
* @{
*//**
* @brief Event handling interface* Description:* 1. Users can customize the changes in WiFi module status* 2. Users can add data points in the function of event processing logic, such as calling the relevant hardware peripherals operating interface* @param [in] info: event queue
* @param [in] data: protocol data
* @param [in] len: protocol data length
* @return NULL
* @ref gizwits_protocol.h
*/
int8_t gizwitsEventProcess(eventInfo_t *info, uint8_t *gizdata, uint32_t len)
{uint8_t i = 0;dataPoint_t *dataPointPtr = (dataPoint_t *)gizdata;moduleStatusInfo_t *wifiData = (moduleStatusInfo_t *)gizdata;protocolTime_t *ptime = (protocolTime_t *)gizdata;#if MODULE_TYPEgprsInfo_t *gprsInfoData = (gprsInfo_t *)gizdata;
#elsemoduleInfo_t *ptModuleInfo = (moduleInfo_t *)gizdata;
#endifif((NULL == info) || (NULL == gizdata)){return -1;}for(i=0; i<info->num; i++){switch(info->event[i]){case EVENT_LEDkey:currentDataPoint.valueLEDkey = dataPointPtr->valueLEDkey;GIZWITS_LOG("Evt: EVENT_LEDkey %d \n", currentDataPoint.valueLEDkey);if(0x01 == currentDataPoint.valueLEDkey){//user handleLED1=0;//添加上}else{//user handle LED1=1;//添加上}break;case WIFI_SOFTAP:break;case WIFI_AIRLINK:break;case WIFI_STATION:break;case WIFI_CON_ROUTER:break;case WIFI_DISCON_ROUTER:break;case WIFI_CON_M2M:break;case WIFI_DISCON_M2M:break;case WIFI_RSSI:GIZWITS_LOG("RSSI %d\n", wifiData->rssi);break;case TRANSPARENT_DATA:GIZWITS_LOG("TRANSPARENT_DATA \n");//user handle , Fetch data from [data] , size is [len]break;case WIFI_NTP:GIZWITS_LOG("WIFI_NTP : [%d-%d-%d %02d:%02d:%02d][%d] \n",ptime->year,ptime->month,ptime->day,ptime->hour,ptime->minute,ptime->second,ptime->ntp);break;case MODULE_INFO:GIZWITS_LOG("MODULE INFO ...\n");#if MODULE_TYPEGIZWITS_LOG("GPRS MODULE ...\n");//Format By gprsInfo_t#elseGIZWITS_LOG("WIF MODULE ...\n");//Format By moduleInfo_tGIZWITS_LOG("moduleType : [%d] \n",ptModuleInfo->moduleType);#endifbreak;default:break;}}return 0;
}/**
* User data acquisition* Here users need to achieve in addition to data points other than the collection of data collection, can be self-defined acquisition frequency and design data filtering algorithm* @param none
* @return none
*/
//void userHandle(void)//注释掉
//{
// /*// */
//
//}/**
* Data point initialization function* In the function to complete the initial user-related data
* @param none
* @return none
* @note The developer can add a data point state initialization value within this function
*/
void userInit(void)
{memset((uint8_t*)¤tDataPoint, 0, sizeof(dataPoint_t));/** Warning !!! DataPoint Variables Init , Must Within The Data Range **/ /*currentDataPoint.valueLEDkey = ;*/}/**
* @brief Millisecond timing maintenance function, milliseconds increment, overflow to zero* @param none
* @return none
*/
void gizTimerMs(void)
{timerMsCount++;
}/**
* @brief Read millisecond count* @param none
* @return millisecond count
*/
uint32_t gizGetTimerCount(void)
{return timerMsCount;
}/**
* @brief MCU reset function* @param none
* @return none
*/
void mcuRestart(void)
{__set_FAULTMASK(1);
// HAL_NVIC_SystemReset();//注释NVIC_SystemReset();//修改
}/**@} */#ifdef __GNUC__/* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printfset to 'Yes') calls __io_putchar() */#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */
/*** @brief Retargets the C library printf function to the USART.* @param None* @retval None*/
//PUTCHAR_PROTOTYPE//注释
//{
// /* Place your implementation of fputc here */
// /* e.g. write a character to the USART1 and Loop until the end of transmission */
// HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
//
// return ch;
//}/*** @brief Period elapsed callback in non blocking mode * @param htim : TIM handle* @retval None*/
//void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)//注释
//{
// if(htim==&htim2)
// {
// keyHandle((keysTypedef_t *)&keys);
// gizTimerMs();
// }
//}/**
* @brief Timer TIM3 init function* @param none
* @return none
*/
//void timerInit(void)//注释
//{
// HAL_TIM_Base_Start_IT(&htim2);
//}/*** @brief This function handles USART IDLE interrupt.*/
//void HAL_UART_RxCpltCallback(UART_HandleTypeDef*UartHandle) //注释
//{
// if(UartHandle->Instance == USART2)
// {
// gizPutData((uint8_t *)&aRxBuffer, 1);// HAL_UART_Receive_IT(&huart2, (uint8_t *)&aRxBuffer, 1);//开启下一次接收中断
// }
//} /**
* @brief USART init function* Serial communication between WiFi modules and device MCU
* @param none
* @return none
*/
//void uartInit(void)//注释
//{
// HAL_UART_Receive_IT(&huart2, (uint8_t *)&aRxBuffer, 1);//开启下一次接收中断
//}/**
* @brief Serial port write operation, send data to WiFi module
*
* @param buf : buf address
* @param len : buf length
*
* @return : Return effective data length;-1,return failure
*/
int32_t uartWrite(uint8_t *buf, uint32_t len)
{uint8_t crc[1] = {0x55};uint32_t i = 0;if(NULL == buf){return -1;}// for(i=0; i<len; i++)//注释
// {
// HAL_UART_Transmit_IT(&huart2, (uint8_t *)&buf[i], 1);
// while (huart2.gState != HAL_UART_STATE_READY);//Loop until the end of transmission// if(i >=2 && buf[i] == 0xFF)
// {
// HAL_UART_Transmit_IT(&huart2, (uint8_t *)&crc, 1);
// while (huart2.gState != HAL_UART_STATE_READY);//Loop until the end of transmission
// }
// }for(i=0; i<len; i++)//添加{USART_SendData(USART3,buf[i]);while(USART_GetFlagStatus(USART3,USART_FLAG_TC)==RESET); //循环发送,直到发送完毕 if(i >=2 && buf[i] == 0xFF){//实现串口发送函数,将0x55发送到模组USART_SendData(USART3,0x55);while(USART_GetFlagStatus(USART3,USART_FLAG_TC)==RESET); //循环发送,直到发送完毕 } }
#ifdef PROTOCOL_DEBUGGIZWITS_LOG("MCU2WiFi[%4d:%4d]: ", gizGetTimerCount(), len);for(i=0; i<len; i++){GIZWITS_LOG("%02x ", buf[i]);if(i >=2 && buf[i] == 0xFF){GIZWITS_LOG("%02x ", 0x55);}}GIZWITS_LOG("\n");
#endifreturn len;
}
main.c修改:
#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "usart.h"
#include "timer.h"
#include "usart3.h"
#include "gizwits_product.h" /************************************************ALIENTEK战舰STM32开发板实验8定时器中断实验技术支持:www.openedv.com淘宝店铺:http://eboard.taobao.com 关注微信公众平台微信号:"正点原子",免费获取STM32资料。广州市星翼电子科技有限公司 作者:正点原子 @ALIENTEK
************************************************//* 用户区当前设备状态结构体*/
dataPoint_t currentDataPoint;
//协议初始化
void Gizwits_Init(void)
{TIM3_Int_Init(9,7199);//1MS系统定时usart3_init(9600);//WIFI初始化memset((uint8_t*)¤tDataPoint, 0, sizeof(dataPoint_t));//设备状态结构体初始化gizwitsInit();//缓冲区初始化
}
//数据采集
void userHandle(void)
{//判断当前LED1开关量if(LED1==0)currentDataPoint.valueLEDkey = 1;else currentDataPoint.valueLEDkey = 0;}int main(void){ int key;delay_init(); //延时函数初始化 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级uart_init(115200); //串口初始化为115200LED_Init(); //LED端口初始化KEY_Init(); //按键初始化Gizwits_Init(); printf("--------机智云-协议移植LED测试实验----------\r\n");printf("KEY1:AirLink连接模式\t KEY_UP:复位\r\n\r\n");while(1){ userHandle();//用户采集 gizwitsHandle((dataPoint_t *)¤tDataPoint);//协议处理key = KEY_Scan(0);if(key==KEY1_PRES)//KEY1按键{printf("WIFI进入AirLink连接模式\r\n");gizwitsSetMode(WIFI_AIRLINK_MODE);//Air-link模式接入} if(key==WKUP_PRES)//KEY_UP按键{ printf("WIFI复位,请重新配置连接\r\n");gizwitsSetMode(WIFI_RESET_MODE);//WIFI复位}delay_ms(200);LED0=!LED0;} }
Timer.c修改:
编译没有错误后,下载到开发板上,按KEY1进入AirLink连接模式,返回下面的数据。
打开手机app 右上角+号“一键配置”
选择工作WiFi(你的手机也要连接上这个WiFi)
开始连接后你的开发板的串口1会打印以下数据
最后,你就可以用手机控制你开发板上电的LED了
附上修改后的代码:STM32_机智云
STM32连接机智云(踩雷日记)相关推荐
- 正点原子提供免费开源的的连接机智云平台开发教程和实例源码
相信使用过云平台开发物联网产品的同学对国内领先的机智云平台都不陌生了.2017年6月,正点原子与机智云正式签订战略合作,推出机智云系列教程,所有正点原子的开发板都可以轻松连云了,几小时搞定远程控制. ...
- 个人项目——STM32接入机智云教程
STM32接入机智云工具包下载 机智云演示Demo 为了叙述我后面做的物联网项目,同时方便大家学习利用机智云进行物联网开发,我觉得有必要把接入机智云的教程细致的描述一下. 硬件准备 开发板使用正点原子 ...
- STM32接入机智云平台
写博客作为学习记录,加深印象,可能写的不对,或者有些地方写的不全,欢迎在下评论哈,我会及时更正 传送门:博客汇总帖 如果ESP8266还没有烧录机智云固件,在我另一篇博客: ESP8266烧写机智云固 ...
- 【安信可A9G专题③】安信可A9G模块连接机智云APP教程;
本系列博客学习由 安信可科技 - 官方博客 技术分享,如有疑问请留言或联系邮箱. 1.A9G环境在windows上搭建并编译,串口打印 Hello GPRS 2.A9G在微信公众号上的定位功能笔记分享 ...
- esp8266连接机智云
文章目录 一.机智云固件烧录 二.代码移植 三.连接机智云 四.附件 一.机智云固件烧录 硬件:正点原子的ESP8266 flash:32MB 模组:安可信 固件在附件的安信可ESP8266系列模组- ...
- 安信可A9G模块连接机智云APP教程
文章目录 一.准备 1.1 硬件准备 二.开发过程 2.1 注册机智云APP 2.2 硬件连接 2.3 连接机智云 2.4 注册模块到机智云产品 2.5 手机App查询状态以及控制设备 一.准备 1. ...
- 安信可的GPRS+GSM模组A9连接机智云的教程
安信可的GSM+GPR模组连接机智云搭建教程,官网给的文档也有相应的教程.我这里纯数对于个人连接机智云的过程中做一个记录. 1.首次先准备好好模组+USB转TTL串口工具+安信可官网的串口助手. 2. ...
- STM32 和 ESP8266连接机智云
1:环境 机智云固件:下载 工程代码:下载 2:创建产品 在机智云上创建产品, 配置以下数据点 3:生成MCU的代码 选择其他平台即可, 下载生成的代码包 4:烧录固件 5:修改自己的工程 个人工程: ...
- 毕业设计:基于STM32与机智云平台的远程控制智能家居系统
该项目实现一个智能家居系统,采用STM32为主控,并连接云平台-机智云作为远程控制的云服务器,同时用到手机APP作为控制终端,整个系统包括硬件端.云平台.手机APP,是一套完整的物联网智能家居系统. ...
最新文章
- 多媒体开发之--- live555 vs2010/vs2013下编译,使用,测试
- 何晓群pdf 应用回归分析第五版_暨南社会学论坛|未成年人司法中的法律实证与统计应用:多元回归分析(第三期)...
- Winform中实现向窗体中拖放照片并显示以及拖放文件夹显示树形结构(附代码下载)
- SARscape_5.2.0和SARscape_5.2.1安装包下载
- 三、python+selenium
- Spring框架—IoC容器
- matlab_ga(),matlab遗传算法ga函数
- iTOP4412 gdbserver安装
- 0框架前端-如何写一个按钮(button)
- python考勤系统代码_500行python代码打造刷脸考勤系统
- ArcGISServer 10.2发布地理处理服务:以CAD数据至地理数据库为例(2)发布地理处理服务
- 【企业】全球顶级思维模式:建立思维模式,把握人性管理
- 化工厂人员定位保障安全管理
- SpringBoot开发之JavaWeb回顾
- Sofa生态: SofaBoot从入门到放弃
- 个人微信小程序云开发总结心得
- SSIS 通过 WINscp 从SFTP下载文件
- 南宁动物园的动物,真是一个比一个疯!
- 放大器同向输入好还是反相输入好(转)
- 搭建ngrok服务器,实现内网穿透服务,实现外网到内网的在线访问
热门文章
- String为什么是不可变的?为什么要有字符串常量池?String和StringBuilder和StringBuffer
- Java代码韦伯分布_韦伯分布的随机数
- 基于java校园自行车租赁系统计算机毕业设计源码+系统+lw文档+mysql数据库+调试部署
- 网吧:连锁网吧是行业快速发展主因
- Java应用程序生成JAR包,部署到Hadoop平台上运行
- Spark广播变量Broadcast
- 国防科大计算机专业分数线,国防科技大学有哪些专业 录取分数线一般在多少...
- projectwbs表_project2010怎么插入工作分解结构? project插入WBS编号的教程
- 编译原理【词法分析】—LR(0)、SLR(1)、LR(1)、LALR(1)文法之间的关系
- 百家争鸣前夕,八千字说透「波卡平行链插槽拍卖」