6回答

0收藏

[分享] GD32上移植FREERTOS V823

GD32 GD32 7707 人阅读 | 6 人回复 | 2016-01-01

本帖最后由 netlhx 于 2016-1-1 22:29 编辑

首先,对飞鸟大侠说句,不好意思,本来,GD32是主推飞鸟RTOS的,只是确实对飞鸟OS还不太熟悉。所以先折腾着比较熟悉的FREERTOS了,这也算是百花齐放吧!,稍后再慢慢研究飞鸟OS。

一方面,GD32与STM32基本兼容;再者FREERTOS对STM32的支持已非常成熟,所以移植起来并不算太难。站在巨人的肩膀,相对比较轻松。

本文是在上一个工程的基础上实现的。

上个工程主要实现UART通信,详见:https://www.cirmall.com/bbs/thread-45758-1-1.html

这里介绍怎么将FREERTOS移植到GD32小红板上。

下载FREERTOS,到这里下载:http://sourceforge.net/projects/freertos/files/latest/download?source=files,最新的版本是V8.2.3

解压,目录结构如下




其中DEMO是一些演示程序,对常见的MCU都有支持,你也可以把它们看作是模板,在此基础上对自己的MCU做移植。

SOURCE文件夹就是FREERTOS的核心代码了。

下面一张图显示了要移植的相关文件



本文只介绍移植方法,并不打算详细挖掘FREERTOS原理,所以上面的这些文件,你暂时只要知道一点:它们的位置,免得需要去找其中一个文件的时候,却发现不知道文件在哪里!

将FREERTOS的源文件全部复制到FREERTOS文件夹下面,如图



RTOSDEMO文件夹是演示用工程文件夹。

接下来将必要的文件添加到工程文件中,主要有下面几个文件。



接下来是添加头文件包涵路径,参考下图



接下来在下载的FREERTOS文件夹中打开DEMO,这里是为不同的MCU适配的一些配置,因为GD32与STM32F10X兼容,所以找一个STM32F10X的配置模板来修改以适配GD32小红板。



接下来修改一个重要的参数,首先就是系统时钟主频,因为GD32的主频默认配置为120MHZ,所以做如下修改,其它视情况而定



还有一处重要的地方要修改,因为FREERTOS接管了SYSTICK及SVC等服务,所以需要IMPORT这些服务,并修改中断向量表,这个操作在startup_gd32f20x_cl.s文件中,修改内容如下




移植基本完成,下面将这些功能引入到工程中,见代码,不多说。

完整的MAIN.C文件
  1. #include "gd32f20x_gpio.h"
  2. #include "gd32f20x_rcc.h"
  3. #include "gd32f20x_usart.h"
  4. #include "FreeRTOS.h"
  5. #include "task.h"

  6. static void SysTickConfig(void);
  7. static void USART1_Config(void);

  8. //define tasks

  9. static void ledTask(void *params);
  10. static void uartTask(void *params);


  11. static void HAL_USART1_SendBytes(const char *msg);

  12. int main(void)
  13. {

  14. GPIO_InitPara gpio;

  15. RCC_APB2PeriphClock_Enable(RCC_APB2PERIPH_GPIOD, ENABLE);

  16. gpio.GPIO_Pin = GPIO_PIN_11;
  17. gpio.GPIO_Mode = GPIO_MODE_OUT_PP;
  18. gpio.GPIO_Speed = GPIO_SPEED_10MHZ;

  19. GPIO_Init(GPIOD, &gpio);

  20. //GPIO_SetBits(GPIOD, GPIO_PIN_12);
  21. SysTickConfig();

  22. USART1_Config();

  23. //HAL_USART1_SendBytes("Hello, world!\r\n");

  24. xTaskCreate(ledTask, "Led Task", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY + 1, NULL);
  25. xTaskCreate(uartTask, "Uart Task", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY + 1, NULL);

  26. vTaskStartScheduler();

  27. while(1)
  28. {

  29. }




  30. }


  31. //void SysTick_Handler(void)
  32. //{
  33. // static int TimingDelayLocal = 0;
  34. // static BitState ledStatus = Bit_RESET;
  35. //
  36. // TimingDelayLocal++;
  37. // if (TimingDelayLocal == 500)
  38. // {
  39. // ledStatus ^= 1;
  40. // GPIO_WriteBit(GPIOD, GPIO_PIN_11, ledStatus);
  41. //
  42. // TimingDelayLocal = 0;
  43. // }
  44. //}


  45. static void SysTickConfig(void)
  46. {
  47. // 1ms
  48. if (SysTick_Config(SystemCoreClock / 1000))
  49. {
  50. while (1);
  51. }
  52. NVIC_SetPriority(SysTick_IRQn, 0x00);
  53. }

  54. static void USART1_Config(void)
  55. {

  56. GPIO_InitPara GPIO_InitStructure;
  57. USART_InitPara USART_InitStructure;

  58. RCC_APB2PeriphClock_Enable( RCC_APB2PERIPH_GPIOB, ENABLE );

  59. RCC_APB2PeriphClock_Enable(RCC_APB2PERIPH_USART1, ENABLE );
  60. RCC_APB2PeriphClock_Enable(RCC_APB2PERIPH_AF, ENABLE);
  61. GPIO_InitStructure.GPIO_Pin = GPIO_PIN_6 ;
  62. GPIO_InitStructure.GPIO_Mode = GPIO_MODE_AF_PP;
  63. GPIO_InitStructure.GPIO_Speed = GPIO_SPEED_50MHZ;
  64. GPIO_Init( GPIOB , &GPIO_InitStructure);
  65. GPIO_InitStructure.GPIO_Pin = GPIO_PIN_7;
  66. GPIO_InitStructure.GPIO_Mode = GPIO_MODE_IN_FLOATING;;
  67. GPIO_Init( GPIOB , &GPIO_InitStructure);

  68. GPIO_PinRemapConfig(GPIO_REMAP_USART1, ENABLE);


  69. USART_InitStructure.USART_BRR = 115200;
  70. USART_InitStructure.USART_WL = USART_WL_8B;
  71. USART_InitStructure.USART_STBits = USART_STBITS_1;
  72. USART_InitStructure.USART_Parity = USART_PARITY_RESET;
  73. USART_InitStructure.USART_HardwareFlowControl = USART_HARDWAREFLOWCONTROL_NONE;
  74. USART_InitStructure.USART_RxorTx = USART_RXORTX_RX | USART_RXORTX_TX;
  75. USART_Init(USART1, &USART_InitStructure);

  76. /* USART enable */
  77. USART_Enable(USART1, ENABLE);

  78. }


  79. static void HAL_USART1_SendBytes(const char *msg)
  80. {

  81. while(*msg)
  82. {
  83. USART_DataSend(USART1, *(msg++));
  84. while(USART_GetBitState(USART1, USART_FLAG_TBE) == RESET);
  85. }
  86. }

  87. static void ledTask(void *params)
  88. {
  89. static BitState ledStatus = Bit_RESET;

  90. for(;;)
  91. {
  92. GPIO_WriteBit(GPIOD, GPIO_PIN_11, ledStatus);
  93. vTaskDelay(500);

  94. ledStatus ^= Bit_SET;
  95. }


  96. }

  97. static void uartTask(void *params)
  98. {
  99. for(;;)
  100. {

  101. HAL_USART1_SendBytes("Hello, world!\r\n");
  102. vTaskDelay(2000);

  103. }

  104. }


复制代码
这里建立了两个任务,一个实现板上红色LED灯的闪烁,另一个任务实现UART输出,打印HELLO, WORLD内容。

如果编译正常,下载到开发板上,按RESET键,会发现LED灯正常闪烁,串口输出也正常




OVER!

分享到:
回复

使用道具 举报

回答|共 6 个

倒序浏览

沙发

Paderboy

发表于 2016-1-2 08:42:44 | 只看该作者

多谢分享。。
板凳

党国特派员

发表于 2016-1-2 14:58:26 | 只看该作者

移植飞鸟的系统呢?
喜欢在构思妙想,电子产品DIY是工作,也是一种爱好。
地板

奋斗哥

发表于 2016-1-4 08:51:17 | 只看该作者

百花齐放,百鸟争鸣飞鸟不会在意的
5#

wambob

发表于 2016-1-4 09:37:45 | 只看该作者

写写分享               
6#

糖悦之果飞

发表于 2016-1-4 15:25:53 | 只看该作者

分享的不错,可以将文章一并发到经验频道,获取双重奖励哟http://jingyan.eeboard.com/
7#

jinc

发表于 2016-1-4 18:31:18 | 只看该作者

写的不错,GD雄起。。。
您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条