RT Thread Studio 配置OTA实现远程程序下载(亲测成功,巨详细)

本文详细介绍了如何使用RTThreadStudio为STM32F103C8T6配置外部时钟、SPI、RTC以及OTA更新。首先,配置HSE时钟,然后设置SPI接口连接W25Q64flash,并初始化RTC。接着,创建并配置flash.c文件,实现SPI设备挂载和SFUD闪存探测。之后,添加Fal软件包,配置Flash设备和分区表。最后,通过STM32ST-LINKUtility和ymodem进行OTA更新。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

RT Thread Studio 配置OTA(亲测成功,巨详细)

用rt thread新建工程,我用的stm32f103vet6,stlink

在这里插入图片描述
首先配置外部时钟hse,可以直接复制以下代码到drv_clk.c中的void system_clock_config(int target_freq_Mhz),也可以自己在cubemx生成。
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

/** Initializes the RCC Oscillators according to the specified parameters

  • in the RCC_OscInitTypeDef structure.
    /
    RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
    RCC_OscInitStruct.HSEState = RCC_HSE_ON;
    RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
    RCC_OscInitStruct.HSIState = RCC_HSI_ON;
    RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
    RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
    RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
    if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
    {
    Error_Handler();
    }
    /
    * Initializes the CPU, AHB and APB buses clocks
    */
    RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
    |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
    RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
    RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
    RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
    RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
{
Error_Handler();
}

配置spi,这个按board.h中的步骤来就行

在这里插入图片描述
这里我用的野火的f103指南者,w25q64是a5,a6,a7,不同的板子要在cubemx自己修改

void HAL_SPI_MspInit(SPI_HandleTypeDef* hspi)
{

  GPIO_InitTypeDef GPIO_InitStruct;
  if(hspi->Instance==SPI1)
  {
  /* USER CODE BEGIN SPI1_MspInit 0 */

  /* USER CODE END SPI1_MspInit 0 */
    /* Peripheral clock enable */
    __HAL_RCC_SPI1_CLK_ENABLE();

    /**SPI3 GPIO Configuration
    PA5     ------> SPI1_SCK
    PA6     ------> SPI1_MISO
    PA7     ------> SPI1_MOSI
    */
    GPIO_InitStruct.Pin = GPIO_PIN_5|GPIO_PIN_7;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    GPIO_InitStruct.Pin = GPIO_PIN_6;
    GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  /* USER CODE BEGIN SPI1_MspInit 1 */

  /* USER CODE END SPI1_MspInit 1 */
  }

}

然后配置rtc,按这个步骤来就行

在这里插入图片描述

标题在applications下创建flash.c,这里叫什么无所谓,把以下代码复制进去

#include "spi_flash_sfud.h"
#include <rtthread.h>
#include <board.h>
#include <rtdevice.h>


rt_uint8_t wData[4096] = {"SPI bus write data to W25X flash."};
rt_uint8_t rData[4096];
extern rt_err_t rt_hw_spi_device_attach(const char *bus_name,
                                        const char *device_name,
                                        GPIO_TypeDef* cs_gpiox,
                                        uint16_t cs_gpio_pin);
int spi1_device_init(void)
{
    __HAL_RCC_GPIOB_CLK_ENABLE();
    //设备挂载到SPI总线,抽象为 spi10 设备
    rt_hw_spi_device_attach("spi1", "spi10", GPIOC, GPIO_PIN_0);

        if (rt_sfud_flash_probe("W25Q64", "spi10")) {
        rt_kprintf("rt sfud flash probe success\n");
    } else {
        rt_kprintf("rt sfud flash probe fail\n");
    };

    return RT_EOK;
}
INIT_DEVICE_EXPORT(spi1_device_init);//自动初始化

rt_hw_spi_device_attach(“spi1”, “spi10”, GPIOC, GPIO_PIN_0);这行就是spi中的cs,如果用的引脚不同记得修改,和硬件上对应。编译,下载。
在这里插入图片描述

添加fal软件包,这个

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值