查看: 786|回复: 0

【机智云GoKit3开发板试用体验】+ ③独立MCU方案

[复制链接]
  • TA的每日心情
    奋斗
    5 小时前
  • 签到天数: 2061 天

    连续签到: 143 天

    [LV.Master]伴坛终老

    发表于 2020-5-25 08:55:11 | 显示全部楼层 |阅读模式
    分享到:
    本帖最后由 yinwuqing 于 2020-5-23 18:01 编辑

       机智云平台是致力于物联网、智能硬件云服务的开放平台。GoKit3开发板兼容了MCU与SOC版功能,今天主要来分享一下采用独立MCU方案接入机智云的实现办法。以一盏灯做为设备,那么设备与机智云数据交互的基本数据流如下图:
    数据交互示意图.png
        这节我们以创建一个控制RGB灯的工程作为实测项目。首先我们需要在机智云官网创建设备产品,如果没有机智云开发者账号,则需要注册一个账号。https://dev.gizwits.com/zh-cn/developer/product/,进入机智云官网开发者中心后,登录个人账号,选择个人项目。再选择如下图示按钮创建新产品
    ①.png
       接着填写创建新产品的信息,这里我们选择WiFi/移动网络方案
    ②.png
       然后选择开发向导,定义产品功能,添加数据点
    ③.png
         则界面跳转到数据点栏下,点击选择“+新建数据点”
    ④.png
         添加数据点,需要根据设置变量的属性,填写相关的数据类型
    ⑤.png
         然后记得要选择弹出对话窗口的“应用”,否则数据点添加失效
    ⑥.png
        采用同样的办法,添加RGB灯的三组控制数值
    设置数据点.png
         然后选择MCU开发栏,这里硬件方案中,我们选择独立MCU方案,硬件平台选择默认的STM32F103C8x,至于产品的秘钥,即Product Secret栏,我们要在基本信息栏中查找
    ⑦.png
         我们选择“显示完整秘钥”,则会弹出一个提示慎重的对话框,我们确认即可。再将完整秘钥序列号复制,粘贴到MCU开发栏下的待填写栏中
    ⑧.png
         然后点击“生成代码包”,则会显示代码生成结果状态信息
    ⑨.png
        待生成完成后,将代码包下载到我们指定的路径下
    ⑩.png         

       将下载的代码包,先进行全编译一下,无报错,无警告
    编译ok.png
        至此,自动生成了独立MCU的工程,下一步我们需要将官网提供的RGB_LED灯的驱动移植进工程中。我们可以通过下载中心获取到RGB的驱动源码
    下载官方示例.png
         然后将驱动包解压,拷贝其中的“驱动库代码_CubeMX版”文件夹下的源文件到工程的Hal文件夹中
    选择CubeMX版.png
         则在Hal文件夹中添加了10个驱动源文件
    文件列表.png
        在Keil工程的Hal驱动目录中添加刚刚拷贝过来的外设驱动源文件
    添加库文件.png
       由于之前有“hal_key.c”,“hal_key.h”源文件,这里无需再次包含该路径下的头文件。然后在main.h文件中添加所需头文件:
    1. /* USER CODE BEGIN Includes */
    2. #include "delay.h"
    3. #include "Hal_infrared.h"
    4. #include "hal_motor.h"
    5. #include "hal_rgb_led.h"
    6. #include "hal_temp_hum.h"
    7. /* USER CODE END Includes */
    复制代码
    在delay.h文件中添加文件类型别名

    1. typedef  unsigned short uint16_t;
    2. typedef  unsigned int  uint32_t;
    3. typedef  unsigned char uint8_t;
    复制代码
    在“hal_rgb_led.h”中添加对应RGB的GPIO口的宏定义
    1. #ifndef _HAL_RGB_LED_H
    2. #define _HAL_RGB_LED_H

    3. #include <stdio.h>
    4. #include <stm32f1xx.h>

    5. /*兼容V2.2,RGB开关IO*/
    6. #define GPIO_RGB_CLK    RCC_APB2Periph_GPIOA
    7. #define RGB_LED_EN_GPIO_Port   GPIOA
    8. #define RGB_LED_EN_Pin    GPIO_PIN_0

    9. #define  RGBLED_CLK_GPIO_Port GPIOB
    10. #define  RGBLED_CLK_Pin    GPIO_PIN_8
    11. #define  RGBLED_DIN_GPIO_Port GPIOB
    12. #define  RGBLED_DIN_Pin    GPIO_PIN_9

    13. #define  R_MAX  255
    14. #define  G_MAX  255
    15. #define  B_MAX  255

    16. #define SCL_LOW         HAL_GPIO_WritePin(RGBLED_CLK_GPIO_Port, RGBLED_CLK_Pin, GPIO_PIN_RESET)
    17. #define SCL_HIGH        HAL_GPIO_WritePin(RGBLED_CLK_GPIO_Port, RGBLED_CLK_Pin, GPIO_PIN_SET)

    18. #define SDA_LOW         HAL_GPIO_WritePin(RGBLED_DIN_GPIO_Port, RGBLED_DIN_Pin, GPIO_PIN_RESET)
    19. #define SDA_HIGH        HAL_GPIO_WritePin(RGBLED_DIN_GPIO_Port, RGBLED_DIN_Pin, GPIO_PIN_SET)

    20. ///*兼容V2.2及以上,RGB开关IO*/
    21. #define RGB_Enable()      HAL_GPIO_WritePin(RGB_LED_EN_GPIO_Port, RGB_LED_EN_Pin, GPIO_PIN_SET)
    22. #define RGB_Disable()     HAL_GPIO_WritePin(RGB_LED_EN_GPIO_Port, RGB_LED_EN_Pin, GPIO_PIN_RESET)

    23. void rgbLedInit(void);
    24. void ledRgbControl(uint8_t R,uint8_t B,uint8_t G);
    25. void rgbKeyGpioInit(void);

    26. #endif /*_HAL_RGB_LED_H*/
    复制代码
        再在main.c中定义uint8_t red,green,blue;三个变量,在gizwits_product.c中全局声明这三个变量:extern uint8_t red,green,blue;然后在gizwitsEventProcess处理函数中添加用户对RGB控制的代码
    1. int8_t gizwitsEventProcess(eventInfo_t *info, uint8_t *gizdata, uint32_t len)
    2. {
    3.   uint8_t i = 0;
    4.   dataPoint_t *dataPointPtr = (dataPoint_t *)gizdata;
    5.   moduleStatusInfo_t *wifiData = (moduleStatusInfo_t *)gizdata;
    6.   protocolTime_t *ptime = (protocolTime_t *)gizdata;
    7.   
    8. #if MODULE_TYPE
    9.   gprsInfo_t *gprsInfoData = (gprsInfo_t *)gizdata;
    10. #else
    11.   moduleInfo_t *ptModuleInfo = (moduleInfo_t *)gizdata;
    12. #endif

    13.   if((NULL == info) || (NULL == gizdata))
    14.   {
    15.     return -1;
    16.   }
    17.   for(i=0; i<info->num; i++)
    18.   {
    19.     switch(info->event[i])
    20.     {
    21.       case EVENT_LED_ONOFF:
    22.         currentDataPoint.valueLED_ONOFF = dataPointPtr->valueLED_ONOFF;
    23.         GIZWITS_LOG("Evt: EVENT_LED_OnOff %d \n", currentDataPoint.valueLED_ONOFF);
    24.         if(0x01 == currentDataPoint.valueLED_ONOFF)
    25.         {
    26.           //user handle
    27.           red=254,green=254,blue=254;
    28.           ledRgbControl(red,green,blue);
    29.         }
    30.         else
    31.         {
    32.           //user handle   
    33.           red=0,green=0,blue=0;
    34.           ledRgbControl(red,green,blue);
    35.         }
    36.         break;
    37.       case EVENT_RED_LED:
    38.         currentDataPoint.valueRED_LED = dataPointPtr->valueRED_LED;
    39.         GIZWITS_LOG("Evt:valueRED_LED %d\n",currentDataPoint.valueRED_LED);                 ledRgbControl(currentDataPoint.valueRED_LED,currentDataPoint.valueGREEN_LED,currentDataPoint.valueBLUE_LED);
    40.         //user handle
    41.         break;
    42.       case EVENT_GREEN_LED:
    43.         currentDataPoint.valueGREEN_LED = dataPointPtr->valueGREEN_LED;
    44.         GIZWITS_LOG("Evt:valueGREEN_LED %d\n",currentDataPoint.valueGREEN_LED);                  ledRgbControl(currentDataPoint.valueRED_LED,currentDataPoint.valueGREEN_LED,currentDataPoint.valueBLUE_LED);
    45.         //user handle
    46.         break;
    47.       case EVENT_BLUE_LED:
    48.         currentDataPoint.valueBLUE_LED = dataPointPtr->valueBLUE_LED;
    49.         GIZWITS_LOG("Evt:valueBLUE_LED %d\n",currentDataPoint.valueBLUE_LED);             ledRgbControl(currentDataPoint.valueRED_LED,currentDataPoint.valueGREEN_LED,currentDataPoint.valueBLUE_LED);
    50.         //user handle
    51.         break;
    52.       case WIFI_SOFTAP:
    53.         break;
    54.       case WIFI_AIRLINK:
    55.         break;
    56.       case WIFI_STATION:
    57.         break;
    58.       case WIFI_CON_ROUTER:
    59.         break;
    60.       case WIFI_DISCON_ROUTER:
    61.         break;
    62.       case WIFI_CON_M2M:
    63.         break;
    64.       case WIFI_DISCON_M2M:
    65.         break;
    66.       case WIFI_RSSI:
    67.         GIZWITS_LOG("RSSI %d\n", wifiData->rssi);
    68.         break;
    69.       case TRANSPARENT_DATA:
    70.         GIZWITS_LOG("TRANSPARENT_DATA \n");
    71.         //user handle , Fetch data from [data] , size is [len]
    72.         break;
    73.       case WIFI_NTP:
    74.         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);
    75.         break;
    76.       case MODULE_INFO:
    77.             GIZWITS_LOG("MODULE INFO ...\n");
    78.       #if MODULE_TYPE
    79.             GIZWITS_LOG("GPRS MODULE ...\n");
    80.             //Format By gprsInfo_t
    81.       #else
    82.             GIZWITS_LOG("WIF MODULE ...\n");
    83.             //Format By moduleInfo_t
    84.             GIZWITS_LOG("moduleType : [%d] \n",ptModuleInfo->moduleType);
    85.       #endif
    86.     break;
    87.       default:
    88.         break;
    89.     }
    90.   }
    91.   return 0;
    92. }
    复制代码
    然后执行全编译,没有报错,没有警告,截图如下,其gizwitsEventProcess函数实现的功能在图中备注
    处理函数.png
    使用Jlink调试工具与GoKit3开发板的底板SWD接口相连接,这里采用杜邦线,如下图所示:
    连接示意图.jpg
    在Keil中,能够正常识别到Jlink,说明连线无误
    识别到JLink.png
    然后点击下载,即可以顺利得将编译好的文件下载进MCU中。此次分享就到这里告一段落了,关于MCU工程代码,主要有官方提供的四个文件比较重要,如下图所示。我们在自动生产代码时的Product Secret也可以通过“gizwits_protocol.h”中找得到,如此说来,我们在改动自动生成代码的配置时,必须重新生成新的工程,才能将改动新的配置信息导入进工程中,通讯的实现主要在Gizwits文件夹中。
    主要文件.png
        感谢各位的围观,青山不在,绿水长流,咱们下期再见。如有异议,欢迎留贴讨论,谢谢!
    处理函数.png
    处理函数.png
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /2 下一条

    手机版|小黑屋|与非网

    GMT+8, 2024-3-29 13:51 , Processed in 0.105633 second(s), 16 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.