Microsemi SmartFusion 2 Maker开发板入门指南

介绍

Microsemi Maker 开发板是一款低成本评估套件,搭载 SmartFusion 2片上系统。SmartFusion 2将ARM Cortex-M3处理器与Microsemi基于闪存的FPGA架构集成于单芯片,并包含SoC用户常用的外设,如RAM和DSP模块。Maker开发板额外提供以太网接口、环境光传感器、SPI闪存及若干按键和LED。该开发板还预留了ESP32和ESP8266两种WiFi模块的接口(模块需另购)。

本指南旨在创建演示项目,充分利用Maker开发板的外设资源,并为定制应用开发提供起点。本示例使用FreeRTOS和ESP8266模块构建物联网数据记录设备。

物料清单

资源:

本教程需要以下软件:

注意: 请确保下载SoftConsole v4.0 v5.1 版本 SoftConsole v3.4 支持开发板使用的FlashPro 5编程硬件SoftConsole v5.2+可能兼容,但需大幅修改现有配置

硬件配置

SmartFusion 2硬件配置通过Libero工具完成由于本示例未使用FPGA中的IP核,Libero将用于配置Cortex-M3内核及选择外设

  1. 创建一个新的Libero项目。
  2. 选择M2S010-TQ144 作为目标器件。
  3. 点击下一步 (Next) 接受默认的器件设置。
  4. 选择Create a system builder based design 并点击下一步 (Next)
  5. 点击完成( Finish 。无需HDL源代码,约束条件将在后续添加。
  6. 如果提示选择约束流程,请选择Enhanced Constraint Flow
  7. Libero会要求为系统命名。选择合适名称并点击确定( OK
  8. 随后System Builder将打开。
  9. 点击下一步 (Next)
  10. 在外设页面,启用MM_UART0MM_UART1MSS_I2C0MSS_GPIO
  11. 对于每个外设,点击Enable 框左侧的Configure 按钮。将Connect To 选项改为Fabric
  12. 对于GPIO外设,将GPIO 0-7 设置为连接到FABRIC_A输出
  13. 此时MSS 外设 左侧圆圈应变为绿色,表示配置有效。点击Next。
  14. 从下拉菜单中选择On-chip 25/50 MHz Oscillator 作为时钟源。点击Next。
  15. 点击下一步 (Next) t 接受默认微控制器配置。
  16. 点击下一步 (Next) 接受默认SECDED 配置。
  17. 点击下一步 (Next) 接受默认安全配置。高级安全特性仅适用于带"S"后缀的器件,而Maker-Board并未使用此类器件。
  18. 点击下一步 (Next) 接受默认中断配置。本示例中未使用Fabric中断。
  19. 点击下一步 (Next) 接受默认的内存映射配置。本示例中未使用任何内存映射外设。
  20. 点击完成( Finish 以创建系统。将在框图中创建一个实例。
  21. 打开左侧的IP目录 (Catalog) 并展开宏库( Macro Library 。将两个BIBUF 宏实例拖拽到设计中。
  22. 选中MM_UART0MM_UART1GPIO_FABRIC 接口并右键点击它们。选择提升至顶层 (Promote to Top Level )。
  23. 展开其余分组并选中INIT_DONEFAB_CCC_LOCKFAB_CCC_GL0MSS_READY 右键点击它们并选择标记未使用 (Mark Unused )。
  24. 按下方示意图连接剩余信号。
  25. 保存框图并点击左上角的生成组件 (Generate Component) 按钮。
  26. 返回左侧的设计流程面板。选择综合 (Synthesize )。
  27. 您将在消息中看到若干关于未使用组件的警告,可安全忽略。
  28. 综合完成后,从设计流程面板选择管理约束 (Manage Constraints)
  29. 选择新建 (New 从根模块创建新 I/O 约束( Create New I/O Constraint from Root Module) 。Libero将自动生成填充框图顶层端口的约束文件。
  30. 右键点击生成的文件并选择设为目标( Set as Target
  31. 选择编辑( Edit 使用 I/O 编辑器编辑( Edit with I/O Editor
  32. 按下表设置I/O约束。若无这些设置,请检查IO库设置以配置库电压。
  33. 保存约束并关闭I/O编辑器。
  34. 返回设计流程面板,选择布局布线( Place and Route
  35. 布局布线完成后,运行生成 FPGA 阵列数据( Generate FPGA Array Data
  36. FPGA阵列数据生成后,运行生成比特流( Generate Bitstream
  37. 使用USB线将Maker开发板连接到电脑。选择运行编程操作( Run PROGRAM Action ,将配置加载到开发板上。
  38. 在设计流程面板底部附近,选择配置固件核心( Configure Firmware Cores
  39. 确保所有可用固件都被选中用于生成。每个在开始时启用的外设都应有一个对应的核心。Libero将提示下载电脑上尚未存在的核心。
  40. 从设计流程面板中,选择导出固件( Export Firmware )。 选择SoftConsole4.0 SoftConsole4.0 作为软件集成开发环境( Software IDE 。应勾选导出硬件配置和固件驱动程序( Export hardware configuration and firmware drivers
  41. 硬件配置现已完成。

软件应用

硬件设置完成后,即可进行软件开发。如前所述,本示例使用FreeRTOS创建将数据上传至ThingSpeak的物联网传感器节点。同时创建了一个简单的UART桥接,允许用户手动向ESP8266模块发送AT指令。

功能描述

本节将简要概述示例程序中的四个主要任务。了解FreeRTOS将有所帮助。

本程序中的main() 函数负责:

  • 调用硬件外设(UART、I2C、GPIO)的初始化函数
  • 为两个UART创建接收任务
  • 创建读取I2C传感器的任务
  • 创建向WiFi模块发送传感器数据的任务
  • 启动FreeRTOS调度器

调度器启动后,程序将根据优先级在以下任务处理和中断之间切换。

vTaskSpinLEDs() 大约每85毫秒执行一次。它简单地切换SmartFusion 2的GPIO输出,以在板载的8个LED上创建“旋转”效果。

每当任一UART接收到一个或多个字节时,vTaskUARTBridge() 就会被执行。

  • 当UART中断发生时,中断处理程序(prvUARTRxNotificationHandler )会“发出”任务通知,表示有数据可供读取。中断处理程序退出后,任务将立即开始执行。
  • 该任务尝试获取一个类似信号量的任务通知。如果没有通知/数据可用,任务将阻塞,直到数据变为可用。
  • 当接收到通知时,数据被复制到缓冲区,并通过UART0的终端连接回显。
    • 如果接收到的数据来自UART0(终端),则将其累积在缓冲区中,直到收到\n字符。然后,累积的字符串被发送到UART1上的ESP8266。
    • 如果接收到的数据来自UART1(ESP8266),则将其累积并检查是否为“OK”或某种错误,并通知上传任务。

只要光传感器有数据可用,vTaskUARTUploadData() 就会每20秒执行一次。它简单地用从传感器接收到的数据格式化AT命令字符串,并将其发送到UART1上的ESP8266。使用的AT命令如下。(忽略#后的注释)。

AT+CIPSTART="TCP","184.106.153.149",80                          # Start a TCP connection to the ThingSpeak API server on port 80
  
AT+CIPSEND=XX                                                   # Declare a transfer of XX bytes to the server
  
>GET /update?api_key=XXXXXXXXXXXXXXXX&field1=yy&field2=zz        # Send a GET request using a custom API key and two data values
  
# Server will respond with the number of entries on the channel and close the connection
# +IPD,3:539CLOSED

vTaskReadLightSensor() 在首次执行时初始化I2C传感器。每次后续执行都会轮询传感器以获取新数据。如果有新数据可用,则从传感器读取,并向上传任务发送包含新数据的通知以进行处理。然后,该任务将阻塞传感器的采样率(默认为500毫秒)。

设置

在编写任何代码之前,使用SoftConsole v4.0时需要按照SoftConsole v4.0发行说明中概述的初始步骤进行操作。还需要将Libero中生成的固件核心导入到项目中。

  1. 打开SoftConsole并选择一个方便的目录作为工作区。
  2. 在SoftConsole中,选择文件( File 新建( New C 项目( C Project
  3. 为项目命名。确保选择Cross ARM GCC作为工具链。
  4. 点击下一步( Next 以接受默认配置。
  5. 确认工具链名称为GNU Tools for ARM Embedded Processors (arm-none-eabi-gcc)。点击完成(Finish)
  6. 项目创建后,在项目资源管理器中右键点击它。选择导入( Import )。 选择导入文件系统( File System )。
  7. 浏览至Libero导出的固件所在目录。勾选固件文件夹以包含其中的所有文件。
  8. 选择复制到项目工作区中名为firmware 的新文件夹。点击完成( Finish 将固件文件导入项目。
  9. 在项目资源管理器中右键点击项目。选择属性( Properties 。展开C/C++ 构建( C/C++ Build 选项卡,点击设置( Settings
  10. 工具设置( Tool Settings Cross ARM C 链接器( Cross ARM C Linker 常规( General 下,点击右上角的添加( Add …按钮选择链接器脚本。脚本位于firmware/CMSIS/startup_gcc/debug-in-microsemi-smartfusion2-esram.ld
  11. 工具设置( Tool Settings Cross ARM C 链接器( Cross ARM C Linker 杂项( Miscellaneous 下,勾选Use newlib nano(–specs=nano.specs) 选项。
  12. 工具设置( Tool Settings Cross ARM C 编译器( Cross ARM C Compiler 杂项( Miscellaneous 其他编译器标志( Other compiler flag 中,输入(不带引号)“–specs=cmsis.specs”
  13. 选择顶部的工具链( Toolchains 选项卡。在底部附近,勾选创建扩展列表( Create extended listing 选项。
  14. 点击确定( OK 应用更改。
  15. 选择运行( Run 调试配置( Debug Configurations 。双击GDB OpenOCD 调试( GDB OpenOCD Debugging 以创建新配置。
  16. 点击调试器( Debugger 选项卡。将配置选项( Config options 改为 “–command “set DEVICE M2S010” --file board/microsemi-cortex-m3.cfg”
  17. 初始设置现已完成。稍后,项目构建完成后,需将可执行文件添加到配置中。

导入 FreeRTOS

设置完成后,下一步是将FreeRTOS源代码导入项目。使用SmartFusion 2时并非必须使用FreeRTOS,但在将项目扩展到更高级应用时,它能简化多任务处理。

  1. 从上方下载并解压FreeRTOS源码至便捷位置。
  2. 在FreeRTOS的Demo目录中找到CORTEX_SmartFusion2_M2S050_SoftConsole文件夹。运行CreateProjectDirectoryStructure.bat 文件以建立项目结构。
  3. 在SoftConsole中右键点击项目并选择导入( Import )。 在常规选项下,选择文件系统( File System 。导航至FreeRTOS源码目录。
  4. 勾选整个FreeRTOS-Source 目录,同时从RTOSDemo 目录导入FreeRTOSConfig.h 。可包含演示中的其他文件以尝试官方FreeRTOS演示或参考,但本示例中非必需。
    注意 :若构建时出现以下错误:tasks.c中未定义引用ulGetRunTimeCounterValue和vConfigureTimerForRunTimeStats,请包含上文高亮的RunTimeStatsTimer.c文件。
  5. 选择工作区中的文件夹(如*…/FreeRTOS* )作为导入目标。点击完成( Finish 将文件导入项目。
  6. 现在项目中应包含所有FreeRTOS源文件。

导入示例源代码

通过下方链接下载示例项目源代码:

示例源码.zip (11.5 KB)

按上述步骤将文件导入SoftConsole。

包含路径

此时项目应包含所有文件,但尝试构建时仍会出现找不到头文件的错误。需告知SoftConsole刚导入的头文件所在位置。

  1. 右键点击项目。选择属性( Properties )。
  2. 展开C/C++ 通用( C/C++ General 部分。选择路径和符号( Paths and Symbols
  3. 通过使用添加(Add)…→工作空间(Workspace)→,将上述导入的所有文件夹添加为包含路径。最终结果应类似于:
  4. SoftConsole现在应能定位编译所需的所有头文件。

连接至 ThingSpeak

完成示例项目需要一个免费的ThingSpeak账户。ThingSpeak是MathWorks提供的物联网数据记录平台。本节假设您已创建账户。

  1. 在ThingSpeak中创建一个至少包含2个数据字段的频道。根据需要填写其他信息。生成的登录页面将如此显示,但无任何数据条目。
  2. 点击API密钥标签( API Keys 查看您的个人写入 API 密钥( Write API Key 。复制此密钥。
  3. 在SoftConsole中打开 uart.c 文件。在函数vTaskUARTUploadData 中, 将 ucGetReq[] 中的 API密钥值更 改为上述密钥。

uart.c

void vTaskUARTUploadData(void *pvParameters)
{
    const uint8_t ucConnectCmd[] = "AT+CIPSTART=\"TCP\",\"184.106.153.149\",80\r\n";
    const uint8_t ucSendCmd[] = "AT+CIPSEND=";
    const uint8_t ucGetReq[] = "GET /update?api_key=XXXXXXXXXXXXXXXX&field1=";      // Replace this API key with your own
    const uint8_t ucField2[] = "&field2=";
    const uint8_t ucCloseCmd[] = "AT+CIPCLOSE\r\n";
    const uint8_t ucCRLF[] = "\r\n";
  
    /* ... */
}

构建并运行项目

此时,项目应已准备就绪,可在开发板上构建并运行。若编译中收到任何错误,请返回检查确保所有内容与示例一致。

  1. 在SoftConsole中,选择项目全部构建( Ctrl+B 以编译项目。
  2. 构建完成后,选择运行( Run 调试配置( Debug Configurations
  3. 点击搜索项目( Search Project 按钮查找刚创建的.elf文件。它应是唯一选项。
  4. 使用随附的USB线将开发板连接至电脑。
  5. 点击Debug 将程序烧录到硬件上。此时应看到LED灯呈现"旋转"式闪烁。

演示程序使用说明

首次运行演示程序时,负责向ThingSpeak上传数据的FreeRTOS任务处于禁用状态。此时SmartFusion仅作为PC终端与开发板上ESP8266模块之间的UART桥接器。这样设计的目的是让用户在启动自动上传任务前,能手动配置ESP8266连接WiFi接入点。当然用户也可根据需求在应用代码中添加此功能。模块成功连接接入点后,即使断电重启仍会保持该连接配置。

打开任意终端程序。Maker-Board会在电脑上生成4个连续的COM端口。UART连接对应第三个端口。

参数设置为 115200 波特率 -8 位数据位 -1 位停止位 - 无校验位。请确保将终端设置为按下回车键时发送 CR+LF 。但波特率可能因 ESP 模块固件版本不同有所差异。

  1. 使用下列命令连接接入点(#号后为注释内容,无需输入)。每条成功执行的命令都应返回"OK"。
AT+CWMODE=1                                     # Set the module to station (client) mode
  
AT+CWLAP                                        # List all visible APs
  
AT+CWJAP="<SSID>","<PASSWORD>"                  # Join an AP
  1. 当ESP8266成功连接接入点后,返回SoftConsole并修改main.c 文件中以下代码

main.c

/* Standard includes. */
#include <stdio.h>
 
/* Kernel includes. */
#include "FreeRTOS.h"
#include "task.h"
#include "semphr.h"
 
/* Driver includes. */
#include "drivers/mss_uart/mss_uart.h"  // For baud rate defines and instances
 
/* Application includes. */
#include "leds.h"
#include "uart.h"
#include "i2c.h"
 
/* Set to 1 to enable the upload tasks once the module has been set up */
#define ENABLE_UPLOAD    1                  // Change from 0 to 1
  
/* ... */
  1. 重新编译工程。此时程序将创建两个FreeRTOS任务:读取I2C环境光传感器数据并向ThingSpeak发送数据。SmartFusion 2现在应能通过WiFi每20秒发送一次数据更新。

结论

本指南提供基于FreeRTOS的Maker-Board示例程序,演示了板上大多数外设的用法。该示例可作为用户开发自有应用的基础框架,无论是否使用FreeRTOS。

附加信息

加州大学欧文分校与Microsemi合作开发了Maker-Board演示项目,包含ESP32和ESP8266的示例。他们的工作记录在下面的GitHub页面上:

CalPlug GitHub

以下指南详细介绍了Maker-Board的类似设置,但不包含WiFi和FreeRTOS组件。它还包含略有不同的编程方法。

在Github上开始使用M2S010-MKR-KIT

问题 / 评论

如有任何问题或意见,请访问得捷电子技术论坛