当前位置:   article > 正文

RT-Thread: 移植RT-Thread,基于 STM32CubeMX 生成的 KEIL 工程_cubemx 移植rtthread

cubemx 移植rtthread

目录

关键词:RT-Thread 移植,基于 STM32CubeMX 生成的 KEIL 工程,JLINK-RTT 移植

1).使用 STM32CubeMX 生成芯片对应的裸机工程

2).KEIL 打开工程,配置工程,打开 Use MicroLIB库

3).添加 RT-Thread

4).修改 RTOS 的配置文件 rtconfig.h 

5).修改 RTOS 的 board.c 文件

6).添加JLINK 的RTT 打印功能

7).编译、排错错误、测试

8)JLINK RTT 软件设置及应用



1).使用 STM32CubeMX 生成芯片对应的裸机工程

使用 STM32CubeMX  根据所需芯片创建工程

 注意:选择 Debug 为 Serial Wire 不然可能下载一次程序后就不能再下载了。

 时钟设置

 工程输出设置

 生成工程 打开工程对应文件夹

 

打开工程对应文件夹

2).KEIL 打开工程,配置工程,打开 Use MicroLIB库

配置调试接口

 

 配置完成,编译一下检查是否有错,为下一步添加系统提前排除错误。 

3).添加 RT-Thread

 添加 RTOS

添加好后,RTOS出现在项目目录里面

4).修改 RTOS 的配置文件 rtconfig.h 

 rtconfig.h 文件参考

  1. /* RT-Thread config file */
  2. #ifndef __RTTHREAD_CFG_H__
  3. #define __RTTHREAD_CFG_H__
  4. // <<< Use Configuration Wizard in Context Menu >>>
  5. // <h>Basic Configuration
  6. // <o>Maximal level of thread priority <8-256>
  7. // <i>Default: 32
  8. #define RT_THREAD_PRIORITY_MAX 32
  9. // <o>OS tick per second
  10. // <i>Default: 1000 (1ms)
  11. #define RT_TICK_PER_SECOND 1000
  12. // <o>Alignment size for CPU architecture data access
  13. // <i>Default: 4
  14. #define RT_ALIGN_SIZE 4
  15. // <o>the max length of object name<2-16>
  16. // <i>Default: 8
  17. #define RT_NAME_MAX 16 /* YL 从8改16 */
  18. // <c1>Using RT-Thread components initialization
  19. // <i>Using RT-Thread components initialization
  20. #define RT_USING_COMPONENTS_INIT
  21. // </c>
  22. #define RT_USING_USER_MAIN
  23. // <o>the stack size of main thread<1-4086>
  24. // <i>Default: 512
  25. #define RT_MAIN_THREAD_STACK_SIZE 256 /* YL 从 256 改 2048 */
  26. // </h>
  27. // <h>Debug Configuration
  28. // <c1>enable kernel debug configuration
  29. // <i>Default: enable kernel debug configuration
  30. //#define RT_DEBUG
  31. // </c>
  32. // <o>enable components initialization debug configuration<0-1>
  33. // <i>Default: 0
  34. #define RT_DEBUG_INIT 0
  35. // <c1>thread stack over flow detect
  36. // <i> Diable Thread stack over flow detect
  37. //#define RT_USING_OVERFLOW_CHECK
  38. // </c>
  39. // </h>
  40. // <h>Hook Configuration
  41. // <c1>using hook
  42. // <i>using hook
  43. //#define RT_USING_HOOK
  44. // </c>
  45. // <c1>using idle hook
  46. // <i>using idle hook
  47. //#define RT_USING_IDLE_HOOK
  48. // </c>
  49. // </h>
  50. // <e>Software timers Configuration
  51. // <i> Enables user timers
  52. #define RT_USING_TIMER_SOFT 0
  53. #if RT_USING_TIMER_SOFT == 0
  54. #undef RT_USING_TIMER_SOFT
  55. #endif
  56. // <o>The priority level of timer thread <0-31>
  57. // <i>Default: 4
  58. #define RT_TIMER_THREAD_PRIO 4
  59. // <o>The stack size of timer thread <0-8192>
  60. // <i>Default: 512
  61. #define RT_TIMER_THREAD_STACK_SIZE 512
  62. // </e>
  63. // <h>IPC(Inter-process communication) Configuration
  64. // <c1>Using Semaphore
  65. // <i>Using Semaphore
  66. #define RT_USING_SEMAPHORE
  67. // </c>
  68. // <c1>Using Mutex
  69. // <i>Using Mutex
  70. //#define RT_USING_MUTEX /* YL 互斥量 */
  71. // </c>
  72. // <c1>Using Event
  73. // <i>Using Event
  74. //#define RT_USING_EVENT /* YL 信号量 */
  75. // </c>
  76. // <c1>Using MailBox
  77. // <i>Using MailBox
  78. #define RT_USING_MAILBOX /* YL 邮箱 */
  79. // </c>
  80. // <c1>Using Message Queue
  81. // <i>Using Message Queue
  82. //#define RT_USING_MESSAGEQUEUE /* YL 消息队列 */
  83. // </c>
  84. // </h>
  85. // <h>Memory Management Configuration
  86. // <c1>Memory Pool Management
  87. // <i>Memory Pool Management
  88. //#define RT_USING_MEMPOOL
  89. // </c>
  90. // <c1>Dynamic Heap Management(Algorithm: small memory )
  91. // <i>Dynamic Heap Management
  92. #define RT_USING_HEAP
  93. #define RT_USING_SMALL_MEM
  94. // </c>
  95. // <c1>using tiny size of memory
  96. // <i>using tiny size of memory
  97. //#define RT_USING_TINY_SIZE
  98. // </c>
  99. // </h>
  100. // <h>Console Configuration
  101. // <c1>Using console
  102. // <i>Using console
  103. #define RT_USING_CONSOLE /* YL 控制台 */
  104. // </c>
  105. // <o>the buffer size of console <1-1024>
  106. // <i>the buffer size of console
  107. // <i>Default: 128 (128Byte)
  108. #define RT_CONSOLEBUF_SIZE 256
  109. // </h>
  110. // <h>FinSH Configuration
  111. // <c1>include finsh config
  112. // <i>Select this choice if you using FinSH
  113. #include "finsh_config.h" /* YL 开启宏定义,再到finsh_port.c 中关闭对应提示 */
  114. // </c>
  115. // </h>
  116. // <h>Device Configuration
  117. // <c1>using device framework
  118. // <i>using device framework
  119. //#define RT_USING_DEVICE /* YL 设备框架: 开启宏定义, */
  120. // </c>
  121. // </h>
  122. // <<< end of configuration section >>>
  123. #endif

5).修改 RTOS 的 board.c 文件

  1. //添加MCU的滴答定时器中断函数,并调用 RTOS 的滴答定时器回调函数
  2. /* cortex-m SysTick_Handler() */
  3. void SysTick_Handler()
  4. {
  5. rt_os_tick_callback();
  6. }
  7. //在 rt_hw_board_init 添加系统初始化调用的 MCU 函数
  8. void rt_hw_board_init(void)
  9. {
  10. //#error "TODO 1: OS Tick Configuration."
  11. /*
  12. * TODO 1: OS Tick Configuration
  13. * Enable the hardware timer and call the rt_os_tick_callback function
  14. * periodically with the frequency RT_TICK_PER_SECOND.
  15. */
  16. HAL_Init();
  17. SystemClock_Config();
  18. // SystemCoreClockUpdate();
  19. // HAL_SYSTICK_Config( HAL_RCC_GetSysClockFreq() / RT_TICK_PER_SECOND );
  20. /* Call components board initial (use INIT_BOARD_EXPORT()) */
  21. #ifdef RT_USING_COMPONENTS_INIT
  22. rt_components_board_init();
  23. #endif
  24. #if defined(RT_USING_USER_MAIN) && defined(RT_USING_HEAP)
  25. rt_system_heap_init(rt_heap_begin_get(), rt_heap_end_get());
  26. #endif
  27. }
  28. //添加RTOS控制台的收发代码
  29. void rt_hw_console_output(const char *str)
  30. {
  31. //#error "TODO 3: Output the string 'str' through the uart."
  32. #if PRINTF_PORT_JLINK /* j-link rtt 模式*/
  33. SEGGER_RTT_printf(0,str);
  34. #else /* 硬件串口 模式*/
  35. while (*str != '\0')
  36. {
  37. // HAL_UART_Transmit(&Uart1Handle, (uint8_t *) (str++), 1, 1000);
  38. }
  39. #endif
  40. rt_exit_critical();
  41. }
  42. char rt_hw_console_getchar(void)
  43. {
  44. /* Note: the initial value of ch must < 0 */
  45. int ch = -1;
  46. #if PRINTF_PORT_JLINK /* j-link rtt 模式*/
  47. ch = SEGGER_RTT_GetKey();
  48. #else /* 硬件串口 模式*/
  49. //read_uart1_ch(&ch);
  50. #endif
  51. return ch;
  52. }
  53. //添加 printf 函数重定向代码
  54. /* printf 重定向 */
  55. int fputc(int ch, FILE *f)
  56. {
  57. #if PRINTF_PORT_JLINK /* j-link rtt 模式*/
  58. SEGGER_RTT_PutChar(0, ch);
  59. #else
  60. HAL_UART_Transmit(&Uart1Handle, (uint8_t *)&ch, 1, 1000); /* 硬件串口 模式*/
  61. #endif
  62. return (ch);
  63. }

6).添加JLINK 的RTT 打印功能

安装JLINK 后,在如下目录中可以找到一个 RTT 文件夹,把这文件夹添加到工程中

添加 RTT 功能使用到的2个 .C 文件

添加 RTT 的头文件

 添加 RTT 的收发代码、printf的重定向函数 到 board.c

  1. void rt_hw_console_output(const char *str)
  2. {
  3. //#error "TODO 3: Output the string 'str' through the uart."
  4. #if PRINTF_PORT_JLINK /* j-link rtt 模式*/
  5. SEGGER_RTT_printf(0,str);
  6. #else /* 硬件串口 模式*/
  7. while (*str != '\0')
  8. {
  9. // HAL_UART_Transmit(&Uart1Handle, (uint8_t *) (str++), 1, 1000);
  10. }
  11. #endif
  12. rt_exit_critical();
  13. }
  14. char rt_hw_console_getchar(void)
  15. {
  16. /* Note: the initial value of ch must < 0 */
  17. int ch = -1;
  18. #if PRINTF_PORT_JLINK /* j-link rtt 模式*/
  19. ch = SEGGER_RTT_GetKey();
  20. #else /* 硬件串口 模式*/
  21. //read_uart1_ch(&ch);
  22. #endif
  23. return ch;
  24. }
  25. /* printf 重定向 */
  26. int fputc(int ch, FILE *f)
  27. {
  28. #if PRINTF_PORT_JLINK /* j-link rtt 模式*/
  29. SEGGER_RTT_PutChar(0, ch);
  30. #else
  31. HAL_UART_Transmit(&Uart1Handle, (uint8_t *)&ch, 1, 1000); /* 硬件串口 模式*/
  32. #endif
  33. return (ch);
  34. }

7).编译、排错错误、测试

编译过程中可能会出现如下错误,错误原因因为重复定义。在 Core\Src\stm32g4xx_it.c 文件中找到对应函数,屏蔽掉即可。

  1. SysTick_Handler() //屏蔽掉
  2. PendSV_Handler() //屏蔽掉
  3. HardFault_Handler()//屏蔽掉

 测试:在main.c 函数中增加系统测试代码

  1. uint32_t count = 0;
  2. while (1)
  3. {
  4. /* USER CODE END WHILE */
  5. count++;
  6. rt_thread_mdelay(1000);
  7. printf("count = %d ,tick_time = %d \r\n",count,rt_tick_get());
  8. /* USER CODE BEGIN 3 */
  9. }

下载程序,打开 JLINK 的 RTT

系统成功运行后打印如下信息

8)JLINK RTT 软件设置及应用

 

打开软件后按 F2 可以弹出如下窗口;

设置后 OK可以打开 RTT 功能按F3可以断开链接;

窗口数据停止刷新ALT + R 清除窗口显示;

按如下设置后,输入信息按 回车键才会发出,这样配置后才能使用 RT thread 的控制台

在输入窗口输入 help 回车可以看到系统控制台的打印信息 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/67445
推荐阅读
相关标签
  

闽ICP备14008679号