[其他ST产品] keil+stm32cubemx创建STM32F767芯片的RT-Thread工程

[复制链接]
1042|18
 楼主| SHOPQQ 发表于 2023-3-27 20:43 | 显示全部楼层 |阅读模式
使用该方式,能够去除繁琐的添加库文件与添加头文件路径,大大简化了RT-Thread的移植。 1.在keil安装RT-Thread:在keil快捷面板上点击pack Installer按钮,在弹出的 窗口中找到Pack页面下的RealThread,如下图所示。
3008764218f63f1571.png


4848264218f6bbc101.png

 楼主| SHOPQQ 发表于 2023-3-27 20:43 | 显示全部楼层
2. 使用Project->new uVision Project创建工程,设置工程名字,保存工程路径后选择芯片型号。
 楼主| SHOPQQ 发表于 2023-3-27 20:44 | 显示全部楼层
3. 接下来在Manage Run-Time Environment界面配置使用的库,配置使用RT-Thread与stm32cubemx,如下图 所示,点击OK后,就会自动添加RT-Thread代码。
6176064218f8e36db0.png
6958064218f98355fd.png
7654764218f9d4188f.png
 楼主| SHOPQQ 发表于 2023-3-27 20:44 | 显示全部楼层
4.配置好后,点击ok按钮,会弹出如下选择框,点击Start STM32CubeMX启动软件。
1805564218faac2f90.png
 楼主| SHOPQQ 发表于 2023-3-27 20:44 | 显示全部楼层
5. 进入Stm32CubeMX可以发现工程已经自动创建好了,我们需要进行必要的配置。
   首先系统正常运行必须需要时钟,使用选择HSE(根据自己的硬件选择)。

4580264218fc2ef7a0.png
 楼主| SHOPQQ 发表于 2023-3-27 20:45 | 显示全部楼层
6. 再依次配置LED控制引脚与USART1(这里省略)。

9269964218fd9d164e.png
 楼主| SHOPQQ 发表于 2023-3-27 20:45 | 显示全部楼层
7.进入Clock configuration页面,配置HCLK为最大的216MHz
4336764218fe7b5bc0.png
 楼主| SHOPQQ 发表于 2023-3-27 20:45 | 显示全部楼层
8. 进入Project Manager页面,配置工程路径,工程名,堆栈大小,使用的IDE等,尤其是可以在Advanced setting中配置使用HAL库还是使用LL库,如下图所示
6561764218ff3bb28d.png
 楼主| SHOPQQ 发表于 2023-3-27 20:45 | 显示全部楼层
9 在Project 页面还有一项非常重要的配置,Toolchain/IDE一定要选择GPDSC,否则keil工程会编译出错,说找不到gpdsc文件
8422964219000e0456.png
 楼主| SHOPQQ 发表于 2023-3-27 20:46 | 显示全部楼层
10. 点击“GENERATE CODE”按钮生成代码工程
56753642190105b405.png
 楼主| SHOPQQ 发表于 2023-3-27 20:46 | 显示全部楼层
11. 修改stm32f7xx_it.c文件

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

    HardFault_Handler
    MemManage_Handler
    PendSV_Handler
    SysTick_Handler
 楼主| SHOPQQ 发表于 2023-3-27 20:46 | 显示全部楼层
12 修改board.c文件

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

  3. #if defined(RT_USING_USER_MAIN) && defined(RT_USING_HEAP)
  4. #define RT_HEAP_SIZE 1024
  5. static uint32_t rt_heap[RT_HEAP_SIZE];        // heap default size: 4K(1024 * 4)
  6. RT_WEAK void *rt_heap_begin_get(void)
  7. {
  8.     return rt_heap;
  9. }

  10. RT_WEAK void *rt_heap_end_get(void)
  11. {
  12.     return rt_heap + RT_HEAP_SIZE;
  13. }
  14. #endif

  15. /**
  16. * This function will initial your board.
  17. */
  18. void rt_hw_board_init()
  19. {       
  20.     /* Call components board initial (use INIT_BOARD_EXPORT()) */
  21. #ifdef RT_USING_COMPONENTS_INIT
  22.     rt_components_board_init();
  23. #endif
  24.    
  25. #if defined(RT_USING_CONSOLE) && defined(RT_USING_DEVICE)
  26.         rt_console_set_device(RT_CONSOLE_DEVICE_NAME);
  27. #endif
  28.    
  29. #if defined(RT_USING_USER_MAIN) && defined(RT_USING_HEAP)
  30.     rt_system_heap_init(rt_heap_begin_get(), rt_heap_end_get());
  31. #endif
  32. }

  33. void SysTick_Handler(void)
  34. {
  35.         /* enter interrupt */
  36.         rt_interrupt_enter();

  37.         rt_tick_increase();

  38.         /* leave interrupt */
  39.         rt_interrupt_leave();
  40. }
 楼主| SHOPQQ 发表于 2023-3-27 20:46 | 显示全部楼层
13 rtconfig.h文件修改

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

131146421903bbf047.png
 楼主| SHOPQQ 发表于 2023-3-27 20:47 | 显示全部楼层
14  到了这里已经可以编译通过了,下面新建一个简单的任务

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

 楼主| SHOPQQ 发表于 2023-3-27 20:47 | 显示全部楼层
  1. static struct rt_thread led1_thread;/* 定义线程控制块 */
  2. ALIGN(RT_ALIGN_SIZE) static rt_uint8_t rt_led1_thread_stack[1024];/* 定义线程栈 */


  3. /*
  4.     * 开发板硬件初始化,RTT 系统初始化已经在 main 函数之前完成,
  5.     * 即在 component.c 文件中的 rtthread_startup()函数中完成了。
  6.     * 所以在 main 函数中,只需要创建线程和启动线程即可。
  7.     */
  8.     rt_thread_init(&led1_thread,        /* 线程控制块 */
  9.                     "led1",             /* 线程名字 */
  10.                     led1_thread_entry,  /* 线程入口函数 */
  11.                     RT_NULL,            /* 线程入口函数参数 */
  12.                     &rt_led1_thread_stack[0],     /* 线程栈起始地址 */
  13.                     sizeof(rt_led1_thread_stack), /* 线程栈大小 */
  14.                     3,                  /* 线程的优先级 */
  15.                     20);                /* 线程时间片 */
  16.                     
  17.     rt_thread_startup(&led1_thread); /* 启动线程,开启调度 */


  18. //任务函数
  19. static void led1_thread_entry(void* parameter)
  20. {
  21.     while (1)
  22.     {
  23.         HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_0);
  24.         HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_1);
  25.         rt_thread_delay(500); /* 延时 500 个 tick */
  26.     }
  27. }

Wordsworth 发表于 2024-4-22 09:29 | 显示全部楼层

电阻元件的电阻值大小一般与温度,材料,长度,还有横截面积有关
Clyde011 发表于 2024-4-22 10:32 | 显示全部楼层

灌封之前需要使用抽空机进行天然脱泡和真空脱泡预处理
万图 发表于 2024-4-22 12:28 | 显示全部楼层

当电压超过二极管的导通电压的时候
Uriah 发表于 2024-4-22 13:31 | 显示全部楼层

在低成本控制器内部有时候会没有钳位二极管
帛灿灿 发表于 2024-4-22 15:27 | 显示全部楼层

会使二极管导通
您需要登录后才可以回帖 登录 | 注册

本版积分规则

9

主题

183

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部