本文以cypress的CY8C4147AZI-S475芯片为例来介绍如何将SDK移植到该MCU上,并通过广域网模组SIM800连接到阿里云物联网平台

目标

芯片 开发板 参数
CY8C4147AZI-S475 CY8CKIT-149 32bits, Cortex-M0+ 48Mhz, 128KB-Flash 16KB-SRAM

准备

环境搭建

  • 搭建目标:MCU的两个串口(作为调试串口和与模组通信的AT串口)可以正常收发

  • 开发工具: PSoC Creator 4.2,下载软件包(含CY8CKIT-149 PSoC 4100S Plus 软件包) ,下载后解压,双击cyautorun.exe即可安装.

CY8CKIT-149

硬件连接

  • 通过CY8CKIT-149的外部接口(含UART口)如下,通过TX/RX/GND连接外挂模组:

  • CY8CKIT-149单板管脚说明

代码生成

PSoC Creator 4.2生成对应开发板的代码,按以下步骤完成。

  • 工程创建:打开PSoC Creator,点击File -> New -> Project,依次配置以下选项,并选择Next

    • Select project type配置 -- Target Kit: CY8CKIT-149 (PSoC 4100S Plus)
    • Select Project template配置 -- Code example
    • Select a code example配置 -- Software_Transmit_UART该步骤完成调试串口配置,调试串口波特为57600
  • 串口配置: 添加UART选项,并按以下步骤完成配置:

    • UART Component添加,将UART(SCB mode)[v4.0]拖入中间示图
    • 完成UART Basic配置(双击UART图标)
    • 完成UART Advanced配置
    • 完成UART管脚配置
  • 堆栈配置: 参考下图,完成堆、栈size配置

    完成配置后,通过编译/执行Build命令,工程下会自动生成代码,代码目录如下:

SIM800

  • 请根据厂商提供的应用手册自行验证SIM800通信模组是否工作正常。

本次调试使用的是开发板而非市面上常见的模组,请将SIM800C开发板与MCU的串口(TX--RX, RX--TX, GND--GND)进行硬件连接,注意开发板上电后按压PWRKEY按键(大于1秒),待STATUS和NETLIGHT两个LED灯陆续点亮,其中NETLIGHT LED会以2HZ进行闪烁,此时SIM800C模组ready。

SDK移植

获取代码

请到SDK下载链接下载SDK,推荐使用3.0.1版本

SDK配置与抽取

配置

  • 配置命令
    • Windows运行 config.bat
    • Linux运行 make menuconfig
  • 配置步骤 按下图进行配置,详细的配置含义请参考使能需要的SDK功能

抽取

  • 抽取命令
    • Window运行extract.bat
    • Linux运行extract.sh
  • 抽取步骤 根据上述配置,执行抽取命令后生成的代码路径在output/eng,用户需要实现文杰output/eng/wrappers/wrapper.c中的HAL函数。
  • 抽取结果 抽取完成的SDK源码会输出到 output/eng/ 目录,结构如下:
    output/eng/
    ├── atm                
    │   ├── at_api.c
    │   ├── at_api.h
    │   ├── at_conn_mbox.c
    │   ├── at_conn_mbox.h
    │   ├── at_conn_mgmt.c
    │   ├── at_conn_mgmt.h
    │   ├── at_parser.c
    │   ├── at_parser.h
    │   ├── at_tcp.c
    │   ├── at_wrapper.h
    │   └── sim800.c
    ├── dev_sign             
    │   ├── dev_sign_api.h
    │   ├── dev_sign_config.h
    │   ├── dev_sign_internal.h
    │   ├── dev_sign_mqtt.c
    │   └── dev_sign_wrapper.h
    ├── examples
    │   ├── dev_sign_example.c
    │   └── mqtt_example_at.c   # 连云的mqtt示例
    ├── infra
    │   ├── infra_compat.h
    │   ├── infra_config.h
    │   ├── infra_defs.c
    │   ├── infra_defs.h
    │   ├── infra_list.h
    │   ├── infra_net.c
    │   ├── infra_net.h
    │   ├── infra_report.c
    │   ├── infra_report.h
    │   ├── infra_sha256.c
    │   ├── infra_sha256.h
    │   ├── infra_string.c
    │   ├── infra_string.h
    │   ├── infra_timer.c
    │   ├── infra_timer.h
    │   └── infra_types.h
    ├── mqtt
    │   ├── iotx_mqtt_client.c
    │   ├── iotx_mqtt_client.h
    │   ├── iotx_mqtt_config.h
    │   ├── mqtt_api.c
    │   ├── mqtt_api.h
    │   ├── MQTTConnectClient.c
    │   ├── MQTTConnect.h
    │   ├── MQTTDeserializePublish.c
    │   ├── mqtt_internal.h
    │   ├── MQTTPacket.c
    │   ├── MQTTPacket.h
    │   ├── MQTTPublish.h
    │   ├── MQTTSerializePublish.c
    │   ├── MQTTSubscribeClient.c
    │   ├── MQTTSubscribe.h
    │   ├── MQTTUnsubscribeClient.c
    │   ├── MQTTUnsubscribe.h
    │   └── mqtt_wrapper.h
    └── wrappers
        ├── wrapper.c
        └── wrappers_defs.h

    6 directories, 54 files

    ```    

集成

PSoC Creator工程配置

  • 抽取完成的SDK源码会输出到output/eng目录,将其中atm dev_sign infra mqtt wrappers目录拷贝到PSoC Creator工程中新建的linkkit文件夹下,并同时,也拷贝examples下的mqtt_example_at.c文件。
  • 在PSoC Creator工程中添加SDK源码和头文件路径,参考流程如下:
    • 新建linkkit文件夹
    • 添加atm dev_sign infra mqtt wrappers目录下SDK的源文件,以及examples下的mqtt_example_at.c文件
    • 添加SDK头文件路径(同图9,右击*Project 'cy8ckit149_sim800tcp_basic',选择Build Settings
      添加的头文件参考如下:
      .\linkkit\atm; .\linkkit\dev_sign; .\linkkit\infra; .\linkkit\mqtt; .\linkkit\wrappers

代码集成

  • 按上节所述,已将抽取
  • 在cy8ckit149_sim800tcp_basic.cydsn/main.c中调用mqtt_example_at.c的mqtt_example函数进行示例验证,更多其他细节请MCU+TCP模组
    /* cy8ckit149_sim800tcp_basic.cydsn/main.c */
    
    volatile uint64_t msCount = 0;
    void SysTickISRCallback(void){
        /* Counts the number of milliseconds in one second */
        msCount++;
    }
    int main()
    {
    
        /* Start the SW_Tx_UART Component */
        SW_Tx_UART_Start();
    
        /* Global Int Enable */
        CyGlobalIntEnable;
    
        /* Start Systick */
        CySysTickStart();
    
        /* Register Systick Callback */
        CySysTickSetCallback(0, SysTickISRCallback);
    
        /* Enter mqtt example */
        mqtt_example();
    }
  • 三元组DeviceName ProductKey DeviceSecret 需要通过单个创建设备获取。
  • 并注意创建时需要将产品Topic类列表中的’get’权限从默认的’订阅’改成’发布和订阅’
    # wrappers/wrapper.c, 14 HAL functions implementation need to be done.
    int32_t HAL_AT_Uart_Init(uart_dev_t *uart);
    int32_t HAL_AT_Uart_Deinit(uart_dev_t *uart);
    int32_t HAL_AT_Uart_Recv(uart_dev_t *uart, void *data, uint32_t expect_size,
                                 uint32_t *recv_size, uint32_t timeout);
    int32_t HAL_AT_Uart_Send(uart_dev_t *uart, const void *data, uint32_t size, uint32_t timeout);
    void *HAL_Malloc(uint32_t size);
    void HAL_Free(void *ptr);
    void HAL_Printf(const char *fmt, ...);
    int HAL_Snprintf(char *str, const int len, const char *fmt, ...);
    void HAL_SleepMs(uint32_t ms);uint64_t HAL_UptimeMs(void);
    
    
    int HAL_GetDeviceName(char device_name[IOTX_DEVICE_NAME_LEN]);
    int HAL_GetDeviceSecret(char device_secret[IOTX_DEVICE_SECRET_LEN]);
    int HAL_GetProductKey(char product_key[IOTX_PRODUCT_KEY_LEN]);
    int HAL_GetFirmwareVersion(char *version);
  • 修改cy8ckit149_sim800tcp_basic.cydsn/Generated_Source/PSoC4/cyfitter.h文件中的宏CYDEV_HEAP_SIZECYDEV_STACK_SIZE,可完成堆栈配置。
    /* cy8ckit149_sim800tcp_basic.cydsn/Generated_Source/PSoC4/cyfitter.h */
    ......
    #define CYDEV_HEAP_SIZE 0x1400
    ......
    #define CYDEV_STACK_SIZE 0x0A00
    ......

编译烧录

  • 点击菜单栏里的Build,按下图操作完成编译
  • 点击菜单栏里的Debug -> program,完成烧录,烧录后复位单板即可运行