TA的每日心情 | 奋斗 昨天 09:56 |
---|
签到天数: 2402 天 连续签到: 484 天 [LV.Master]伴坛终老
|
本帖最后由 yinwuqing 于 2020-5-23 18:01 编辑
机智云平台是致力于物联网、智能硬件云服务的开放平台。GoKit3开发板兼容了MCU与SOC版功能,今天主要来分享一下采用独立MCU方案接入机智云的实现办法。以一盏灯做为设备,那么设备与机智云数据交互的基本数据流如下图:
这节我们以创建一个控制RGB灯的工程作为实测项目。首先我们需要在机智云官网创建设备产品,如果没有机智云开发者账号,则需要注册一个账号。https://dev.gizwits.com/zh-cn/developer/product/,进入机智云官网开发者中心后,登录个人账号,选择个人项目。再选择如下图示按钮创建新产品
接着填写创建新产品的信息,这里我们选择WiFi/移动网络方案
然后选择开发向导,定义产品功能,添加数据点
则界面跳转到数据点栏下,点击选择“+新建数据点”
添加数据点,需要根据设置变量的属性,填写相关的数据类型
然后记得要选择弹出对话窗口的“应用”,否则数据点添加失效
采用同样的办法,添加RGB灯的三组控制数值
然后选择MCU开发栏,这里硬件方案中,我们选择独立MCU方案,硬件平台选择默认的STM32F103C8x,至于产品的秘钥,即Product Secret栏,我们要在基本信息栏中查找
我们选择“显示完整秘钥”,则会弹出一个提示慎重的对话框,我们确认即可。再将完整秘钥序列号复制,粘贴到MCU开发栏下的待填写栏中
然后点击“生成代码包”,则会显示代码生成结果状态信息
待生成完成后,将代码包下载到我们指定的路径下
将下载的代码包,先进行全编译一下,无报错,无警告
至此,自动生成了独立MCU的工程,下一步我们需要将官网提供的RGB_LED灯的驱动移植进工程中。我们可以通过下载中心获取到RGB的驱动源码
然后将驱动包解压,拷贝其中的“驱动库代码_CubeMX版”文件夹下的源文件到工程的Hal文件夹中
则在Hal文件夹中添加了10个驱动源文件
在Keil工程的Hal驱动目录中添加刚刚拷贝过来的外设驱动源文件
由于之前有“hal_key.c”,“hal_key.h”源文件,这里无需再次包含该路径下的头文件。然后在main.h文件中添加所需头文件:
- /* USER CODE BEGIN Includes */
- #include "delay.h"
- #include "Hal_infrared.h"
- #include "hal_motor.h"
- #include "hal_rgb_led.h"
- #include "hal_temp_hum.h"
- /* USER CODE END Includes */
复制代码 在delay.h文件中添加文件类型别名
- typedef unsigned short uint16_t;
- typedef unsigned int uint32_t;
- typedef unsigned char uint8_t;
复制代码 在“hal_rgb_led.h”中添加对应RGB的GPIO口的宏定义
- #ifndef _HAL_RGB_LED_H
- #define _HAL_RGB_LED_H
- #include <stdio.h>
- #include <stm32f1xx.h>
- /*兼容V2.2,RGB开关IO*/
- #define GPIO_RGB_CLK RCC_APB2Periph_GPIOA
- #define RGB_LED_EN_GPIO_Port GPIOA
- #define RGB_LED_EN_Pin GPIO_PIN_0
- #define RGBLED_CLK_GPIO_Port GPIOB
- #define RGBLED_CLK_Pin GPIO_PIN_8
- #define RGBLED_DIN_GPIO_Port GPIOB
- #define RGBLED_DIN_Pin GPIO_PIN_9
- #define R_MAX 255
- #define G_MAX 255
- #define B_MAX 255
- #define SCL_LOW HAL_GPIO_WritePin(RGBLED_CLK_GPIO_Port, RGBLED_CLK_Pin, GPIO_PIN_RESET)
- #define SCL_HIGH HAL_GPIO_WritePin(RGBLED_CLK_GPIO_Port, RGBLED_CLK_Pin, GPIO_PIN_SET)
- #define SDA_LOW HAL_GPIO_WritePin(RGBLED_DIN_GPIO_Port, RGBLED_DIN_Pin, GPIO_PIN_RESET)
- #define SDA_HIGH HAL_GPIO_WritePin(RGBLED_DIN_GPIO_Port, RGBLED_DIN_Pin, GPIO_PIN_SET)
- ///*兼容V2.2及以上,RGB开关IO*/
- #define RGB_Enable() HAL_GPIO_WritePin(RGB_LED_EN_GPIO_Port, RGB_LED_EN_Pin, GPIO_PIN_SET)
- #define RGB_Disable() HAL_GPIO_WritePin(RGB_LED_EN_GPIO_Port, RGB_LED_EN_Pin, GPIO_PIN_RESET)
- void rgbLedInit(void);
- void ledRgbControl(uint8_t R,uint8_t B,uint8_t G);
- void rgbKeyGpioInit(void);
- #endif /*_HAL_RGB_LED_H*/
复制代码 再在main.c中定义uint8_t red,green,blue;三个变量,在gizwits_product.c中全局声明这三个变量:extern uint8_t red,green,blue;然后在gizwitsEventProcess处理函数中添加用户对RGB控制的代码
- 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_TYPE
- gprsInfo_t *gprsInfoData = (gprsInfo_t *)gizdata;
- #else
- moduleInfo_t *ptModuleInfo = (moduleInfo_t *)gizdata;
- #endif
- if((NULL == info) || (NULL == gizdata))
- {
- return -1;
- }
- for(i=0; i<info->num; i++)
- {
- switch(info->event[i])
- {
- case EVENT_LED_ONOFF:
- currentDataPoint.valueLED_ONOFF = dataPointPtr->valueLED_ONOFF;
- GIZWITS_LOG("Evt: EVENT_LED_OnOff %d \n", currentDataPoint.valueLED_ONOFF);
- if(0x01 == currentDataPoint.valueLED_ONOFF)
- {
- //user handle
- red=254,green=254,blue=254;
- ledRgbControl(red,green,blue);
- }
- else
- {
- //user handle
- red=0,green=0,blue=0;
- ledRgbControl(red,green,blue);
- }
- break;
- case EVENT_RED_LED:
- currentDataPoint.valueRED_LED = dataPointPtr->valueRED_LED;
- GIZWITS_LOG("Evt:valueRED_LED %d\n",currentDataPoint.valueRED_LED); ledRgbControl(currentDataPoint.valueRED_LED,currentDataPoint.valueGREEN_LED,currentDataPoint.valueBLUE_LED);
- //user handle
- break;
- case EVENT_GREEN_LED:
- currentDataPoint.valueGREEN_LED = dataPointPtr->valueGREEN_LED;
- GIZWITS_LOG("Evt:valueGREEN_LED %d\n",currentDataPoint.valueGREEN_LED); ledRgbControl(currentDataPoint.valueRED_LED,currentDataPoint.valueGREEN_LED,currentDataPoint.valueBLUE_LED);
- //user handle
- break;
- case EVENT_BLUE_LED:
- currentDataPoint.valueBLUE_LED = dataPointPtr->valueBLUE_LED;
- GIZWITS_LOG("Evt:valueBLUE_LED %d\n",currentDataPoint.valueBLUE_LED); ledRgbControl(currentDataPoint.valueRED_LED,currentDataPoint.valueGREEN_LED,currentDataPoint.valueBLUE_LED);
- //user handle
- 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_TYPE
- GIZWITS_LOG("GPRS MODULE ...\n");
- //Format By gprsInfo_t
- #else
- GIZWITS_LOG("WIF MODULE ...\n");
- //Format By moduleInfo_t
- GIZWITS_LOG("moduleType : [%d] \n",ptModuleInfo->moduleType);
- #endif
- break;
- default:
- break;
- }
- }
- return 0;
- }
复制代码 然后执行全编译,没有报错,没有警告,截图如下,其gizwitsEventProcess函数实现的功能在图中备注
使用Jlink调试工具与GoKit3开发板的底板SWD接口相连接,这里采用杜邦线,如下图所示:
在Keil中,能够正常识别到Jlink,说明连线无误
然后点击下载,即可以顺利得将编译好的文件下载进MCU中。此次分享就到这里告一段落了,关于MCU工程代码,主要有官方提供的四个文件比较重要,如下图所示。我们在自动生产代码时的Product Secret也可以通过“gizwits_protocol.h”中找得到,如此说来,我们在改动自动生成代码的配置时,必须重新生成新的工程,才能将改动新的配置信息导入进工程中,通讯的实现主要在Gizwits文件夹中。
感谢各位的围观,青山不在,绿水长流,咱们下期再见。如有异议,欢迎留贴讨论,谢谢!
|
-
-
|