介绍
Microsemi Maker 开发板是一款低成本评估套件,搭载 SmartFusion 2片上系统。SmartFusion 2将ARM Cortex-M3处理器与Microsemi基于闪存的FPGA架构集成于单芯片,并包含SoC用户常用的外设,如RAM和DSP模块。Maker开发板额外提供以太网接口、环境光传感器、SPI闪存及若干按键和LED。该开发板还预留了ESP32和ESP8266两种WiFi模块的接口(模块需另购)。
本指南旨在创建演示项目,充分利用Maker开发板的外设资源,并为定制应用开发提供起点。本示例使用FreeRTOS和ESP8266模块构建物联网数据记录设备。
物料清单
- Microsemi Maker开发板:M2S010-MKR-KIT(仅通过DigiKey销售)
- ESP8266模块:1568-1235-ND
- ESP32模块:1738-1294-ND
资源:
本教程需要以下软件:
- Microsemi Libero SoC v11.8或更高版本指南使用v11.8 SP1版本
- Microsemi SoftConsole v4.0
- FreeRTOS源码
- FreeRTOS指南
- ESP8266指令参考
- 开发板原理图 - DIGIKEY MAKER KIT REVA1_0_20170606.pdf (446.2 KB)
注意: 请确保下载SoftConsole v4.0 或 v5.1 版本 SoftConsole v3.4不 支持开发板使用的FlashPro 5编程硬件SoftConsole v5.2+可能兼容,但需大幅修改现有配置
硬件配置
SmartFusion 2硬件配置通过Libero工具完成由于本示例未使用FPGA中的IP核,Libero将用于配置Cortex-M3内核及选择外设
- 创建一个新的Libero项目。
- 选择M2S010-TQ144 作为目标器件。
- 点击下一步 (Next) 接受默认的器件设置。
- 选择Create a system builder based design 并点击下一步 (Next) 。
- 点击完成( Finish ) 。无需HDL源代码,约束条件将在后续添加。
- 如果提示选择约束流程,请选择Enhanced Constraint Flow 。
- Libero会要求为系统命名。选择合适名称并点击确定( OK ) 。
- 随后System Builder将打开。
- 点击下一步 (Next) 。
- 在外设页面,启用MM_UART0 、MM_UART1 、MSS_I2C0 和MSS_GPIO 。
- 对于每个外设,点击Enable 框左侧的Configure 按钮。将Connect To 选项改为Fabric 。
- 对于GPIO外设,将GPIO 0-7 设置为连接到FABRIC_A 的输出。
- 此时MSS 外设 左侧圆圈应变为绿色,表示配置有效。点击Next。
- 从下拉菜单中选择On-chip 25/50 MHz Oscillator 作为时钟源。点击Next。
- 点击下一步 (Next) t 接受默认微控制器配置。
- 点击下一步 (Next) 接受默认SECDED 配置。
- 点击下一步 (Next) 接受默认安全配置。高级安全特性仅适用于带"S"后缀的器件,而Maker-Board并未使用此类器件。
- 点击下一步 (Next) 接受默认中断配置。本示例中未使用Fabric中断。
- 点击下一步 (Next) 接受默认的内存映射配置。本示例中未使用任何内存映射外设。
- 点击完成( Finish ) 以创建系统。将在框图中创建一个实例。
- 打开左侧的IP目录 (Catalog) 并展开宏库( Macro Library ) 。将两个BIBUF 宏实例拖拽到设计中。
- 选中MM_UART0 、MM_UART1 和GPIO_FABRIC 接口并右键点击它们。选择提升至顶层 (Promote to Top Level )。
- 展开其余分组并选中INIT_DONE 、FAB_CCC_LOCK 、FAB_CCC_GL0 和MSS_READY 。 右键点击它们并选择标记未使用 (Mark Unused )。
- 按下方示意图连接剩余信号。
- 保存框图并点击左上角的生成组件 (Generate Component) 按钮。
- 返回左侧的设计流程面板。选择综合 (Synthesize )。
- 您将在消息中看到若干关于未使用组件的警告,可安全忽略。
- 综合完成后,从设计流程面板选择管理约束 (Manage Constraints) 。
- 选择新建 (New ) → 从根模块创建新 I/O 约束( Create New I/O Constraint from Root Module) 。Libero将自动生成填充框图顶层端口的约束文件。
- 右键点击生成的文件并选择设为目标( Set as Target ) 。
- 选择编辑( Edit ) →使用 I/O 编辑器编辑( Edit with I/O Editor ) 。
- 按下表设置I/O约束。若无这些设置,请检查IO库设置以配置库电压。
- 保存约束并关闭I/O编辑器。
- 返回设计流程面板,选择布局布线( Place and Route ) 。
- 布局布线完成后,运行生成 FPGA 阵列数据( Generate FPGA Array Data ) 。
- FPGA阵列数据生成后,运行生成比特流( Generate Bitstream ) 。
- 使用USB线将Maker开发板连接到电脑。选择运行编程操作( Run PROGRAM Action ) ,将配置加载到开发板上。
- 在设计流程面板底部附近,选择配置固件核心( Configure Firmware Cores ) 。
- 确保所有可用固件都被选中用于生成。每个在开始时启用的外设都应有一个对应的核心。Libero将提示下载电脑上尚未存在的核心。
- 从设计流程面板中,选择导出固件( Export Firmware )。 选择SoftConsole4.0 ( SoftConsole4.0 ) 作为软件集成开发环境( Software IDE ) 。应勾选导出硬件配置和固件驱动程序( Export hardware configuration and firmware drivers ) 。
- 硬件配置现已完成。
软件应用
硬件设置完成后,即可进行软件开发。如前所述,本示例使用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中生成的固件核心导入到项目中。
- 打开SoftConsole并选择一个方便的目录作为工作区。
- 在SoftConsole中,选择文件( File ) →新建( New ) →C 项目( C Project ) 。
- 为项目命名。确保选择Cross ARM GCC作为工具链。
- 点击下一步( Next ) 以接受默认配置。
- 确认工具链名称为GNU Tools for ARM Embedded Processors (arm-none-eabi-gcc)。点击完成(Finish)。
- 项目创建后,在项目资源管理器中右键点击它。选择导入( Import )。 选择导入文件系统( File System )。
- 浏览至Libero导出的固件所在目录。勾选固件文件夹以包含其中的所有文件。
- 选择复制到项目工作区中名为firmware 的新文件夹。点击完成( Finish ) 将固件文件导入项目。
- 在项目资源管理器中右键点击项目。选择属性( Properties ) 。展开C/C++ 构建( C/C++ Build ) 选项卡,点击设置( Settings ) 。
- 在工具设置( Tool Settings ) →Cross ARM C 链接器( Cross ARM C Linker ) →常规( General ) 下,点击右上角的添加( Add ) …按钮选择链接器脚本。脚本位于firmware/CMSIS/startup_gcc/debug-in-microsemi-smartfusion2-esram.ld 。
- 在工具设置( Tool Settings ) →Cross ARM C 链接器( Cross ARM C Linker ) →杂项( Miscellaneous ) 下,勾选Use newlib nano(–specs=nano.specs) 选项。
- 在工具设置( Tool Settings ) →Cross ARM C 编译器( Cross ARM C Compiler ) →杂项( Miscellaneous ) →其他编译器标志( Other compiler flag ) 中,输入(不带引号)“–specs=cmsis.specs”。
- 选择顶部的工具链( Toolchains ) 选项卡。在底部附近,勾选创建扩展列表( Create extended listing ) 选项。
- 点击确定( OK ) 应用更改。
- 选择运行( Run ) →调试配置( Debug Configurations ) 。双击GDB OpenOCD 调试( GDB OpenOCD Debugging ) 以创建新配置。
- 点击调试器( Debugger ) 选项卡。将配置选项( Config options ) 改为 “–command “set DEVICE M2S010” --file board/microsemi-cortex-m3.cfg”
- 初始设置现已完成。稍后,项目构建完成后,需将可执行文件添加到配置中。
导入 FreeRTOS
设置完成后,下一步是将FreeRTOS源代码导入项目。使用SmartFusion 2时并非必须使用FreeRTOS,但在将项目扩展到更高级应用时,它能简化多任务处理。
- 从上方下载并解压FreeRTOS源码至便捷位置。
- 在FreeRTOS的Demo目录中找到CORTEX_SmartFusion2_M2S050_SoftConsole文件夹。运行CreateProjectDirectoryStructure.bat 文件以建立项目结构。
- 在SoftConsole中右键点击项目并选择导入( Import )。 在常规选项下,选择文件系统( File System ) 。导航至FreeRTOS源码目录。
- 勾选整个FreeRTOS-Source 目录,同时从RTOSDemo 目录导入FreeRTOSConfig.h 。可包含演示中的其他文件以尝试官方FreeRTOS演示或参考,但本示例中非必需。
注意 :若构建时出现以下错误:tasks.c中未定义引用ulGetRunTimeCounterValue和vConfigureTimerForRunTimeStats
,请包含上文高亮的RunTimeStatsTimer.c文件。 - 选择工作区中的文件夹(如*…/FreeRTOS* )作为导入目标。点击完成( Finish ) 将文件导入项目。
- 现在项目中应包含所有FreeRTOS源文件。
导入示例源代码
通过下方链接下载示例项目源代码:
示例源码.zip (11.5 KB)
按上述步骤将文件导入SoftConsole。
包含路径
此时项目应包含所有文件,但尝试构建时仍会出现找不到头文件的错误。需告知SoftConsole刚导入的头文件所在位置。
- 右键点击项目。选择属性( Properties )。
- 展开C/C++ 通用( C/C++ General ) 部分。选择路径和符号( Paths and Symbols ) 。
- 通过使用添加(Add)…→工作空间(Workspace)→,将上述导入的所有文件夹添加为包含路径。最终结果应类似于:
- SoftConsole现在应能定位编译所需的所有头文件。
连接至 ThingSpeak
完成示例项目需要一个免费的ThingSpeak账户。ThingSpeak是MathWorks提供的物联网数据记录平台。本节假设您已创建账户。
- 在ThingSpeak中创建一个至少包含2个数据字段的频道。根据需要填写其他信息。生成的登录页面将如此显示,但无任何数据条目。
- 点击API密钥标签( API Keys ) 查看您的个人写入 API 密钥( Write API Key ) 。复制此密钥。
- 在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";
/* ... */
}
构建并运行项目
此时,项目应已准备就绪,可在开发板上构建并运行。若编译中收到任何错误,请返回检查确保所有内容与示例一致。
- 在SoftConsole中,选择项目→全部构建( Ctrl+B ) 以编译项目。
- 构建完成后,选择运行( Run ) →调试配置( Debug Configurations ) 。
- 点击搜索项目( Search Project ) 按钮查找刚创建的.elf文件。它应是唯一选项。
- 使用随附的USB线将开发板连接至电脑。
- 点击Debug 将程序烧录到硬件上。此时应看到LED灯呈现"旋转"式闪烁。
演示程序使用说明
首次运行演示程序时,负责向ThingSpeak上传数据的FreeRTOS任务处于禁用状态。此时SmartFusion仅作为PC终端与开发板上ESP8266模块之间的UART桥接器。这样设计的目的是让用户在启动自动上传任务前,能手动配置ESP8266连接WiFi接入点。当然用户也可根据需求在应用代码中添加此功能。模块成功连接接入点后,即使断电重启仍会保持该连接配置。
打开任意终端程序。Maker-Board会在电脑上生成4个连续的COM端口。UART连接对应第三个端口。
参数设置为 115200 波特率 -8 位数据位 -1 位停止位 - 无校验位。请确保将终端设置为按下回车键时发送 CR+LF 。但波特率可能因 ESP 模块固件版本不同有所差异。
- 使用下列命令连接接入点(#号后为注释内容,无需输入)。每条成功执行的命令都应返回"OK"。
AT+CWMODE=1 # Set the module to station (client) mode
AT+CWLAP # List all visible APs
AT+CWJAP="<SSID>","<PASSWORD>" # Join an AP
- 当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
/* ... */
- 重新编译工程。此时程序将创建两个FreeRTOS任务:读取I2C环境光传感器数据并向ThingSpeak发送数据。SmartFusion 2现在应能通过WiFi每20秒发送一次数据更新。
结论
本指南提供基于FreeRTOS的Maker-Board示例程序,演示了板上大多数外设的用法。该示例可作为用户开发自有应用的基础框架,无论是否使用FreeRTOS。
附加信息
加州大学欧文分校与Microsemi合作开发了Maker-Board演示项目,包含ESP32和ESP8266的示例。他们的工作记录在下面的GitHub页面上:
以下指南详细介绍了Maker-Board的类似设置,但不包含WiFi和FreeRTOS组件。它还包含略有不同的编程方法。
问题 / 评论
如有任何问题或意见,请访问得捷电子技术论坛