0%

OTA远程更新

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全局中断。这将在之后允许我们使用中断方式接收串口数据(虽然在之前的简化版本中未使用中断,但这是一个良好的习惯,后续会用到)。
    • 保存 .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、代码编辑

  • 串口接收数据