STM32F0移植RT_Thread_Nano, 使用STM32Cube

news/2025/1/13 11:39:07/

目录

  • 硬件介绍
  • 安装rtthread_namo包
  • 创建工程
  • 配置工程
  • 修改代码,测试
    • 修改stm32f0xx_it.c文件
    • 修改时钟部分
    • 增加用户代码
    • 编译测试

硬件介绍

  我手上开发板使用STM32F030F4P单片机,无外部晶振,所以直接使用内部晶振。开发板上有3个LED灯。

LED灯引脚
红灯PA1
绿灯PA3
蓝灯PA4

安装rtthread_namo包

在操作前,需要安装MDK5软件,以及STM32CubeMX,并安装好STM32F0的Pack

  1. 打开MDK软件的Pack Install工具,选择RealThread:RT_Thread进行安装
    Pack Install
    Install RT-Thread
  2. 在弹出的节目中选择Next,等待安装
    agree License
  3. 安装成功后,Reload Packs即可。
    Reload Packs

创建工程

  1. 选择芯片STM32F030F4P6
    Select Device

  2. Manage Run-Time Environment
    Manage Run-Time Environment
       按照图中进行勾选,由于我们芯片资源有限,而且这次的电路并没有接触串口,所以在RTOS部分,我们没有勾选shell。

  3. Start STM32CubeMX
    Start STM32CubeMX
       勾选完Run-Time Environment后,会自动弹出启动STM32CubeMX的窗口,我们打开STM32CubeMX进行配置。

  4. STM32CubeMX配置Pinout&Configuration
    RCC
    SYS
    GPIO

  5. 配置时钟
    Clock Configuration

  6. 单击生成代码
    GENERATE CODE

  7. 生成代码如下
    生成的代码

配置工程

  1. 选中RTOS下的rtconfig.h文件,使用Configuration Wizard进行配置
    在这里插入图片描述

  2. 内存管理设置
    在这里插入图片描述
       由于芯片内存很少,我们取消Dynamic Heap Management。勾选上using small memory。

  3. 关闭console和Finsh
    在这里插入图片描述
       由于我们并没有接出串口,所以关闭串口相关的内容。

修改代码,测试

修改stm32f0xx_it.c文件

   由于rtthread重写了部分中断服务函数,所以我们需要将stm32f0xx_it.c中部分函数设置为weak。

/*** @brief This function handles Hard fault interrupt.*/
__weak void HardFault_Handler(void)
{/* USER CODE BEGIN HardFault_IRQn 0 *//* USER CODE END HardFault_IRQn 0 */while (1){/* USER CODE BEGIN W1_HardFault_IRQn 0 *//* USER CODE END W1_HardFault_IRQn 0 */}
}__weak void PendSV_Handler(void)
{/* USER CODE BEGIN PendSV_IRQn 0 *//* USER CODE END PendSV_IRQn 0 *//* USER CODE BEGIN PendSV_IRQn 1 *//* USER CODE END PendSV_IRQn 1 */
}__weak void SysTick_Handler(void)
{/* USER CODE BEGIN SysTick_IRQn 0 *//* USER CODE END SysTick_IRQn 0 */HAL_IncTick();/* USER CODE BEGIN SysTick_IRQn 1 *//* USER CODE END SysTick_IRQn 1 */
}

修改时钟部分

   在mian函数中,有HAL_Init()SystemClock_Config()函数,用来在系统开始的时候初始化HAL和System时钟。但是当我们使用rtthread后,第一个执行的函数不是main()。而是rtthread系统的初始化函数,并在board.c的rt_hw_board_init()中进行硬件初始化。
   我们将HAL_Init()SystemClock_Config()放到rt_hw_board_init()最前面,保证在用户代码运行时,时钟时我们希望的样子。

void rt_hw_board_init()
{	/* System Clock Update *///SystemCoreClockUpdate();HAL_Init();SystemClock_Config();/* System Tick Configuration */_SysTick_Config(SystemCoreClock / RT_TICK_PER_SECOND);/* Call components board initial (use INIT_BOARD_EXPORT()) */
#ifdef RT_USING_COMPONENTS_INITrt_components_board_init();
#endif#if defined(RT_USING_CONSOLE) && defined(RT_USING_DEVICE)rt_console_set_device(RT_CONSOLE_DEVICE_NAME);
#endif#if defined(RT_USING_USER_MAIN) && defined(RT_USING_HEAP)rt_system_heap_init(rt_heap_begin_get(), rt_heap_end_get());
#endif
}

   由于我们屏蔽了stm32f0xx_it.c中的SysTick_Handler(void)函数,SysTick_Handler(void)中的HAL_IncTick()也一同被屏蔽,我们将其移动到board.c的SysTick_Handler(void)中。

void SysTick_Handler(void)
{/* enter interrupt */rt_interrupt_enter();rt_tick_increase();HAL_IncTick();/* leave interrupt */rt_interrupt_leave();
}

增加用户代码

	while (1){/* USER CODE END WHILE */HAL_GPIO_WritePin(GPIOA, LED_R_Pin|LED_G_Pin|LED_B_Pin, GPIO_PIN_RESET);rt_thread_delay(500);  HAL_GPIO_WritePin(GPIOA, LED_R_Pin|LED_G_Pin|LED_B_Pin, GPIO_PIN_SET);  rt_thread_delay(500);  /* USER CODE BEGIN 3 */}

编译测试

. 使用ARM Compiler version5 进行编译,结果如下:
在这里插入图片描述
2. 使用ARM Compiler version6编译,结果如下:
在这里插入图片描述


  相对于我第一次写关于ARMCLANG的博客,已经过去很久了,目前很多中间件,以及STM32的HAL库都已经能很好的支持ARMCLAGN,推荐大家使用ARMCLANG编译器进行编译。


http://www.ppmy.cn/news/571319.html

相关文章

Mono简介

Mono项目由著名Linux桌面GNOME创始人Miguel de Icaza发起,创建于2001年,先由其公司Ximian主持,后随Ximian并购于Novell. Mono是一个开源软件平台,是符合ECMA标准的.NET Framework开源现实。它包括一个C#编译器,一个公用…

【软件教程】在Ubentu上使用Crontab设置定时任务

在Linux上使用Crontab设置定时任务 设置任务有两个方法 使用crontab –e (非root用户可以使用) 文章用的这个修改/etc/crontab文件(只有root用户可以用) 工具: finalshell 安装crontab(ubentu): apt-get…

杨旸:从边缘智能迈向泛在智能

内容来源:2022年11月12日,在全球边缘计算大会上海站上,我们非常荣幸邀请到了特斯联集团首席科学家杨旸博士来分享,杨旸博士曾任上海科技大学教授、科道书院院长、上海雾计算实验室主任;科技部“第五代移动通信系统&…

CTF 杂项 隐写术 密码学及编码 取证技术

隐写术 隐写术( steganography ) : 将信息隐藏在其他载体中, 不让 计划的接收者之外的人获取到信息。 常见载体:图片、音频、视频、压缩包 图像隐写 图片:细微的颜色差别、GIF图多帧隐藏、Exif信息隐藏、图片修复 LSB(Least Significant Bit)最低有效位 像素三原色(RGB)通过…

B.Namomo子串(模拟DP)

B.Namomo子串(模拟&DP) 思路:简单模拟& d p dp dp。 显然我们只需每次找到 n a m o m o namomo namomo类型的串,然后枚举循环次数。 假设从长度为9开始(前两个 m o mo mo不计算) m o mo mo的个数 x x x个,显然 n a na na开头的贡献…

NAPI

NAPI 是 Linux 上采用的一种提高网络处理效率的技术,它的核心概念就是不采用中断的方式读取数据,而代之以首先采用中断唤醒数据接收的服务程序,然后 POLL 的方法来轮询数据。随着网络的接收速度的增加,NIC 触发的中断能做到不断减…

【SSM直击大厂】最终章:SSM 整合

🙊🙊作者主页:🔗求不脱发的博客 📔📔 精选专栏:🔗SSM直击大厂 📋📋 精彩摘要:学完了整个SpringSpringMVCMybatis基础知识,最后将三者整…

java web--Tomcat简介

javaweb--Tomcat简介 1.Tomcat概述2.Tomcat作为Servlet容器的基本功能3.Tomcat的组成结构4.Tomcat的工作模式 本文主要内容为Tomcat简介 1.Tomcat概述 Tomcat是一个优秀的servlet容器。Tomcat除了能够充当运行servlet的容器,还提供了作为Web服务器的一些实用功能&a…