全部产品
云市场

CY8C4147AZI-S475移植示例

更新时间:2019-03-21 09:49:27

CY8C4147AZI-S475 + SIM800(TCP) + SDK基础版

目标

本文以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功能sal+tcp

抽取

  • 抽取命令
    • Window运行extract.bat
    • Linux运行extract.sh
  • 抽取步骤根据上述配置,执行抽取命令后生成的代码路径在output/eng,用户需要实现文杰output/eng/wrappers/wrapper.c中的HAL函数。
  • 抽取结果抽取完成的SDK源码会输出到 output/eng/ 目录,结构如下:

    1. output/eng/
    2. ├── atm
    3. ├── at_api.c
    4. ├── at_api.h
    5. ├── at_conn_mbox.c
    6. ├── at_conn_mbox.h
    7. ├── at_conn_mgmt.c
    8. ├── at_conn_mgmt.h
    9. ├── at_parser.c
    10. ├── at_parser.h
    11. ├── at_tcp.c
    12. ├── at_wrapper.h
    13. └── sim800.c
    14. ├── dev_sign
    15. ├── dev_sign_api.h
    16. ├── dev_sign_config.h
    17. ├── dev_sign_internal.h
    18. ├── dev_sign_mqtt.c
    19. └── dev_sign_wrapper.h
    20. ├── examples
    21. ├── dev_sign_example.c
    22. └── mqtt_example_at.c # 连云的mqtt示例
    23. ├── infra
    24. ├── infra_compat.h
    25. ├── infra_config.h
    26. ├── infra_defs.c
    27. ├── infra_defs.h
    28. ├── infra_list.h
    29. ├── infra_net.c
    30. ├── infra_net.h
    31. ├── infra_report.c
    32. ├── infra_report.h
    33. ├── infra_sha256.c
    34. ├── infra_sha256.h
    35. ├── infra_string.c
    36. ├── infra_string.h
    37. ├── infra_timer.c
    38. ├── infra_timer.h
    39. └── infra_types.h
    40. ├── mqtt
    41. ├── iotx_mqtt_client.c
    42. ├── iotx_mqtt_client.h
    43. ├── iotx_mqtt_config.h
    44. ├── mqtt_api.c
    45. ├── mqtt_api.h
    46. ├── MQTTConnectClient.c
    47. ├── MQTTConnect.h
    48. ├── MQTTDeserializePublish.c
    49. ├── mqtt_internal.h
    50. ├── MQTTPacket.c
    51. ├── MQTTPacket.h
    52. ├── MQTTPublish.h
    53. ├── MQTTSerializePublish.c
    54. ├── MQTTSubscribeClient.c
    55. ├── MQTTSubscribe.h
    56. ├── MQTTUnsubscribeClient.c
    57. ├── MQTTUnsubscribe.h
    58. └── mqtt_wrapper.h
    59. └── wrappers
    60. ├── wrapper.c
    61. └── wrappers_defs.h
    62. 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

      添加的头文件参考如下:

      1. .\linkkit\atm; .\linkkit\dev_sign; .\linkkit\infra; .\linkkit\mqtt; .\linkkit\wrappers

代码集成

  • 按上节所述,已将抽取生成的output/eng代码atm dev_sign infra mqtt wrappers目录拷贝到PSoC Creator工程中,并使用examples下的mqtt_example_at.c作为示例;现需要将mqtt_example_at.c中的main函数名更改为mqtt_example以解决编译冲突问题。
  • 在cy8ckit149_sim800tcp_basic.cydsn/main.c中调用mqtt_example_at.c的mqtt_example函数进行示例验证,更多其他细节请MCU+TCP模组
  1. /* cy8ckit149_sim800tcp_basic.cydsn/main.c */
  2. volatile uint64_t msCount = 0;
  3. void SysTickISRCallback(void)
  4. {
  5. /* Counts the number of milliseconds in one second */
  6. msCount++;
  7. }
  8. int main()
  9. {
  10. /* Start the SW_Tx_UART Component */
  11. SW_Tx_UART_Start();
  12. /* Global Int Enable */
  13. CyGlobalIntEnable;
  14. /* Start Systick */
  15. CySysTickStart();
  16. /* Register Systick Callback */
  17. CySysTickSetCallback(0, SysTickISRCallback);
  18. /* Enter mqtt example */
  19. mqtt_example();
  20. }
  • 三元组DeviceName ProductKey DeviceSecret 需要通过创建产品(基础版)单个创建设备获取,
  • 并注意创建时需要将产品Topic类列表中的’get’权限从默认的’订阅’改成’发布和订阅’

  1. # wrappers/wrapper.c, 14 HAL functions implementation need to be done.
  2. int32_t HAL_AT_Uart_Init(uart_dev_t *uart);
  3. int32_t HAL_AT_Uart_Deinit(uart_dev_t *uart);
  4. int32_t HAL_AT_Uart_Recv(uart_dev_t *uart, void *data, uint32_t expect_size,
  5. uint32_t *recv_size, uint32_t timeout);
  6. int32_t HAL_AT_Uart_Send(uart_dev_t *uart, const void *data, uint32_t size, uint32_t timeout);
  7. void *HAL_Malloc(uint32_t size);
  8. void HAL_Free(void *ptr);
  9. void HAL_Printf(const char *fmt, ...);
  10. int HAL_Snprintf(char *str, const int len, const char *fmt, ...);
  11. void HAL_SleepMs(uint32_t ms);
  12. uint64_t HAL_UptimeMs(void);
  13. int HAL_GetDeviceName(char device_name[IOTX_DEVICE_NAME_LEN]);
  14. int HAL_GetDeviceSecret(char device_secret[IOTX_DEVICE_SECRET_LEN]);
  15. int HAL_GetProductKey(char product_key[IOTX_PRODUCT_KEY_LEN]);
  16. int HAL_GetFirmwareVersion(char *version);

HAL参考实现代码即将释放,请耐心等待

  • 修改cy8ckit149_sim800tcp_basic.cydsn/Generated_Source/PSoC4/cyfitter.h文件中的宏CYDEV_HEAP_SIZE和CYDEV_STACK_SIZE,可完成堆栈配置。
  1. /* cy8ckit149_sim800tcp_basic.cydsn/Generated_Source/PSoC4/cyfitter.h */
  2. ......
  3. #define CYDEV_HEAP_SIZE 0x1400
  4. ......
  5. #define CYDEV_STACK_SIZE 0x0A00
  6. ......

编译烧录

  • 点击菜单栏里的Build,按下图操作完成编译

  • 点击菜单栏里的Debug -> program,完成烧录,烧录后复位单板即可运行

运行结果

  • MCU侧Log```signal quality is+CSQ: 31,0

OK

network registration is+CREG: 0,1

OK

gprs attach check+CGATT: 1

OK

sim800_gprs_ip_init 418 failed rsp retry count 1

sim800_gprs_ip_init 418 failed rsp retry count 2

mqtt exampleMQTT init success!establish tcp connection with server(host=’a1xU96HtbHc.iot-as-mqtt.cn-shanghai.aliyuncs.com’, port=[1883])success to establish tcp, fd=0mqtt connect success!devinfo reportdevinfo report topic: /sys/a1xU96HtbHc/ni7iJnIHDoaLSN3VY8vM/thing/deviceinfo/updatedevinfo report data: {“id”:”0”,”version”:”1.0”,”params”:[{“attrKey”:”SYS_LP_SDK_VERSION”,”attrValue”:”3.0.0”,”domain”:”SYSTEM”},{“attrKey”:”SYS_SDK_LANGUAGE”,”attrValue”:”C”,”domain”:”SYSTEM”}],”method”:”thing.deviceinfo.update”}cmd AT+CIPSEND=0,276 rsp retry 1 at HAL_AT_CONN_Send 858 fail

devinfo report succeedfirmware version report start in MQTTfirmware report topic: /ota/device/inform/a1xU96HtbHc/ni7iJnIHDoaLSN3VY8vMfirmware report data: {“id”:”1”,”params”:{“version”:”app-1.0.0-20190118.1000”}}firmware version report finished, iotx_publish() = 2PERFORM subscribe to ‘/a1xU96HtbHc/ni7iJnIHDoaLSN3VY8vM/get’ (msgId=3) Packet Ident : 00000003 Topic : /a1xU96HtbHc/ni7iJnIHDoaLSN3VY8vM/get QoS : 0 Packet Length : 44mqtt subscribe packet sent,topic = /a1xU96HtbHc/ni7iJnIHDoaLSN3VY8vM/get!PUBACKmsg->event_type : 9PUBACKmsg->event_type : 9PUBACKmsg->event_type : 9SUBACK Return Value : 1 Packet ID : 3 Count : 1 Granted QoS[00] : 1packet_id = 3, event_type=3msg->event_type : 3PUBLISH Packet Ident : 00000000 Topic Length : 37 Topic Name : /a1xU96HtbHc/ni7iJnIHDoaLSN3VY8vM/get Payload Len/Room : 11 / 983 Receive Buflen : 1024delivering msg …topic be matchedMessage Arrived:Topic : /a1xU96HtbHc/ni7iJnIHDoaLSN3VY8vM/getPayload: hello,world

PUBLISH Packet Ident : 00000000 Topic Length : 37 Topic Name : /a1xU96HtbHc/ni7iJnIHDoaLSN3VY8vM/get Payload Len/Room : 11 / 983 Receive Buflen : 1024delivering msg …topic be matchedMessage Arrived:Topic : /a1xU96HtbHc/ni7iJnIHDoaLSN3VY8vM/getPayload: hello,world

```

  • 云端log