TA的每日心情 | 开心 2016-7-19 10:35 |
---|
签到天数: 8 天 连续签到: 1 天 [LV.3]偶尔看看II
|
本帖最后由 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文件- #include "gd32f20x_gpio.h"
- #include "gd32f20x_rcc.h"
- #include "gd32f20x_usart.h"
- #include "FreeRTOS.h"
- #include "task.h"
- static void SysTickConfig(void);
- static void USART1_Config(void);
- //define tasks
- static void ledTask(void *params);
- static void uartTask(void *params);
- static void HAL_USART1_SendBytes(const char *msg);
- int main(void)
- {
- GPIO_InitPara gpio;
- RCC_APB2PeriphClock_Enable(RCC_APB2PERIPH_GPIOD, ENABLE);
- gpio.GPIO_Pin = GPIO_PIN_11;
- gpio.GPIO_Mode = GPIO_MODE_OUT_PP;
- gpio.GPIO_Speed = GPIO_SPEED_10MHZ;
- GPIO_Init(GPIOD, &gpio);
- //GPIO_SetBits(GPIOD, GPIO_PIN_12);
- SysTickConfig();
- USART1_Config();
- //HAL_USART1_SendBytes("Hello, world!\r\n");
- xTaskCreate(ledTask, "Led Task", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY + 1, NULL);
- xTaskCreate(uartTask, "Uart Task", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY + 1, NULL);
- vTaskStartScheduler();
- while(1)
- {
- }
- }
- //void SysTick_Handler(void)
- //{
- // static int TimingDelayLocal = 0;
- // static BitState ledStatus = Bit_RESET;
- //
- // TimingDelayLocal++;
- // if (TimingDelayLocal == 500)
- // {
- // ledStatus ^= 1;
- // GPIO_WriteBit(GPIOD, GPIO_PIN_11, ledStatus);
- //
- // TimingDelayLocal = 0;
- // }
- //}
- static void SysTickConfig(void)
- {
- // 1ms
- if (SysTick_Config(SystemCoreClock / 1000))
- {
- while (1);
- }
- NVIC_SetPriority(SysTick_IRQn, 0x00);
- }
- static void USART1_Config(void)
- {
- GPIO_InitPara GPIO_InitStructure;
- USART_InitPara USART_InitStructure;
- RCC_APB2PeriphClock_Enable( RCC_APB2PERIPH_GPIOB, ENABLE );
- RCC_APB2PeriphClock_Enable(RCC_APB2PERIPH_USART1, ENABLE );
- RCC_APB2PeriphClock_Enable(RCC_APB2PERIPH_AF, ENABLE);
- GPIO_InitStructure.GPIO_Pin = GPIO_PIN_6 ;
- GPIO_InitStructure.GPIO_Mode = GPIO_MODE_AF_PP;
- GPIO_InitStructure.GPIO_Speed = GPIO_SPEED_50MHZ;
- GPIO_Init( GPIOB , &GPIO_InitStructure);
- GPIO_InitStructure.GPIO_Pin = GPIO_PIN_7;
- GPIO_InitStructure.GPIO_Mode = GPIO_MODE_IN_FLOATING;;
- GPIO_Init( GPIOB , &GPIO_InitStructure);
- GPIO_PinRemapConfig(GPIO_REMAP_USART1, ENABLE);
- USART_InitStructure.USART_BRR = 115200;
- USART_InitStructure.USART_WL = USART_WL_8B;
- USART_InitStructure.USART_STBits = USART_STBITS_1;
- USART_InitStructure.USART_Parity = USART_PARITY_RESET;
- USART_InitStructure.USART_HardwareFlowControl = USART_HARDWAREFLOWCONTROL_NONE;
- USART_InitStructure.USART_RxorTx = USART_RXORTX_RX | USART_RXORTX_TX;
- USART_Init(USART1, &USART_InitStructure);
- /* USART enable */
- USART_Enable(USART1, ENABLE);
- }
- static void HAL_USART1_SendBytes(const char *msg)
- {
- while(*msg)
- {
- USART_DataSend(USART1, *(msg++));
- while(USART_GetBitState(USART1, USART_FLAG_TBE) == RESET);
- }
- }
- static void ledTask(void *params)
- {
- static BitState ledStatus = Bit_RESET;
- for(;;)
- {
- GPIO_WriteBit(GPIOD, GPIO_PIN_11, ledStatus);
- vTaskDelay(500);
- ledStatus ^= Bit_SET;
- }
- }
- static void uartTask(void *params)
- {
- for(;;)
- {
- HAL_USART1_SendBytes("Hello, world!\r\n");
- vTaskDelay(2000);
- }
- }
复制代码 这里建立了两个任务,一个实现板上红色LED灯的闪烁,另一个任务实现UART输出,打印HELLO, WORLD内容。
如果编译正常,下载到开发板上,按RESET键,会发现LED灯正常闪烁,串口输出也正常
OVER!
|
|