查看: 6734|回复: 6

[经验] GD32上移植FREERTOS V823

[复制链接]
  • TA的每日心情
    开心
    2016-7-19 10:35
  • 签到天数: 8 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    发表于 2016-1-1 17:35:47 | 显示全部楼层 |阅读模式
    分享到:
    本帖最后由 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

    解压,目录结构如下

    QQ截图20160101220650.png


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

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

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

    QQ截图20160101220849.png

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

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

    QQ截图20160101221116.png

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

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

    QQ截图20160101220849.png

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

    QQ截图20160101221519.png

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

    065149mf6a0j08fa9j8aaa.png

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

    QQ截图20160101222106.png

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

    072437ffy995uz5y2b21aa.png


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

    完整的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灯正常闪烁,串口输出也正常


    QQ截图20160101222813.png

    OVER!

    回复

    使用道具 举报

  • TA的每日心情
    开心
    2020-1-23 13:44
  • 签到天数: 243 天

    连续签到: 1 天

    [LV.8]以坛为家I

    发表于 2016-1-2 08:42:44 | 显示全部楼层
    多谢分享。。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2023-7-25 22:49
  • 签到天数: 385 天

    连续签到: 1 天

    [LV.9]以坛为家II

    发表于 2016-1-2 14:58:26 | 显示全部楼层
    移植飞鸟的系统呢?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2016-8-15 09:28
  • 签到天数: 222 天

    连续签到: 1 天

    [LV.7]常住居民III

    发表于 2016-1-4 08:51:17 | 显示全部楼层
    百花齐放,百鸟争鸣飞鸟不会在意的
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2020-5-27 15:41
  • 签到天数: 868 天

    连续签到: 1 天

    [LV.10]以坛为家III

    发表于 2016-1-4 09:37:45 | 显示全部楼层
    写写分享               
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2018-11-19 16:39
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]初来乍到

    发表于 2016-1-4 15:25:53 | 显示全部楼层
    分享的不错,可以将文章一并发到经验频道,获取双重奖励哟http://jingyan.eeboard.com/
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    无聊
    2016-1-4 18:20
  • 签到天数: 3 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    发表于 2016-1-4 18:31:18 | 显示全部楼层
    写的不错,GD雄起。。。
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

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



    手机版|小黑屋|与非网

    GMT+8, 2024-5-5 03:49 , Processed in 0.180856 second(s), 27 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.