全部产品
云市场

STM32F103+SIM800C移植示例

更新时间:2019-06-03 15:00:39

说明

本示例按照MCU+TCP模组中描述的过程,将Link Kit SDK移植到STM32F103,并结合广域网SIM800C连接到阿里云物联网平台。在示例中SIM800C模组支持TCP能力,STM32F103上集成了SDK并使用直接基于MQTT TOPIC的方式与阿里云物联网平台实现数据收发。

用户也可参考本移植方案,将ST其他类型的芯片实现快速连接阿里云物联网平台。

芯片 开发板 参数
STM32F103RBT6 NUCLEO-F103RB 32bits, M3 72Mhz, 128KB-Flash 20KB-SRAM
SIM800C SIM800C开发板

准备

环境搭建

STM32F103

  • 搭建目标:MCU的两个串口(作为调试串口和与模组通信的AT串口)可以正常收发
  • 开发工具:ARM® Keil®IAR™
  • 硬件连接:
    • MCU的AT串口通过Arduino™ Uno或ST morpho接口外接模组,示意图如下(通过TX/RX/GND连接外挂模组)
    • ST开发板ST-LINK驱动
  • 软件环境
    • 使用ST-cubemx新建Project后在Board Seletor选择NUCLEO-F103RB开发板后双击,并添加合适的串口作为MCU与模组通信的AT口,如下图USART1


  • 在Configuration中选择USARTx,并将USART1(作为AT口)的interrupt置为enable,点击Apply/Ok后点击Cubemx的”Project”选项中的”Generate Code”,设置对应的选项,其中Toolchain/IDE可以选择ARM® Keil®IAR™,Heap/Satck size按需选进行配置, 点击OK后自动生成代码和工程。

配置ToolChain/IDE

注:针对不一样的应用场景,需根据实际情况合理修改heap和stack的大小(如上图中圈选位置),在我们的测试中设置4k(0x1000)的Heap和2.5K(0xA00)的Stack可以正常工作

  • 验证
  • 根据上述软件环境配置生成对应的Keil/IAR工程,增加简单的代码,自行验证串口输入输出是否OK。

SIM800

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

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

移植SDK

配置SDK

  • 配置命令
    • Windows运行 config.bat
    • Linux运行 make menuconfig
  • 配置步骤

    如下图所示:

    在本示例中使能了下面的选项:

    • PLATFORM_HAS_STDINT
    • PLATFORM_HAS_DYNMEM
    • FEATURE_MQTT_COMM_ENABLED
      • FEATURE_MQTT_DEFAULT_IMPL
      • FEATURE_MQTT_DIRECT
    • FEATURE_ATM_ENABLED
      • FEATURE_AT_TCP_ENABLED
      • FEATURE_AT_PARSER_ENABLED
        • FEATURE_AT_TCP_HAL_SIM800

注:上面选择了FEATURE_AT_TCP_HAL_SIM800,因此SDK将会生成驱动模组SIM800C相关的AT指令代码。

抽取

  • 抽取命令
    • Window运行extract.bat
    • Linux运行extract.sh
  • 抽取步骤

执行抽取命令后生成的代码路径在output/eng,需要用户实现位于文件output/eng/wrappers/wrapper.c中的HAL对接函数。

集成

按下述步骤集成。

步骤

  • 将抽取生成的output/eng代码atm dev_sign infra mqtt wrappers目录拷贝到上述已生成的Keil/IAR开发环境中,拷贝/使用examples下的mqtt_example_at.c作为示例,并将mqtt_example_at.c中的main函数名更改为mqtt_example以解决编译冲突问题。
  • 在Src/main.c中调用mqtt_example_at.c的mqtt_example函数进行示例验证,更多其他细节请参照MCU+TCP模组中的相关章节。
  1. /* add mqtt example in this file Src/main.c */
  2. int main(void)
  3. {
  4. ......
  5. ......
  6. /* Initialize all configured peripherals */
  7. MX_GPIO_Init();
  8. MX_USART2_UART_Init();
  9. MX_USART1_UART_Init();
  10. .......
  11. mqtt_example(); /* add mqtt_example here*/
  12. }

  • 针对不一样的应用场景,需根据实际情况合理修改heap和stack的大小,本次组合设置4k(0x1000)的heap和2.5K(0xA00)的stack,修改方法如下:

    • Keil中MDK-ARM/startup_xx.s
    • IAR中EWARM/xx_flash.icf
  • 用户需要实现wrapper.c中的HAL函数

    • 本例中因为选择MCU上不运行OS,因此与系统相关的HAL函数实现可以参考文件wrappers\os\nos\HAL_Nos.c中的函数实现
    • 对于 HAL_GetProductKeyHAL_GetDeviceNameHAL_GetDeviceSecret 需要用户返回用户自己设备的相应身份信息
    • 对于HAL_AT_Uart_Init、HAL_AT_Uart_Deinit、HAL_AT_Uart_Recv、HAL_AT_Uart_Send需要用户去进行相关串口初始化以及数据收发
    • wrapper.c参考, STM32上无OS
    • wrapper.c参考, STM32上运行FreeRTOS

IDE配置

Keil/IAR 中添加SDK相关的源码文件,修改头文件路径配置:

Keil配置

按下图依次创建新的Group并修改为linkkit,手动添加源文件(*.c)并设置正确的头文件路径如下。编译、烧录请参考下图6。

  1. # 设置头文件路径,请以实际路径为准
  2. ;../Src/linkkit/atm;../Src/linkkit/dev_sign;../Src/linkkit/infra;../Src/linkkit/mqtt;../Src/linkkit/wrappers


图4. Keil工程下添加Group


图5. Keil工程下添加.c文件


图6. Keil工程下设置头文件路径

IAR配置

类似步骤,依次选择Project -> Add Group,输入“linkkit”,创建新的Group之后将Src\linkkit里所有子目录下的.c文件添加进去,最后Project -> options, 添加以下依赖的头文件路径。编译、烧录请参考下图9。

  1. # 设置头文件路径,请以实际路径为准
  2. $PROJ_DIR$/../Src/linkkit/atm
  3. $PROJ_DIR$/../Src/linkkit/dev_sign
  4. $PROJ_DIR$/../Src/linkkit/infra
  5. $PROJ_DIR$/../Src/linkkit/mqtt
  6. $PROJ_DIR$/../Src/linkkit/wrappers


图7. IAR工程下添加.c文件


图8. IAR工程下设置头文件路径


图9. IAR工程下编译/烧录

结果

  • MCU侧Log
  1. [10:44:17.491]收←◆sim800_uart_selfadaption 283 failed rsp OK
  2. retry count 1
  3. [10:44:17.526]收←◆signal quality is
  4. +CSQ: 31,0
  5. OK
  6. network registration is
  7. +CREG: 0,1
  8. OK
  9. gprs attach check
  10. +CGATT: 1
  11. OK
  12. [10:44:18.809]收←◆mqtt example
  13. MQTT init success!
  14. establish tcp connection with server(host='a1A6QHnzzrT.iot-as-mqtt.cn-shanghai.aliyuncs.com', port=[1883])
  15. [10:44:20.000]收←◆success to establish tcp, fd=0
  16. [10:44:21.576]收←◆mqtt connect success!
  17. devinfo report
  18. devinfo report topic: /sys/a1A6QHnzzrT/test_device/thing/deviceinfo/update
  19. devinfo 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"}
  20. [10:44:22.738]收←◆cmd AT+CIPSEND=0,267 rsp retry 1 at HAL_AT_CONN_Send 858 fail
  21. [10:44:22.820]收←◆devinfo report succeed
  22. firmware version report start in MQTT
  23. firmware report topic: /ota/device/inform/a1A6QHnzzrT/test_device
  24. firmware report data: {"id":"1","params":{"version":"app-1.0.0-20190118.1000"}}
  25. [10:44:23.547]收←◆firmware version report finished, iotx_publish() = 2
  26. PERFORM subscribe to '/a1A6QHnzzrT/test_device/get' (msgId=3)
  27. Packet Ident : 00000003
  28. Topic : /a1A6QHnzzrT/test_device/get
  29. QoS : 0
  30. Packet Length : 35
  31. [10:44:23.861]收←◆mqtt subscribe packet sent,topic = /a1A6QHnzzrT/test_device/get!
  32. [10:44:24.442]收←◆PUBACK
  33. msg->event_type : 9
  34. PUBACK
  35. msg->event_type : 9
  36. PUBACK
  37. msg->event_type : 9
  38. SUBACK
  39. Return Value : 1
  40. Packet ID : 3
  41. Count : 1
  42. Granted QoS[00] : 1
  43. packet_id = 3, event_type=3
  44. msg->event_type : 3
  45. [10:44:25.511]收←◆PUBLISH
  46. Packet Ident : 00000000
  47. Topic Length : 28
  48. Topic Name : /a1A6QHnzzrT/test_device/get
  49. Payload Len/Room : 11 / 992
  50. Receive Buflen : 1024
  51. delivering msg ...
  52. topic be matched
  53. Message Arrived:
  54. Topic : /a1A6QHnzzrT/test_device/get
  55. Payload: hello,world
  56. [10:44:46.408]收←◆PUBLISH
  57. Packet Ident : 00000000
  58. Topic Length : 28
  59. Topic Name : /a1A6QHnzzrT/test_device/get
  60. Payload Len/Room : 11 / 992
  61. Receive Buflen : 1024
  62. delivering msg ...
  63. topic be matched
  64. Message Arrived:
  65. Topic : /a1A6QHnzzrT/test_device/get
  66. Payload: hello,world
  67. [10:45:07.348]收←◆PUBLISH
  68. Packet Ident : 00000000
  69. Topic Length : 28
  70. Topic Name : /a1A6QHnzzrT/test_device/get
  71. Payload Len/Room : 11 / 992
  72. Receive Buflen : 1024
  73. delivering msg ...
  74. topic be matched
  75. Message Arrived:
  76. Topic : /a1A6QHnzzrT/test_device/get
  77. Payload: hello,world
  78. [10:45:22.414]收←◆len = MQTTSerialize_pingreq() = 2
  79. [10:45:23.241]收←◆send MQTT ping...
  80. [10:45:24.246]收←◆receive ping response!
  81. [10:45:29.128]收←◆PUBLISH
  82. Packet Ident : 00000000
  83. Topic Length : 28
  84. Topic Name : /a1A6QHnzzrT/test_device/get
  85. Payload Len/Room : 11 / 992
  86. Receive Buflen : 1024
  87. delivering msg ...
  88. topic be matched
  89. Message Arrived:
  90. Topic : /a1A6QHnzzrT/test_device/get
  91. Payload: hello,world