本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
在 Renesas RX65N 上下载、构建、刷写和运行 FreeRTOS OTA 演示
重要
该参考集成托管在已弃用的 Amazon-FreeRTOS 存储库中。当您创建新项目时,我们建议从此处开始。如果您已经有一个基于现已弃用的 Amazon-FreeRTOS 存储库的 FreeRTOS 项目,请参阅 亚马逊免费版 RTOS Github 存储库迁移指南。
本章介绍如何在 Renesas RX65N 上下载、构建、刷写和运行 FreeRTOS OTA 演示应用程序。
设置操作环境
在本节中,此过程使用以下环境:
-
IDE:e2 studio 7.8.0、e2 studio 2020-07
-
工具链:CCRX Compiler v3.0.1
-
目标设备:RSKRX65N-2MB
-
调试程序:E2、E2 Lite 模拟器
-
软件:Renesas Flash Programmer、Renesas Secure Flash Programmer.exe、Tera Term
设置硬件
-
将 E2 Lite 模拟器和 USB 串行端口连接到 RX65N 主板和 PC。
-
将电源连接到 RX65N。
设置您的 AWS 资源
-
要运行 FreeRTOS 演示,您必须拥有 AWS 一个拥有有权访问服务的 IAM 用户的账户。 AWS IoT 如果尚未执行此操作,请按照设置您的 AWS 账户和权限中的步骤操作。
-
要设置 OTA 更新,请按照 OTA更新先决条件中的步骤操作。特别是,请按照使用进行OTA更新的先决条件 MQTT中的步骤操作。
-
打开AWS IoT 控制台
。 -
在左侧导航窗格中选择管理,然后选择事物,以便创建事物。
事物是 AWS IoT中的特定设备或逻辑实体的表示形式。它可以是物理设备或传感器(例如,灯泡或墙壁上的开关)。它也可以是一个逻辑实体,例如应用程序或物理实体的实例 AWS IoT,它不连接但与连接的设备相关(例如,带有发动机传感器或控制面板的汽车)。 AWS IoT 提供了一个事物注册表,可帮助您管理事物。
-
选择创建,然后选择创建单个事物。
-
输入事物的名称,然后选择下一步。
-
选择创建证书。
-
下载创建的三个文件,然后选择激活。
-
选择附加策略。
-
选择在 设备策略 中创建的策略。
每台使用 MQTT 接收 OTA 更新的设备都必须注册为事物, AWS IoT 并且该设备必须具有与列出的策略类似的附加策略。您可以在 AWS IoT 核心策略操作和 AWS IoT 核心操作资源中找到有关
"Action"
和"Resource"
对象中项目的更多信息。注意
-
这些
iot:Connect
权限允许您的设备通过 MQTT AWS IoT 进行连接。 -
利用 AWS IoT 作业 (
.../jobs/*
) 主题的iot:Subscribe
和iot:Publish
权限,连接的设备能够接收作业通知和作业文档,并发布作业执行的完成状态。 -
AWS IoT OTA 直播主题的
iot:Subscribe
和iot:Publish
权限 (.../streams/*
) 允许连接的设备从中获取 OTA 更新数据 AWS IoT。在通过 MQTT 执行固件更新时,需要这些权限。 -
这些
iot:Receive
权限 AWS IoT Core 允许将有关这些主题的消息发布到连接的设备。每次传输 MQTT 消息时,都将检查此权限。您可以使用此权限,撤消对当前订阅主题的客户端的访问权限。
-
-
-
创建代码签名配置文件并在上注册代码签名证书。 AWS
-
要创建密钥和认证,请参阅 Renesas MCU 固件更新设计政策
中的第 7.3 节“使用 OpenSSL 生成 ECDSA-SHA256 密钥对”。 -
打开AWS IoT 控制台
。在左导航窗格中,选择管理,然后选择作业。选择创建作业,然后选择创建 OTA 更新作业。 -
在选择要更新的设备下,选择选择,然后选择之前创建的事物。选择下一步。
-
在创建 FreeRTOS OTA 更新作业页面上,执行以下操作:
-
在选择固件映像传输协议中,选择 MQTT。
-
对于选择并签署固件映像,选择为我签署一个新的固件映像。
-
对于代码签名配置文件,选择创建。
-
在创建代码签名配置文件窗口中,输入配置文件名称。对于设备硬件平台,选择 Windows 模拟器。对于代码签名证书,选择导入。
-
浏览以选择证书 (
secp256r1.crt
)、证书私钥 (secp256r1.key
) 和证书链 (ca.crt
)。 -
输入设备上代码签名证书的路径名。然后选择创建。
-
-
-
要授予对的代码签名的访问权限 AWS IoT,请按照中的步骤操作授予对代码签名的访问权限 AWS IoT。
如果您的 PC 上没有安装 Tera Term,可以从 https://ttssh2.osdn.jp/index.html.en
导入、配置头文件并构建 aws_demos 和 boot_loader
首先,您需要选择最新版本的 FreeRTOS 软件包,该软件包将 GitHub 从项目中下载并自动导入到项目中。这样,您就可以专注于配置 FreeRTOS 和编写应用程序代码。
-
启动 e2 Studio。
-
选择文件,然后选择导入…。
-
选择瑞萨电子 FreeRTO GitHub S(含物联网库)项目。
-
选择查看更多版本…以显示下载对话框。
-
选择最新的程序包。
-
选择同意以接受最终用户许可协议。
-
等待下载完成。
-
选择 aws_demos 和 boot_loader 项目,然后选择完成以将其导入。
-
对于这两个项目,打开项目属性。在导航窗格中,选择工具链编辑器。
-
选择当前工具链。
-
选择当前生成器。
-
-
在导航窗格中,选择 Settings(设置)。选择工具链选项卡,然后选择工具链版本。
选择工具设置选项卡,展开转换器,然后选择输出。在主窗口中,确保选中输出十六进制文件,然后选择输出文件类型。
-
在引导加载程序项目中,打开
projects\renesas\rx65n-rsk\e2studio\boot_loader\src\key\code_signer_public_key.h
并输入公钥。有关如何创建公钥的信息,请参阅 如何在 RX65N 上使用 Amazon Web Services 实现 FreeRTOS OTA和 Renesas MCU 固件更新设计政策 中的第 7.3 节“使用 OpenSSL 生成 ECDSA-SHA256 密钥对”。 然后构建项目以创建
boot_loader.mot
。 -
打开
aws_demos
项目。-
打开AWS IoT 控制台
。 -
在左侧导航窗格中,选择 设置。在设备数据端点文本框中记下自定义端点。
-
选择管理,然后选择事物。记下你的棋盘上的 AWS IoT 事物名称。
-
在
aws_demos
项目中,打开demos/include/aws_clientcredential.h
并指定以下值。#define clientcredentialMQTT_BROKER_ENDPOINT[] = "
Your AWS IoT endpoint
"; #define clientcredentialIOT_THING_NAME "The AWS IoT thing name of your board
" -
打开
tools/certificate_configuration/CertificateConfigurator.html
文件。 -
导入之前下载的证书 PEM 文件和私钥 PEM 文件。
-
选择生成并保存 aws_clientcredential_keys.h,并在
demos/include/
目录下替换此文件。 -
打开
vendors/renesas/boards/rx65n-rsk/aws_demos/config_files/ota_demo_config.h
文件,并指定这些值。#define otapalconfigCODE_SIGNING_CERTIFICATE [] = "
your-certificate-key
";其中,
your-certificate-key
是来自文件secp256r1.crt
的值。记得在证书的每一行后面加上“\”。有关创建secp256r1.crt
文件的更多信息,请参阅如何在 RX65N 上使用 Amazon Web Services 实现 FreeRTOS OTA和 Renesas MCU 固件更新设计政策 中的第 7.3 节“使用 OpenSSL 生成 ECDSA-SHA256 密钥对”。
-
-
任务 A:安装固件的初始版本
-
打开
vendors/renesas/boards/board/aws_demos/config_files/aws_demo_config.h
文件,注释掉#define CONFIG_CORE_MQTT_MUTUAL_AUTH_DEMO_ENABLED
,然后定义CONFIG_OTA_MQTT_UPDATE_DEMO_ENABLED
或CONFIG_OTA_HTTP_UPDATE_DEMO_ENABLED
。 -
打开
demos/include/ aws_application_version.h
文件,并将固件的初始版本设置为0.9.2
。 -
在部分查看器中更改以下设置。
-
选择构建以创建
aws_demos.mot
文件。
-
-
使用 Renesas Secure Flash Programmer 创建文件
userprog.mot
。userprog.mot
是aws_demos.mot
和boot_loader.mot
的组合。您可以将此文件刷写到 RX65N-RSK 以安装初始固件。-
下载 https://github.com/renesas/Amazon-FreeRTOS-Tools
并打开 Renesas Secure Flash Programmer.exe
。 -
选择初始固件选项,然后设置以下参数:
-
私钥路径 –
secp256r1.privatekey
的位置。 -
引导加载程序文件路径 –
boot_loader.mot
(projects\renesas\rx65n-rsk\e2studio\boot_loader\HardwareDebug
) 的位置。 -
文件路径 –
aws_demos.mot
(projects\renesas\rx65n-rsk\e2studio\aws_demos\HardwareDebug
) 的位置。
-
-
创建一个名为
init_firmware
的目录,生成userprog.mot
,并将其保存到init_firmware
目录中。验证生成是否成功。
-
-
在 RX65N-RSK 上刷写初始固件。
-
从以下 URL 下载最新版本的 Renesas Flash Programmer(编程 GUI):https://www.renesas.com/tw/en/products/software-tools/tools/programmer/renesas-flash-programmer-programming-gui.html
。 -
打开
vendors\renesas\rx_mcu_boards\boards\rx65n-rsk\aws_demos\flash_project\erase_from_bank\ erase.rpj
文件以擦除库中的数据。 -
选择开始以擦除库。
-
要刷写
userprog.mot
,请选择浏览...,导航到init_firmware
目录,选择userprog.mot
文件,然后选择开始。
-
-
RX65N-RSK 上已安装固件的 0.9.2 版本(初始版本)。RX65N-RSK 主板现在正在侦听 OTA 更新。如果您在 PC 上打开 Tera Term,则当初始固件运行时,您会看到类似以下的内容。
------------------------------------------------- RX65N secure boot program ------------------------------------------------- Checking flash ROM status. bank 0 status = 0xff [LIFECYCLE_STATE_BLANK] bank 1 status = 0xfc [LIFECYCLE_STATE_INSTALLING] bank info = 1. (start bank = 0) start installing user program. copy secure boot (part1) from bank0 to bank1...OK copy secure boot (part2) from bank0 to bank1...OK update LIFECYCLE_STATE from [LIFECYCLE_STATE_INSTALLING] to [LIFECYCLE_STATE_VALID] bank1(temporary area) block0 erase (to update LIFECYCLE_STATE)...OK bank1(temporary area) block0 write (to update LIFECYCLE_STATE)...OK swap bank... ------------------------------------------------- RX65N secure boot program ------------------------------------------------- Checking flash ROM status. bank 0 status = 0xf8 [LIFECYCLE_STATE_VALID] bank 1 status = 0xff [LIFECYCLE_STATE_BLANK] bank info = 0. (start bank = 1) integrity check scheme = sig-sha256-ecdsa bank0(execute area) on code flash integrity check...OK jump to user program 0 1 [ETHER_RECEI] Deferred Interrupt Handler Task started 1 1 [ETHER_RECEI] Network buffers: 3 lowest 3 2 1 [ETHER_RECEI] Heap: current 234192 lowest 234192 3 1 [ETHER_RECEI] Queue space: lowest 8 4 1 [IP-task] InitializeNetwork returns OK 5 1 [IP-task] xNetworkInterfaceInitialise returns 0 6 101 [ETHER_RECEI] Heap: current 234592 lowest 233392 7 2102 [ETHER_RECEI] prvEMACHandlerTask: PHY LS now 1 8 3001 [IP-task] xNetworkInterfaceInitialise returns 1 9 3092 [ETHER_RECEI] Network buffers: 2 lowest 2 10 3092 [ETHER_RECEI] Queue space: lowest 7 11 3092 [ETHER_RECEI] Heap: current 233320 lowest 233320 12 3193 [ETHER_RECEI] Heap: current 233816 lowest 233120 13 3593 [IP-task] vDHCPProcess: offer c0a80a09ip 14 3597 [ETHER_RECEI] Heap: current 233200 lowest 233000 15 3597 [IP-task] vDHCPProcess: offer c0a80a09ip 16 3597 [IP-task] IP Address: 192.168.10.9 17 3597 [IP-task] Subnet Mask: 255.255.255.0 18 3597 [IP-task] Gateway Address: 192.168.10.1 19 3597 [IP-task] DNS Server Address: 192.168.10.1 20 3600 [Tmr Svc] The network is up and running 21 3622 [Tmr Svc] Write certificate... 22 3697 [ETHER_RECEI] Heap: current 232320 lowest 230904 23 4497 [ETHER_RECEI] Heap: current 226344 lowest 225944 24 5317 [iot_thread] [INFO ][DEMO][5317] ---------STARTING DEMO--------- 25 5317 [iot_thread] [INFO ][INIT][5317] SDK successfully initialized. 26 5317 [iot_thread] [INFO ][DEMO][5317] Successfully initialized the demo. Network type for the demo: 4 27 5317 [iot_thread] [INFO ][MQTT][5317] MQTT library successfully initialized. 28 5317 [iot_thread] [INFO ][DEMO][5317] OTA demo version 0.9.2 29 5317 [iot_thread] [INFO ][DEMO][5317] Connecting to broker... 30 5317 [iot_thread] [INFO ][DEMO][5317] MQTT demo client identifier is rx65n-gr-rose (length 13). 31 5325 [ETHER_RECEI] Heap: current 206944 lowest 206504 32 5325 [ETHER_RECEI] Heap: current 206440 lowest 206440 33 5325 [ETHER_RECEI] Heap: current 206240 lowest 206240 38 5334 [ETHER_RECEI] Heap: current 190288 lowest 190288 39 5334 [ETHER_RECEI] Heap: current 190088 lowest 190088 40 5361 [ETHER_RECEI] Heap: current 158512 lowest 158168 41 5363 [ETHER_RECEI] Heap: current 158032 lowest 158032 42 5364 [ETHER_RECEI] Network buffers: 1 lowest 1 43 5364 [ETHER_RECEI] Heap: current 156856 lowest 156856 44 5364 [ETHER_RECEI] Heap: current 156656 lowest 156656 46 5374 [ETHER_RECEI] Heap: current 153016 lowest 152040 47 5492 [ETHER_RECEI] Heap: current 141464 lowest 139016 48 5751 [ETHER_RECEI] Heap: current 140160 lowest 138680 49 5917 [ETHER_RECEI] Heap: current 138280 lowest 138168 59 7361 [iot_thread] [INFO ][MQTT][7361] Establishing new MQTT connection. 62 7428 [iot_thread] [INFO ][MQTT][7428] (MQTT connection 81cfc8, CONNECT operation 81d0e8) Wait complete with result SUCCESS. 63 7428 [iot_thread] [INFO ][MQTT][7428] New MQTT connection 4e8c established. 64 7430 [iot_thread] [OTA_AgentInit_internal] OTA Task is Ready. 65 7430 [OTA Agent T] [prvOTAAgentTask] Called handler. Current State [Ready] Event [Start] New state [RequestingJob] 66 7431 [OTA Agent T] [INFO ][MQTT][7431] (MQTT connection 81cfc8) SUBSCRIBE operation scheduled. 67 7431 [OTA Agent T] [INFO ][MQTT][7431] (MQTT connection 81cfc8, SUBSCRIBE operation 818c48) Waiting for operation completion. 68 7436 [ETHER_RECEI] Heap: current 128248 lowest 127992 69 7480 [OTA Agent T] [INFO ][MQTT][7480] (MQTT connection 81cfc8, SUBSCRIBE operation 818c48) Wait complete with result SUCCESS. 70 7480 [OTA Agent T] [prvSubscribeToJobNotificationTopics] OK: $aws/things/rx65n-gr-rose/jobs/$next/get/accepted 71 7481 [OTA Agent T] [INFO ][MQTT][7481] (MQTT connection 81cfc8) SUBSCRIBE operation scheduled. 72 7481 [OTA Agent T] [INFO ][MQTT][7481] (MQTT connection 81cfc8, SUBSCRIBE operation 818c48) Waiting for operation completion. 73 7530 [OTA Agent T] [INFO ][MQTT][7530] (MQTT connection 81cfc8, SUBSCRIBE operation 818c48) Wait complete with result SUCCESS. 74 7530 [OTA Agent T] [prvSubscribeToJobNotificationTopics] OK: $aws/things/rx65n-gr-rose/jobs/notify-next 75 7530 [OTA Agent T] [prvRequestJob_Mqtt] Request #0 76 7532 [OTA Agent T] [INFO ][MQTT][7532] (MQTT connection 81cfc8) MQTT PUBLISH operation queued. 77 7532 [OTA Agent T] [INFO ][MQTT][7532] (MQTT connection 81cfc8, PUBLISH operation 818b80) Waiting for operation completion. 78 7552 [OTA Agent T] [INFO ][MQTT][7552] (MQTT connection 81cfc8, PUBLISH operation 818b80) Wait complete with result SUCCESS. 79 7552 [OTA Agent T] [prvOTAAgentTask] Called handler. Current State [RequestingJob] Event [RequestJobDocument] New state [WaitingForJob] 80 7552 [OTA Agent T] [prvParseJSONbyModel] Extracted parameter [ clientToken: 0:rx65n-gr-rose ] 81 7552 [OTA Agent T] [prvParseJSONbyModel] parameter not present: execution 82 7552 [OTA Agent T] [prvParseJSONbyModel] parameter not present: jobId 83 7552 [OTA Agent T] [prvParseJSONbyModel] parameter not present: jobDocument 84 7552 [OTA Agent T] [prvParseJSONbyModel] parameter not present: afr_ota 85 7552 [OTA Agent T] [prvParseJSONbyModel] parameter not present: protocols 86 7552 [OTA Agent T] [prvParseJSONbyModel] parameter not present: files 87 7552 [OTA Agent T] [prvParseJSONbyModel] parameter not present: filepath 99 7651 [ETHER_RECEI] Heap: current 129720 lowest 127304 100 8430 [iot_thread] [INFO ][DEMO][8430] State: Ready Received: 1 Queued: 0 Processed: 0 Dropped: 0 101 9430 [iot_thread] [INFO ][DEMO][9430] State: WaitingForJob Received: 1 Queued: 0 Processed: 0 Dropped: 0 102 10430 [iot_thread] [INFO ][DEMO][10430] State: WaitingForJob Received: 1 Queued: 0 Processed: 0 Dropped: 0 103 11430 [iot_thread] [INFO ][DEMO][11430] State: WaitingForJob Received: 1 Queued: 0 Processed: 0 Dropped: 0 104 12430 [iot_thread] [INFO ][DEMO][12430] State: WaitingForJob Received: 1 Queued: 0 Processed: 0 Dropped: 0 105 13430 [iot_thread] [INFO ][DEMO][13430] State: WaitingForJob Received: 1 Queued: 0 Processed: 0 Dropped: 0 106 14430 [iot_thread] [INFO ][DEMO][14430] State: WaitingForJob Received: 1 Queued: 0 Processed: 0 Dropped: 0 107 15430 [iot_thread] [INFO ][DEMO][15430] State: WaitingForJob Received: 1 Queued: 0 Processed: 0 Dropped: 0
-
任务 B:更新固件版本
-
打开
demos/include/aws_application_version.h
文件并将APP_VERSION_BUILD
令牌值增加至0.9.3
。 -
重新构建项目。
-
-
使用 Renesas Secure Flash Programmer 创建
userprog.rsu
文件以更新固件版本。-
打开
Amazon-FreeRTOS-Tools\Renesas Secure Flash Programmer.exe
文件。 -
选择更新固件选项卡并设置以下参数:
-
文件路径 –
aws_demos.mot
文件 (projects\renesas\rx65n-rsk\e2studio\aws_demos\HardwareDebug
) 的位置。
-
-
创建名为
update _firmware
的目录。生成userprog.rsu
并将其保存到update_firmware
目录。验证生成是否成功。
-
-
如创建 Amazon S3 存储桶以存储更新中所述,将固件更新
userproj.rsu
上传到 Amazon S3 存储桶。 -
创建作业以更新 RX65N-RSK 上的固件。
AWS IoT Jobs 是一项向一台或多台连接的设备通知待处理任务的服务。作业可用于管理设备队列、更新设备上的固件和安全证书,或者执行管理任务,例如重新启动设备和执行诊断。
-
登录 AWS IoT 控制台
。在导航窗格中,选择管理,然后选择作业。 -
选择创建作业,然后选择创建 OTA 更新作业。选择一个事物,然后选择下一步。
-
按照以下方式创建 FreeRTOS OTA 更新作业:
-
选择 MQTT。
-
选择在上一节中创建的代码签名配置文件。
-
选择上传到 Amazon S3 存储桶的固件映像。
-
对于设备上固件映像的路径名,请输入
test
。 -
选择在上一部分中创建的 IAM 角色。
-
-
选择下一步。
-
输入一个 ID,然后选择创建。
-
-
重新打开 Tera Term 以验证固件是否已成功更新到 OTA 演示版 0.9.3。
-
在 AWS IoT 控制台上,验证任务状态是否为 “成功”。