请选择 进入手机版 | 继续访问电脑版

你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32F0移植RT_Thread_Nano, 使用STM32Cube

[复制链接]
STMCU小助手 发布时间:2021-11-25 16:00
硬件介绍
  我手上开发板使用STM32F030F4P单片机,无外部晶振,所以直接使用内部晶振。开发板上有3个LED灯。

AI[KPXW81}UWZ~_C_U1JBZR.png


安装rtthread_namo包
在操作前,需要安装MDK5软件,以及STM32CubeMX,并安装好STM32F0的Pack

1.打开MDK软件的Pack Install工具,选择RealThread:RT_Thread进行安装

20190626221653457.png


20190626222025313.png


2.在弹出的节目中选择Next,等待安装

20190626222140363.png


3.安装成功后,Reload Packs即可。

20190626222321230.png


创建工程
1.选择芯片STM32F030F4P6

20190626222525565.png


2.Manage Run-Time Environment

20190626232949409.png


   按照图中进行勾选,由于我们芯片资源有限,而且这次的电路并没有接触串口,所以在RTOS部分,我们没有勾选shell。

3.Start STM32CubeMX

20190626223125381.png


   勾选完Run-Time Environment后,会自动弹出启动STM32CubeMX的窗口,我们打开STM32CubeMX进行配置。

4.STM32CubeMX配置Pinout&Configuration

2019062622382861.png

20190626224105362.png

20190626224233634.png


5.配置时钟

20190626224701758.png


6.单击生成代码

20190626224854251.png


7.生成代码如下

20190626225932442.png


配置工程
1.选中RTOS下的rtconfig.h文件,使用Configuration Wizard进行配置

20190627004726239.png


2.内存管理设置

20190626232130606.png


   由于芯片内存很少,我们取消Dynamic Heap Management。勾选上using small memory。

3.关闭console和Finsh

20190626235930620.png


   由于我们并没有接出串口,所以关闭串口相关的内容。

修改代码,测试
修改stm32f0xx_it.c文件
   由于rtthread重写了部分中断服务函数,所以我们需要将stm32f0xx_it.c中部分函数设置为weak。
  1. /**
  2.   * @brief This function handles Hard fault interrupt.
  3.   */
  4. __weak void HardFault_Handler(void)
  5. {
  6.   /* USER CODE BEGIN HardFault_IRQn 0 */

  7.   /* USER CODE END HardFault_IRQn 0 */
  8.   while (1)
  9.   {
  10.     /* USER CODE BEGIN W1_HardFault_IRQn 0 */
  11.     /* USER CODE END W1_HardFault_IRQn 0 */
  12.   }
  13. }

  14. __weak void PendSV_Handler(void)
  15. {
  16.   /* USER CODE BEGIN PendSV_IRQn 0 */

  17.   /* USER CODE END PendSV_IRQn 0 */
  18.   /* USER CODE BEGIN PendSV_IRQn 1 */

  19.   /* USER CODE END PendSV_IRQn 1 */
  20. }

  21. __weak void SysTick_Handler(void)
  22. {
  23.   /* USER CODE BEGIN SysTick_IRQn 0 */

  24.   /* USER CODE END SysTick_IRQn 0 */
  25.   HAL_IncTick();
  26.   /* USER CODE BEGIN SysTick_IRQn 1 */

  27.   /* USER CODE END SysTick_IRQn 1 */
  28. }
复制代码

修改时钟部分
   在mian函数中,有HAL_Init()和SystemClock_Config()函数,用来在系统开始的时候初始化HAL和System时钟。但是当我们使用rtthread后,第一个执行的函数不是main()。而是rtthread系统的初始化函数,并在board.c的rt_hw_board_init()中进行硬件初始化。
   我们将HAL_Init()和SystemClock_Config()放到rt_hw_board_init()最前面,保证在用户代码运行时,时钟时我们希望的样子。
  1. void rt_hw_board_init()
  2. {        
  3.         /* System Clock Update */
  4.         //SystemCoreClockUpdate();
  5.         HAL_Init();
  6.         SystemClock_Config();
  7.         
  8.         /* System Tick Configuration */
  9.         _SysTick_Config(SystemCoreClock / RT_TICK_PER_SECOND);

  10.     /* Call components board initial (use INIT_BOARD_EXPORT()) */
  11. #ifdef RT_USING_COMPONENTS_INIT
  12.     rt_components_board_init();
  13. #endif

  14. #if defined(RT_USING_CONSOLE) && defined(RT_USING_DEVICE)
  15.         rt_console_set_device(RT_CONSOLE_DEVICE_NAME);
  16. #endif

  17. #if defined(RT_USING_USER_MAIN) && defined(RT_USING_HEAP)
  18.     rt_system_heap_init(rt_heap_begin_get(), rt_heap_end_get());
  19. #endif
  20. }
复制代码
   由于我们屏蔽了stm32f0xx_it.c中的SysTick_Handler(void)函数,SysTick_Handler(void)中的HAL_IncTick()也一同被屏蔽,我们将其移动到board.c的SysTick_Handler(void)中。
  1. void SysTick_Handler(void)
  2. {
  3.         /* enter interrupt */
  4.         rt_interrupt_enter();

  5.         rt_tick_increase();
  6.         HAL_IncTick();
  7.         
  8.         /* leave interrupt */
  9.         rt_interrupt_leave();
  10. }
复制代码

增加用户代码
     
  1.          while (1)
  2.         {
  3.                  /* USER CODE END WHILE */
  4.                 HAL_GPIO_WritePin(GPIOA, LED_R_Pin|LED_G_Pin|LED_B_Pin, GPIO_PIN_RESET);
  5.                 rt_thread_delay(500);  
  6.                 HAL_GPIO_WritePin(GPIOA, LED_R_Pin|LED_G_Pin|LED_B_Pin, GPIO_PIN_SET);  
  7.                 rt_thread_delay(500);  
  8.                 /* USER CODE BEGIN 3 */
  9.         }
复制代码

编译测试
1.使用ARM Compiler version5 进行编译,结果如下:

20190627003559464.png


2. 使用ARM Compiler version6编译,结果如下:

20190627003658959.png


  相对于我第一次写关于ARMCLANG的博客,已经过去很久了,目前很多中间件,以及STM32的HAL库都已经能很好的支持ARMCLAGN,推荐大家使用ARMCLANG编译器进行编译。


收藏 评论0 发布时间:2021-11-25 16:00

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版