0. 将freeRTOS(版本号FreeRTOSv9.0.0)移植到STM32F10x

Date:2016.06.01

步骤

  • 新建一个MDK5工程
  • stm32f10x相关文件导入
  • 工程设置
  • 裸奔点灯
  • freeRTOS系统文件导入
  • 点个高级灯再试试

新建一个MDK5工程

  • 新建工程目录和文件目录


    工程结构
对应的文件结构

stm32f10x相关文件导入

  1. 库文件导入
    将..\STM32F10x_StdPeriph_Lib_V3.5.\Libraries\STM32F10x_StdPeriph_Driver
    整个文件夹复制到\lib下

  2. 内核和启动代码导入
    2.0 将以下所有文件复制到\core
    2.1 core_cm3.c和core_cm3.h位于:
    ..\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\CoreSupport
    2.2 startup_stm32f10x_hd.s位于:
    ..\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm
    2.3 stm32f10x.h,system_stm32f10x.c,system_stm32f10x.h位于:
    ..\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3 \DeviceSupport\ST\STM32F10x
    2.4 stm32f10x_conf.h,stm32f10x_it.c,stm32f10x_it.h位于:
    ..\STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Template


工程设置

  1. 将文件导入工程


    文件目录
  2. Obj路径设置并勾选生成hex文件


    Obj路径设置并勾选生成hex文件
  3. 头文件路径设置


    头文件路径设置
  4. 全局宏定义变量设置


    全局宏定义变量设置
  5. JLink设置


    JLink设置1

    JLink设置2

裸奔点灯

  1. 在\init下添加一个main.c
#include "stm32f10x.h"  
#include "stm32f10x_it.h"  

void Delay(u32 count) {     
    u32 i=0;     
    for(;i<count;i++);  
}  

void LED_config() {
    GPIO_InitTypeDef  GPIO_InitStructure;       
    RCC_APB2PeriphClockCmd(  RCC_APB2Periph_GPIOA
                           | RCC_APB2Periph_GPIOD,  
                             ENABLE
                           );      
    GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_8;     
    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_Out_PP;    
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    
    GPIO_Init( GPIOA, &GPIO_InitStructure );    
    GPIO_SetBits( GPIOA, GPIO_Pin_8 );
    
    GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_2;
    GPIO_Init( GPIOD, &GPIO_InitStructure);      
    GPIO_SetBits( GPIOD, GPIO_Pin_2 ); 
}

int main(void) {  
    LED_config();

    while(1) {  
        GPIO_ResetBits(GPIOA,GPIO_Pin_8);      
        GPIO_SetBits(GPIOD,GPIO_Pin_2);   
        Delay(3000000);   
        
        GPIO_SetBits(GPIOA,GPIO_Pin_8);   
        GPIO_ResetBits(GPIOD,GPIO_Pin_2);   
        Delay(3000000); 
    }  
    
}

freeRTOS系统文件导入

  1. 与FreeRTOS内核有关的文件:list.c, queue.c, tasks.c
    位于..\FreeRTOSv9.0.0\FreeRTOS\Source
    复制到lib\freeRTOS\src

  2. 与内存分配有关的文件: heap_1.c,heap_2.c,heap_3.c,heap_4.c,heap_5.c。五选一,STM32选择heap_2.c
    位于..\FreeRTOSv9.0.0\FreeRTOS\Source\portable\MemMang
    复制到lib\freeRTOS\src

  3. 移植平台相关文件port.c
    位于..\FreeRTOSv9.0.0\FreeRTOS\Source\portable\RVDS\ARM_CM3
    复制到lib\freeRTOS\src

  4. 配置文件portmacro.h,FreeRTOSConfig.h
    分别位于
    ..\FreeRTOSv9.0.0\FreeRTOS\Source\portable\RVDS\ARM_CM3
    ..\FreeRTOSv9.0.0\FreeRTOS\Demo\CORTEX_STM32F103_Keil
    复制到lib\freeRTOS\inc

  5. 通用代码文件
    将..\FreeRTOSv9.0.0\FreeRTOS\Source\include下的所有文件
    复制到lib\freeRTOS\inc

  6. 将freeRTOS系统文件导入工程结构


    freeRTOS架构
  7. 更改启动文件startup_stm32f10x_hd.s
    . 更改1

    增加代码的位置

    加三行

    具体代码:

__heap_limit

                PRESERVE8
                THUMB
                    
                IMPORT xPortPendSVHandler   ; insert for freeRTOS 
                IMPORT xPortSysTickHandler  ; insert for freeRTOS
                IMPORT vPortSVCHandler      ; insert for freeRTOS 

. 更改2


红圈处注释掉
修改为

具体代码:

__Vectors       DCD     __initial_sp               ; Top of Stack
                DCD     Reset_Handler              ; Reset Handler
                DCD     NMI_Handler                ; NMI Handler
                DCD     HardFault_Handler          ; Hard Fault Handler
                DCD     MemManage_Handler          ; MPU Fault Handler
                DCD     BusFault_Handler           ; Bus Fault Handler
                DCD     UsageFault_Handler         ; Usage Fault Handler
                DCD     0                          ; Reserved
                DCD     0                          ; Reserved
                DCD     0                          ; Reserved
                DCD     0                          ; Reserved
               ; DCD     SVC_Handler                ; SVCall Handler
                DCD     vPortSVCHandler            ; change for freeRTOS
                DCD     DebugMon_Handler           ; Debug Monitor Handler
                DCD     0                          ; Reserved
               ; DCD     PendSV_Handler             ; PendSV Handler
               ; DCD     SysTick_Handler            ; SysTick Handler
                DCD     xPortPendSVHandler         ; change for freeRTOS
                DCD     xPortSysTickHandler        ; change for freeRTOS

点个高级灯再试试
. 更改main.c中的内容为:


#include "stm32f10x.h"  
#include "stm32f10x_it.h" 
#include "FreeRTOS.h"  
#include "task.h" 
#include "queue.h" 
#include "list.h"  
#include "portable.h"  
#include "FreeRTOSConfig.h" 
 
void LED_config() {
    GPIO_InitTypeDef  GPIO_InitStructure;       
    RCC_APB2PeriphClockCmd(  RCC_APB2Periph_GPIOA
                           | RCC_APB2Periph_GPIOD,  
                             ENABLE
                           );      
    GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_8;     
    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_Out_PP;    
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    
    GPIO_Init( GPIOA, &GPIO_InitStructure );    
    GPIO_SetBits( GPIOA, GPIO_Pin_8 );
    
    GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_2;
    GPIO_Init( GPIOD, &GPIO_InitStructure);      
    GPIO_SetBits( GPIOD, GPIO_Pin_2 ); 
}
 
void  vLED_1_Task( void *pvParameters ) {  
    while( 1 ) {  
        GPIO_ResetBits( GPIOA, GPIO_Pin_8 );  
        vTaskDelay( 1000 / portTICK_RATE_MS );   
        GPIO_SetBits( GPIOA, GPIO_Pin_8);    
        vTaskDelay( 2000 / portTICK_RATE_MS );  
    }  
}

void  vLED_2_Task( void *pvParameters ) {  
    while( 1 ) {  
        GPIO_SetBits( GPIOD, GPIO_Pin_2); 
        vTaskDelay( 1000 / portTICK_RATE_MS );   
        GPIO_ResetBits( GPIOD, GPIO_Pin_2);   
        vTaskDelay( 1000 / portTICK_RATE_MS );  
    }  
} 

int main(void) {  
    
    LED_config();  
    
    xTaskCreate( vLED_1_Task, "LED1",configMINIMAL_STACK_SIZE,NULL,tskIDLE_PRIORITY+1 ,NULL);        
    xTaskCreate( vLED_2_Task, "LED2",configMINIMAL_STACK_SIZE,NULL,tskIDLE_PRIORITY+2 ,NULL);
    
    vTaskStartScheduler();
    
    return 0;
    
}

. 注意freeRTOSConfig.h中的配置

#define configUSE_PREEMPTION        1
#define configUSE_IDLE_HOOK         0
#define configUSE_TICK_HOOK         0
#define configCPU_CLOCK_HZ          ( ( unsigned long ) 72000000 )  
#define configTICK_RATE_HZ          ( ( TickType_t ) 1000 )
#define configMAX_PRIORITIES        ( 5 )
#define configMINIMAL_STACK_SIZE    ( ( unsigned short ) 128 )
#define configTOTAL_HEAP_SIZE       ( ( size_t ) ( 17 * 1024 ) )
#define configMAX_TASK_NAME_LEN     ( 16 )
#define configUSE_TRACE_FACILITY    0
#define configUSE_16_BIT_TICKS      0
#define configIDLE_SHOULD_YIELD     1
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容