欢迎光临
我们一直在努力

【RT-Thread初学者详细教程(一)】—在stm32标准库裸机程序上移植RT-Thread

(一)RT-Thread源码的下载

 RT-Thread官网下载

rt-thread.org/download.htmlhttps://www.rt-thread.org/download.html

(二) RT-Thread系统移植

1.创建stm32裸机项目工程

1.1任意写一个stm32标准库程序,我这里使用的是最基础的stmf103c8t6的驱动LED闪烁程序

2.解压移植RT-Thread文件

1.2把解压后的rt-thread源码文件夹-rt-thread整体复制到工程文件中

3.裁剪rt-thread文件

3.1首先删除下图中框选到的无用文件,

只留下     —bsp

                —components

                —include

                —libcpu

                —src

这五个文件夹

3.2打开bsp,只留下board.c,rtconfig.h这两个文件放到bsp根目录,别的文件都删除

4.添加工程组文件

打开工程,右键项目工程,Add group添加组,rtt\\src与rtt\\port

5.添加头文件和微调文件内容

5.1 添加.\\rt-thread\\bsp,.\\rt-thread\\include,.\\User这三个头文件路径

5.2 打开rtthread.h,添加一句头文件

#include <stdarg. h>

5.3 打开board.c,最上面添加#include "stm32f10x.h" 头文件,找到void rt_hw_board_init(void),注释第一行error,在下面添加一句

SysTick_Config (SystemCoreClock/ RT_TICK_PER_SECOND);

在void rt_hw_board_init(void)上面添加一个函数

void SysTick_Handler(void) {      rt_interrupt_enter();          rt_tick_increase();

    rt_interrupt_leave(); }

5.4 打开stm32f10x_it.c文件,注释掉void HardFault_Handler(void)和void PendSV_Handler(void)和

最后编译无错误

(三) RT-Thread系统运行验证

1.对我们移植后的LED闪烁项目工程.main函数进行简单修改,使其调用移植的RT-Thread线程调度函数运行程序

#include "stm32f10x.h" #include "LED.h" #include <rtthread.h>

void thread1_entry(void *parameter); void thread2_entry(void *parameter);

static rt_thread_t thread1; static rt_thread_t thread2;

int main(void) {        LED_Init();

    thread1 = rt_thread_create("thread1", thread1_entry, RT_NULL, 1024, 5, 20);       thread2 = rt_thread_create("thread2", thread2_entry, RT_NULL, 1024, 5, 20); 

    rt_thread_startup(thread1);     rt_thread_startup(thread2);      }

void thread1_entry(void *parameter) {     while (1)     {            LED1_ON();         rt_thread_delay(500);         LED1_OFF();         rt_thread_delay(500);     } }

void thread2_entry(void *parameter) {     while (1)     {            LED2_ON();         rt_thread_delay(500);         LED2_OFF();         rt_thread_delay(500);     } }  

LED.c

#include "stm32f10x.h"                  // Device header

void LED_Init(void) {     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);          GPIO_InitTypeDef GPIO_InitStructure;     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2;     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;     GPIO_Init(GPIOA, &GPIO_InitStructure);          GPIO_SetBits(GPIOA, GPIO_Pin_1 | GPIO_Pin_2); }

void LED1_ON(void) {     GPIO_ResetBits(GPIOA, GPIO_Pin_1); }

void LED1_OFF(void) {     GPIO_SetBits(GPIOA, GPIO_Pin_1); }

void LED1_Turn(void) {     if (GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_1) == 0)     {         GPIO_SetBits(GPIOA, GPIO_Pin_1);     }     else     {         GPIO_ResetBits(GPIOA, GPIO_Pin_1);     } }

void LED2_ON(void) {     GPIO_ResetBits(GPIOA, GPIO_Pin_2); }

void LED2_OFF(void) {     GPIO_SetBits(GPIOA, GPIO_Pin_2); }

void LED2_Turn(void) {     if (GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_2) == 0)     {         GPIO_SetBits(GPIOA, GPIO_Pin_2);     }     else     {         GPIO_ResetBits(GPIOA, GPIO_Pin_2);     } }  

LED.h

#ifndef __LED_H #define __LED_H

void LED_Init(void); void LED1_ON(void); void LED1_OFF(void); void LED1_Turn(void); void LED2_ON(void); void LED2_OFF(void); void LED2_Turn(void);

#endif  

赞(0)
未经允许不得转载:171主机测评 » 【RT-Thread初学者详细教程(一)】—在stm32标准库裸机程序上移植RT-Thread
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址