【STM32】STM32F103基于CubeIDE移植ThreadX

前言

本来ThreadX全家桶是无缝接入STM32单片机的,但是今天突然发现ST官方没有X-CUBE-AZRTOS-F1这个软件包。使用CubeMX添加工程组件的时候,也没有ThreadX可以选择。因此就有了此文。

Keil环境下的移植可以参考此文:threadx系统_STM32F103C8基于CubeMX+ MDK来移植ThreadX系统

一、创建工程模版

首先在CubeIDE环境下创建一个工程模板,只使用到了一个串口输出和一个LED灯。
工程配置
上述的功能正常配置,唯一需要注意的地方是Timebase Source不能再选择Systick了,而需要选择其他的定时器,比如通用定时器6。因Systick将用来给ThreadX提供Timebase。
时钟配置
配置完成后,现在裸机下测试一下添加的功能是否正常,以保证工程模板是正确的。

二、获得ThreadX源码

ThreadX的源码仓库地址:https://github.com/azure-rtos/threadx

文件结构如下:
ThreadX文件结构
我们需要使用就只有commom和ports两个文件夹。

三、移植工作

3.1 添加文件

在工程模版工作空间内新建ThreadX文件夹,此文件夹下新建两个空文件夹commom和port。
新建文件夹

其中commom文件夹内需要把上述ThreadX软件包中的commom文件夹内的内容整个复制过来。
commom文件夹

port文件夹需要复制的内容如下:
1:“…\ThreadX\threadx\ports\cortex_m3\gnu"路径下inc和src文件夹。
2:”…\ThreadX\threadx\ports\cortex_m3\gnu\example_build"路径下的tx_initialize_low_level.S文件,复制到第一步的src文件夹下。
lowlevel文件

在CubeIDE中添加源文件和头文件路径。
添加源文件
ASM文件头文件包含路径
C文件头文件路径
最终的文件夹效果如下:
最终文件夹

3.2 文件修改

3.2.1 链接文件修改

在链接文件中添加如下语句:

__RAM_segment_used_end__ = .;

修改链接文件

3.2.2 中断文件修改

在stm32f1xx_it.c文件中屏蔽Systick中断和PendSV中断。
屏蔽中断

3.2.3 tx_initialize_low_level.S修改

将tx_initialize_low_level.S中的中断向量表更改为自己芯片的向量表。
第一处vector
第二处vector
这个g_pfnVectors来自于startup_stm32f103zetx.s文件。
vector来源
此外还需要修改时钟,我使用的是外部8M晶振倍频得到的72MHz时钟。需要修改如下地方。把系统的心跳周期更改为1ms。
时钟修改

至此,文件就修改完成了。
我做的不是很详细,需要更加详细的版本,可以参考:threadx 移植(二)-基于 CubeIDE 移植 threadx

四、添加测试代码

4.1 添加头文件

在main.c文件中添加"tx_api.h"头文件。
添加头文件

4.2 添加任务

在main.c文件中添加如下代码。

/* 信号量 */
TX_SEMAPHORE UART_semaphore;

/* 任务1 */
TX_THREAD LED_thread;
#define LED_STACK_SIZE 512
static uint8_t LED_thread_stack[LED_STACK_SIZE];

void LED_thread_entry(ULONG thread_input)
{
    /* This thread simply sits in while-forever-sleep loop.  */
    while (1)
    {
        LED_Set(0);
        tx_thread_sleep(500);
        LED_Set(1);
        tx_thread_sleep(500);

        tx_semaphore_put(&UART_semaphore);
    }
}

/* 任务2 */
TX_THREAD UART_thread;
#define UART_STACK_SIZE 512
static uint8_t UART_thread_stack[UART_STACK_SIZE];

void UART_thread_entry(ULONG thread_input)
{
    /* This thread simply sits in while-forever-sleep loop.  */
    while (1)
    {
        if (TX_SUCCESS == tx_semaphore_get(&UART_semaphore, TX_WAIT_FOREVER))
            printf("Entering RTOS\r\n");
    }
}

void tx_application_define(void *first_unused_memory)
{
    tx_semaphore_create(&UART_semaphore, "UART Semaphore", 0);

    /* Create the main thread.  */
    tx_thread_create(&LED_thread,      // 线程句柄
                     "LED thread",     // 线程名称
                     LED_thread_entry, // 线程入口函数
                     0,                // 线程入口函数参数
                     LED_thread_stack, // 线程堆栈
                     LED_STACK_SIZE,   // 线程堆栈大小
                     1,                // 线程优先级,值越小优先级越高
                     1,                // 禁止抢占的线程的最高优先级,只有高于此级别的优先级才可以抢占该线程
                     TX_NO_TIME_SLICE, // 相同优先级线程才有用,相同优先级下任务时间片轮运行
                     TX_AUTO_START);   // 线程立即启动还是挂起

    /* Create the main thread.  */
    tx_thread_create(&UART_thread,      // 线程句柄
                     "UART thread",     // 线程名称
                     UART_thread_entry, // 线程入口函数
                     0,                 // 线程入口函数参数
                     UART_thread_stack, // 线程堆栈
                     UART_STACK_SIZE,   // 线程堆栈大小
                     0,                 // 线程优先级,值越小优先级越高
                     0,                 // 禁止抢占的线程的最高优先级,只有高于此级别的优先级才可以抢占该线程
                     TX_NO_TIME_SLICE,  // 相同优先级线程才有用,相同优先级下任务时间片轮运行
                     TX_AUTO_START);    // 线程立即启动还是挂起
}

4.3 启动任务

调用tx_kernel_enter();

int main(void)
{
    HAL_Init();

    /* Configure the system clock */
    SystemClock_Config();
    /* Initialize all configured peripherals */
    MX_GPIO_Init();
    MX_USART1_UART_Init();
    /* Infinite loop */
    /* USER CODE BEGIN WHILE */
    tx_kernel_enter();
    while (1)
    {
    }
}

五、最终效果

5.1 编译

编译结果

5.2 运行效果

运行效果

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: STM32F103C8T6是一款基于ARM Cortex-M3内核的32位微控制器,而CubeIDE是针对STM32系列微控制器的集成开发环境。STM32F103CubeIDE例程是在这个开发环境下提供的一些示例代码,用于帮助开发人员快速上手并理解STM32F103系列微控制器的功能与特性。 这些例程涵盖了从基本的GPIO(通用输入输出)控制和串口通信,到高级的定时器和中断处理等各个方面的应用。它们可以作为开发人员学习和开发的起点,帮助了解和掌握STM32F103系列微控制器的编程方法和架构设计。 通过使用STM32F103CubeIDE例程,开发人员可以快速搭建起一个基础的硬件平台,并在此基础上进行二次开发。例如,通过了解GPIO例程,我们可以学习如何配置和控制芯片的输入输出引脚,实现LED的亮灭控制、按钮的输入检测等功能。而通过学习定时器和中断处理的例程,可以了解如何使用定时器产生精确的定时中断,实现各种定时功能,比如PWM呼吸灯、定时采集传感器数据等。 此外,STM32F103CubeIDE例程还提供了一些外设的驱动程序,如UART(通用异步收发器)和SPI(串行外设接口)等,这些驱动程序可以直接被集成到我们的应用中,简化了编程的过程,提高了开发效率。 总之,STM32F103CubeIDE例程是一个非常有用的资源,它可以帮助开发人员快速上手STM32F103系列微控制器的开发,并且可以在实际项目中提供一些基础的代码框架,为我们的开发和学习提供了很大的便利。 ### 回答2: STM32F103CubeIDE是适用于STMicroelectronics的STM32F1系列微控制器的集成开发环境。它提供了一套用于开发STM32F1系列芯片的例程。 首先,例程包含了一系列代码模板和功能实现的示例代码。这些示例代码覆盖了GPIO、串口通信、定时器、中断处理等基本功能的实现。开发者可以参考这些例程,快速了解每个功能模块的使用方法。 其次,例程还提供了外设的初始化函数。在初次开发时,我们需要配置各个外设的寄存器来使其正常工作。例程中提供了相应的初始化函数,可以帮助我们快速初始化外设。 同时,例程还包含了一些应用示例,例如温度传感器、LED灯控制等。这些示例演示了如何使用STM32F1系列微控制器实现各种应用场景,为开发者提供了基础的参考和学习资料。 最后,例程还提供了一套调试工具。使用STM32F103CubeIDE可以方便地进行代码的调试和跟踪。开发者可以在开发过程中使用调试工具对代码进行单步调试,以便于查找和修复错误。 综上所述,STM32F103CubeIDE例程是一个非常实用的开发工具,它提供了一套完整的例程和示例代码,帮助开发者快速上手STM32F1系列微控制器的开发,并且提供调试工具方便开发者进行调试和测试。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值