keil+stm32cubemx创建STM32F767芯片的RT-Thread工程

    xiaoxiao2022-07-06  205

    使用该方式,能够去除繁琐的添加库文件与添加头文件路径,大大简化了RT-Thread的移植。

    1.在keil安装RT-Thread:在keil快捷面板上点击pack Installer按钮,在弹出的 窗口中找到Pack页面下的RealThread,如下图所示。

    2. 使用Project->new uVision Project创建工程,设置工程名字,保存工程路径后选择芯片型号。

    3. 接下来在Manage Run-Time Environment界面配置使用的库,配置使用RT-Thread与stm32cubemx,如下图 所示,点击OK后,就会自动添加RT-Thread代码。

    4.配置好后,点击ok按钮,会弹出如下选择框,点击Start STM32CubeMX启动软件。

    5. 进入Stm32CubeMX可以发现工程已经自动创建好了,我们需要进行必要的配置。    首先系统正常运行必须需要时钟,使用选择HSE(根据自己的硬件选择)。

    6. 再依次配置LED控制引脚与USART1(这里省略)。

                 

    7.进入Clock configuration页面,配置HCLK为最大的216MHz

    8. 进入Project Manager页面,配置工程路径,工程名,堆栈大小,使用的IDE等,尤其是可以在Advanced setting中配置使用HAL库还是使用LL库,如下图所示

    9 在Project 页面还有一项非常重要的配置,Toolchain/IDE一定要选择GPDSC,否则keil工程会编译出错,说找不到gpdsc文件

    10. 点击“GENERATE CODE”按钮生成代码工程

    11. 修改stm32f7xx_it.c文件

    该文件主要屏蔽下面四个中断,因为这几个中断需要被RT-Rhread使用。

    HardFault_HandlerMemManage_HandlerPendSV_HandlerSysTick_Handler

    12 修改board.c文件

    由于我们使用stm32cubemx对stm32f7进行配置,一些初始化配置都有自动生成。所以该文件中对于时钟的设置部分都可以注释掉,修改后的文件如下:

    #include <rthw.h> #include <rtthread.h> #if defined(RT_USING_USER_MAIN) && defined(RT_USING_HEAP) #define RT_HEAP_SIZE 1024 static uint32_t rt_heap[RT_HEAP_SIZE]; // heap default size: 4K(1024 * 4) RT_WEAK void *rt_heap_begin_get(void) { return rt_heap; } RT_WEAK void *rt_heap_end_get(void) { return rt_heap + RT_HEAP_SIZE; } #endif /** * This function will initial your board. */ void rt_hw_board_init() { /* Call components board initial (use INIT_BOARD_EXPORT()) */ #ifdef RT_USING_COMPONENTS_INIT rt_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 } void SysTick_Handler(void) { /* enter interrupt */ rt_interrupt_enter(); rt_tick_increase(); /* leave interrupt */ rt_interrupt_leave(); }

    13 rtconfig.h文件修改

    该文件为配置文件,这里不详细介绍,只讲一些常用的

    宏定义说明RT_THREAD_PRIORITY_MAX该宏定义了最多支持多少个优先级,根据需要设置。RT_TICK_PER_SECOND定义了每秒有多少个Tick,一般设置为1000。RT_NAME_MAX内核对象名字的最大长度,根据需要配置RT_DEBUG_INIT调试配置RT_USING_TIMER_SOFT是否使用软件定时器,一般需要打开RT_USING_SEMAPHORE内部通讯配置,互斥量,时间,邮箱等配置,一般需要打开RT_USING_HEAP是否使用堆,使用动态线程时必须打开,一般需打开

    14  到了这里已经可以编译通过了,下面新建一个简单的任务

    在man.c中适当的位置添加如下代码,就可以运行一个led闪烁任务了

    static struct rt_thread led1_thread;/* 定义线程控制块 */ ALIGN(RT_ALIGN_SIZE) static rt_uint8_t rt_led1_thread_stack[1024];/* 定义线程栈 */ /* * 开发板硬件初始化,RTT 系统初始化已经在 main 函数之前完成, * 即在 component.c 文件中的 rtthread_startup()函数中完成了。 * 所以在 main 函数中,只需要创建线程和启动线程即可。 */ rt_thread_init(&led1_thread, /* 线程控制块 */ "led1", /* 线程名字 */ led1_thread_entry, /* 线程入口函数 */ RT_NULL, /* 线程入口函数参数 */ &rt_led1_thread_stack[0], /* 线程栈起始地址 */ sizeof(rt_led1_thread_stack), /* 线程栈大小 */ 3, /* 线程的优先级 */ 20); /* 线程时间片 */ rt_thread_startup(&led1_thread); /* 启动线程,开启调度 */ //任务函数 static void led1_thread_entry(void* parameter) { while (1) { HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_0); HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_1); rt_thread_delay(500); /* 延时 500 个 tick */ } }

     

     

    最新回复(0)