OTA远程更新
OTA全称 Over-The-Air Technology,中文译为“空中下载技术”。简单的来说,它是一种通过无线网络对设备进行远程更新和管理的技术。就像我们手机更新App或者更新系统一样。
1、基本原理
stm32的OTA升级,简单的来说就是通过某种痛惜方式(例如串口,WIFI,4G等)将新的固件程序下载到STM32的Flash存储器中,然后通过引导程序(Bootloader)将新的固件程序启动起来,从而实现程序的更新。
要是实现OTA,至少需要两个程序:
- Bootloader程序:负责接收新的固件程序,将其写入到Flash,并在必要时启动新的固件程序。Bootloader程序通常是固定的,不会被OTA更新。
- 应用程序(APP):这是用户实际运行的程序,会被OTA更新。
2、工程准备
使用stm32F103C8T6开发板。
使用软件STM32CubelIDE软件。
创建工程
- 在STM32CubeIDE中,选择“File” -> “New” -> “STM32 Project”。
- 在“Target Selection”窗口中,搜索并选择“STM32F103C8Tx”,然后点击“Next”
- 在“Project Name”中输入“Bootloader”,然后点击“Next”。
- 在“Initialise all peripherals with their default Mode?”界面务必选择“No”。这将允许我们手动配置所需的外设,避免不必要的代码和潜在的冲突。然后点击“Finish”。
配置时钟
- 双击项目根目录下的
.ioc
文件(例如Bootloader.ioc
),打开STM32CubeMX配置界面。 - 在左侧的“System Core”中选择“RCC”。
- 在“HSE”下拉菜单中选择“Crystal/Ceramic Resonator”(假设你使用外部晶振)。
- 菜单中选择项的解释:
- Disable :禁用
- Bypass Clock Source(旁路时钟源) :选择此项表示使用外部时钟源直接输入到 MCU,绕过内部的振荡器电路。这意味着外部提供一个稳定的时钟信号到 OSC_IN 引脚,而 OSC_OUT 引脚则悬空。使用此选项时,外部时钟源必须已经产生稳定的时钟信号。
- Crystal/Ceramic Resonator(晶体/陶瓷谐振器):选择此项表示使用外部晶体或陶瓷谐振器作为时钟源。这是最常见的配置方式。在这种模式下,晶振连接到 OSC_IN 和 OSC_OUT 引脚,并且通常需要配合合适的负载电容使用,以确保晶振正常起振
- 在“PLLCLK”选项卡中配置PLL倍频器,将系统时钟配置为72MHz。通常的配置是:
- PLL Source Mux: HSE
- PLL Multiplier: x9
- 确认“SYSCLK”显示为72MHz。
- 保存
.ioc
文件(Ctrl+S 或 File -> Save),STM32CubeIDE会自动生成或更新代码。
- 双击项目根目录下的
配置串口
- 在左侧的“Connectivity”中选择“USART1”。
- 在中间的配置界面中:
- “Mode”选择“Asynchronous”。(异步,还有其他几个选择,)
- Mode选择项:
- Asynchronous(异步模式):这是 USART 最常用的模式。在这种模式下,数据传输不需要单独的时钟线进行同步,而是通过起始位、数据位、校验位和停止位来定义数据帧的结构。发送方和接收方需要预先约定好波特率(即每秒传输的比特数),以确保数据能够正确传输。
- Synchronous(同步模式):在这种模式下,数据传输需要一根额外的时钟线(通常称为 SCLK 或 CK)进行同步。发送方提供时钟信号,接收方根据时钟信号进行数据的采样和接收。
- Single Wire (Half-Duplex)(单线(半双工)模式):在这种模式下,USART 使用同一根线进行发送和接收,但不能同时进行。
- Multiprocessor Communication(多处理器通信模式):这种模式允许多个处理器通过同一条 USART 总线进行通信。在这种模式下,每个处理器都有一个唯一的地址。
- IrDA(红外数据协会):这种模式支持红外线通信协议。
- LIN(本地互联网络):LIN 是一种低成本的串行通信协议,常用于汽车电子等领域。
- SmartCard(智能卡模式):这种模式支持智能卡(例如 SIM 卡、银行卡)的通信协议。
- “Baud Rate”设置为115200(或其他你需要的波特率)。
- “Word Length”选择“8 Bits”。
- “Parity”选择“None”。(奇偶校验)
- “Stop Bits”选择“1 Stop Bit”。
- 使能“NVIC Settings”中的USART1全局中断。这将在之后允许我们使用中断方式接收串口数据(虽然在之前的简化版本中未使用中断,但这是一个良好的习惯,后续会用到)。
- “Mode”选择“Asynchronous”。(异步,还有其他几个选择,)
- 保存
.ioc
文件。
配置Flash分区
在项目资源管理器中,展开“Bootloader”项目,打开
STM32F103C8Tx_FLASH.ld
文件。找到以下代码段:
1
FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 64K
将其修改为:
1
FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 16K
这会将Flash的前16KB分配给Bootloader。应用程序将从
0x08004000
开始。
3、代码编辑
- 串口接收数据