stm32f103 rtthread-5.1.0自定义BSP创建记录

本文详细介绍了如何在STM32F103VCT6单片机上进行rt-threadRTOS的环境配置,包括安装env、下载rt-thread、BSP移植步骤(删除模板文件、创建自定义BSP、修改CubeMX配置、链接脚本和board.c文件,以及Kconfig和SConscript文件的调整),最终生成针对该芯片的Keil工程。
摘要由CSDN通过智能技术生成

需求:

MCUSTM32F103VCT6
ROM256KB
RAM48KB
封装LQFP-100
接口UART1、UART4、SPI3

一、安装env

1、下载安装后解压运行
env下载
2、将env注册
在这里插入图片描述

二、下载rt-thread

git clone https://gitee.com/rtthread/rt-thread.git

在这里插入图片描述

三、BSP移植

1、删除bsp文件内除了stm32以外的文件夹
在这里插入图片描述

2、创建自己的bsp文件夹

1、打开路径:bsp\stm32\libraries\templates

在这里插入图片描述

2、复制到:bsp\stm32,并改名

在这里插入图片描述
在这里插入图片描述

3、修改cubemx工程文件

打开文件夹

stm32f103-custom-vct6\board\CubeMX_Config下的CubeMX_Config.ioc
在这里插入图片描述

更改mcu型号

在这里插入图片描述
在这里插入图片描述

打开外部时钟
在这里插入图片描述

打开串口1、串口4

在这里插入图片描述

我这里用的swd下载模式,所以SYS-Debug这里改为了Serial Wire
在这里插入图片描述

时钟用了外部晶振,需要做相应修改
在这里插入图片描述

工程输出按照图示修改
在这里插入图片描述

接着点击GENERATE CODE 创建即可

4、修改脚本文件 link.sct

在这里插入图片描述

选用的单片机型号为:stm32f103vct6
在这里插入图片描述

文件内容:

; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************

LR_IROM1 0x08000000 0x00040000  {    ; load region size_region
  ER_IROM1 0x08000000 0x00040000  {  ; load address = execution address
   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
  }
  RW_IRAM1 0x20000000 0x0000c000  {  ; RW data
   .ANY (+RW +ZI)
  }
}

5、修改文件:board.c

打开board.c文件,以及CubeMX_Config\CubeMX_Config\Core\Src\main.c
将main.c文件里的SystemClock_Config函数复制替换到board.c文件
在这里插入图片描述

文件内容:

/*
 * Copyright (c) 2006-2018, RT-Thread Development Team
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 * Change Logs:
 * Date           Author       Notes
 * 2018-11-06     SummerGift   first version
 */
 
#include "board.h"

void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
  RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};

  /** Initializes the RCC Oscillators according to the specified parameters
  * in the RCC_OscInitTypeDef structure.
  */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE|RCC_OSCILLATORTYPE_LSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
  RCC_OscInitStruct.LSEState = RCC_LSE_ON;
  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();
  }
  PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_RTC;
  PeriphClkInit.RTCClockSelection = RCC_RTCCLKSOURCE_LSE;
  if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
  {
    Error_Handler();
  }
}

6、修改board.h文件

将FLASH_SIZE修改为 256
将SRAM_SIZE修改为 48
在这里插入图片描述
文件内容

/*
 * Copyright (c) 2006-2018, RT-Thread Development Team
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 * Change Logs:
 * Date           Author       Notes
 * 2018-11-5      SummerGift   first version
 */

#ifndef __BOARD_H__
#define __BOARD_H__

#include <rtthread.h>
#include <stm32f1xx.h>
#include "drv_common.h"
#include "drv_gpio.h"

#ifdef __cplusplus
extern "C" {
#endif

#define STM32_FLASH_START_ADRESS     ((uint32_t)0x08000000)
#define STM32_FLASH_SIZE             (256 * 1024)
#define STM32_FLASH_END_ADDRESS      ((uint32_t)(STM32_FLASH_START_ADRESS + STM32_FLASH_SIZE))

/* Internal SRAM memory size[Kbytes] <8-64>, Default: 64*/
#define STM32_SRAM_SIZE      48
#define STM32_SRAM_END       (0x20000000 + STM32_SRAM_SIZE * 1024)

#if defined(__ARMCC_VERSION)
extern int Image$$RW_IRAM1$$ZI$$Limit;
#define HEAP_BEGIN      ((void *)&Image$$RW_IRAM1$$ZI$$Limit)
#elif __ICCARM__
#pragma section="CSTACK"
#define HEAP_BEGIN      (__segment_end("CSTACK"))
#else
extern int __bss_end;
#define HEAP_BEGIN      ((void *)&__bss_end)
#endif

#define HEAP_END        STM32_SRAM_END

void SystemClock_Config(void);

#ifdef __cplusplus
}
#endif

#endif /* __BOARD_H__ */

7、修改Kconfig文件

在这里插入图片描述

文件内容:

menu "Hardware Drivers Config"

config SOC_STM32F103VC
    bool
    select SOC_SERIES_STM32F1
    select RT_USING_COMPONENTS_INIT
    select RT_USING_USER_MAIN
    default y

menu "Onboard Peripheral Drivers"

endmenu

menu "On-chip Peripheral Drivers"

    config BSP_USING_GPIO
        bool "Enable GPIO"
        select RT_USING_PIN
        default y

    menuconfig BSP_USING_UART
        bool "Enable UART"
        default y
        select RT_USING_SERIAL
        if BSP_USING_UART
            config BSP_USING_UART1
                bool "Enable UART1"
                default y

            config BSP_UART1_RX_USING_DMA
                bool "Enable UART1 RX DMA"
                depends on BSP_USING_UART1 && RT_SERIAL_USING_DMA
                default n
                
            config BSP_USING_UART4
                bool "Enable UART4"
                default n
                select RT_USING_SERIAL
        endif
        
    menuconfig BSP_USING_SPI
        bool "Enable SPI"
        default n
        select RT_USING_SPI
        if BSP_USING_SPI

            config BSP_USING_SPI3
                bool "Enable SPI3"
                default n
        endif

    source "../libraries/HAL_Drivers/Kconfig"

endmenu

menu "Board extended module Drivers"

endmenu

endmenu

8、修改文件:SConscript

CubeMX版本差异,具体的stm32f1xx_hal_msp.c 和头文件路径可能有些差异
在这里插入图片描述

文件内容

import os
import rtconfig
from building import *

Import('SDK_LIB')

cwd = GetCurrentDir()

# add general drivers
src = Split('''
board.c
CubeMX_Config/CubeMX_Config/Core/Src/stm32f1xx_hal_msp.c
''')

path =  [cwd]
path += [cwd + '/CubeMX_Config/CubeMX_Config/Core/Inc']

startup_path_prefix = SDK_LIB

if rtconfig.PLATFORM in ['gcc']:
    src += [startup_path_prefix + '/STM32F1xx_HAL/CMSIS/Device/ST/STM32F1xx/Source/Templates/gcc/startup_stm32f103xe.s']
elif rtconfig.PLATFORM in ['armcc', 'armclang']:
    src += [startup_path_prefix + '/STM32F1xx_HAL/CMSIS/Device/ST/STM32F1xx/Source/Templates/arm/startup_stm32f103xe.s']
elif rtconfig.PLATFORM in ['iccarm']:
    src += [startup_path_prefix + '/STM32F1xx_HAL/CMSIS/Device/ST/STM32F1xx/Source/Templates/iar/startup_stm32f103xe.s']

# STM32F100xB || STM32F100xE || STM32F101x6
# STM32F101xB || STM32F101xE || STM32F101xG
# STM32F102x6 || STM32F102xB || STM32F103x6
# STM32F103xB || STM32F103xE || STM32F103xG
# STM32F105xC || STM32F107xC)
# You can select chips from the list above
CPPDEFINES = ['STM32F103xE']
group = DefineGroup('Drivers', src, depend = [''], CPPPATH = path, CPPDEFINES = CPPDEFINES)
Return('group')

9、修改keil5模板文件template.uvprojx

打开工程:template.uvprojx
在这里插入图片描述

修改单片机型号
在这里插入图片描述

添加flash
在这里插入图片描述

10、生成keil工程

1、空白处点击鼠标右键,选择ConEmu Here
在这里插入图片描述

2、输入menuconfig 回车
在这里插入图片描述

在配置里打开串口4 以及spi3
在这里插入图片描述

在这里插入图片描述

保存后退出

11、生成自己的keil工程

执行指令:scons --target=mdk5

在这里插入图片描述

完成!!这时生成的工程就是我们自己移植的工程了

在这里插入图片描述

  • 18
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值