搜索
bottom↓
回复: 49

在STM32使用3.5函式庫移植FreeRTOS

  [复制链接]

出0入0汤圆

发表于 2011-12-6 02:25:33 | 显示全部楼层 |阅读模式
之前按照FreeRTOS的Demo範例移植3.5函式庫老是失敗,後來在"青島小莊的電子站"http://tinyurl.com/bt9wfxg
找到一篇MDK下基於STM32固件庫V3.5.0的FreeRTOS移植筆記,因為這篇是直接用STM3210E-EVAL
範例為基礎移植FreeRTOS文件,對於我想從0開始建立FreeRTOS專案有一點小遺憾,於是加上
自己的理解和測試終於成功從0開始建立FreeRTOS專案。

目錄結構
目錄結構是參考
1.<STM32 V3.4固件庫使用方法實例>
  http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=4654077&bbs_page_no=2&bbs_id=3020
2.野火stm32開源教程的工程模板

修改成自己習慣的用法,結構如下:

root-----Libraries(直接copy 3.5版函式庫)
     |---FreeRTOS----Source(直接copy FreeRTOS源碼Source目錄)
     |            |--Common(直接copy FreeRTOS源碼\demo\Common目錄)
     |---user---inc---FreeRTOSConfig.h
     |       |        stm32f10x_conf.h
     |       |        stm32f10x_it.h
     |       |
     |       |--src---main.c
     |                STM32F10x.s
     |                stm32f10x_it.c
     |---output(中繼檔放置位置)
              
在Source/portable目錄中,保留RVDS和MemMang目錄,其餘可刪除。
複製<FreeRTOS目錄>\Demo\CORTEX_STM32F103_Keil\FreeRTOSConfig.h

Target options ---> output --->"Select Folder for Objects" 指向 .\output\o目錄
Target options ---> list --->"Select Folder for Listing" 指向.\output\list目錄
Target options ---> C/C++ 中
Preprocessor Symbols中增加USE_STDPERIPH_DRIVER及STM32F10X_MD定義
Include path 設定:
             .\Libraries\CMSIS\CM3\CoreSupport
             .\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x
             .\Libraries\STM32F10x_StdPeriph_Driver\inc
             .\FreeRTOS\Source\include
             .\FreeRTOS\Source\portable\RVDS\ARM_CM3
             .\FreeRTOS\Common\include
             .\user\inc

複製Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm\startup_stm32f10x_md.s
至.\user\src並改檔名為STM32F10x.s
因為我是用STM32F103RB,若是其他容量請自行選對應的startup files
在 __heap_limit 段添加

                IMPORT xPortPendSVHandler
                                        IMPORT xPortSysTickHandler
                                        IMPORT vPortSVCHandler

__Vectors區段中斷向量表將SVCall Handler、PendSV_Handler、SysTick Handler更名改由
RTOS管理,這樣stm32f10x_it.c就不會影響到這三個OD要用到的中斷常駐程式。不過為了方
變我是直接註解比較直覺。

                ;DCD     SVC_Handler                ; SVCall Handler
                DCD     vPortSVCHandler           ; SVCall Handler

                ;DCD     PendSV_Handler             ; PendSV Handler  
                ;DCD     SysTick_Handler            ; SysTick Handler
                DCD     xPortPendSVHandler        ; PendSV Handler
                DCD     xPortSysTickHandler       ; SysTick Handler

Target結構
root ---- startup -----------STM32F10x.s(.\user\src\STM32F10x.s)
     |--- CMSIS ------------ core_cm3.c(.\Libraries\CMSIS\CM3\CoreSuppor)
     |                       system_stm32f10x.c(.\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\)
     |--- Library ---------- stm32f10x_gpio.c(.\Libraries\STM32F10x_StdPeriph_Driver\src\)
     |                       stm32f10x_rcc.c
     |                       stm32f10x_usart.c
     |                       <依需要添加對應的函式庫文件>
     |                       misc.c
     |                       cortexm3_macro_rvds.s(.\FreeRTOS\Common\drivers\ST\STM32F10xFWLib\src\)
     |--- FreeRTOS files --- port.c(.\FreeRTOS\Source\portable\RVDS\ARM_CM3\)
     |                       heap_1.c(.\FreeRTOS\Source\portable\MemMang\)
     |                       list.c(.\FreeRTOS\Source\)
     |                       queue.c
     |                       tasks.c
     |--- user ------------- main.c(.\user\src\)
     |--- user_header -------FreeRTOSConfig.h(.\user\inc\)
     
到這裡設定完成,main.c檔案內容如下,使用的板子是Alientek STM32開發板,用其他的差
別只在周邊設定。跟OS比較無關。因為FreeRTOS使用configTOTAL_HEAP_SIZE為0X4400,IRAM
的SIZE須超過0x4400(17K),選擇STM32要比較注意。STM32F103RBT是20K,所以沒這問題。

/* main.c */
/* Standard includes. */
#include <stdio.h>

/* Scheduler includes. */
#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"
#include "misc.h"


/* Library includes. */
#include "stm32f10x_it.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_usart.h"

#define LED0_ON()   GPIO_ResetBits(GPIOA,GPIO_Pin_8);
#define LED0_OFF()  GPIO_SetBits(GPIOA,GPIO_Pin_8);
#define LED0B()     GPIOA->ODR ^= 0x0100;

#define LED1_ON()   GPIO_ResetBits(GPIOD,GPIO_Pin_2);
#define LED1_OFF()  GPIO_SetBits(GPIOD,GPIO_Pin_2);
#define LED1B()     GPIOD->ODR ^= 0x04;

static void prvSetupHardware( void );

/* Two demo Tasks*/      
static void vLEDTask( void *pvParameters );
static void vCOMMTask( void *pvParameters );

void Led_Init(void);
void Comm_Init(void);

int main( void )
{
        prvSetupHardware();

        xTaskCreate( vLEDTask, ( signed portCHAR * ) "LED", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY+3, NULL );
  xTaskCreate( vCOMMTask, ( signed portCHAR * ) "COMM", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY+2, NULL );

        /* Start the scheduler. */
        vTaskStartScheduler();
       
        return 0;
}
/*-----------------------------------------------------------*/

void vLEDTask( void *pvParameters )
{
    Led_Init();
    LED0_ON();
    LED1_OFF()

        for( ;; )
        {

        LED0B();   
        LED1B();
        vTaskDelay(100/portTICK_RATE_MS);
        }
}

void vCOMMTask( void *pvParameters )
{
    Comm_Init();
    for( ;; )
        {
        USART_SendData(USART1,'@');
        vTaskDelay(1000/portTICK_RATE_MS);
    }
}
/*-----------------------------------------------------------*/

static void prvSetupHardware( void )
{
    SystemInit();
}
/*-----------------------------------------------------------*/

void Led_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
   
    RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOD, ENABLE );

    /*LED0 @ PA8*/
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_Init( GPIOA, &GPIO_InitStructure );   

    /*LED0 @ PD2*/
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_Init( GPIOD, &GPIO_InitStructure );   

}

void Comm_Init(void)
{
    USART_InitTypeDef USART_InitStructure;
    GPIO_InitTypeDef GPIO_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;


    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);  

    /*UART1 TX @ PA9*/
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_Init( GPIOA, &GPIO_InitStructure );   
     
    /*UART1 RX @ PA10*/
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init( GPIOA, &GPIO_InitStructure );   
   
    /*UART1 Cfg.*/
    USART_InitStructure.USART_BaudRate = 57600;  
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    USART_InitStructure.USART_StopBits = USART_StopBits_1;
    USART_InitStructure.USART_Parity = USART_Parity_No;  
    USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    USART_Init(USART1, &USART_InitStructure);
    USART_ClearFlag(USART1, USART_FLAG_TC);

    /*UART1 NIVC Cfg.*/
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
          NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
          NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);

    USART_Cmd(USART1, ENABLE);
}

点击此处下载 ourdev_701950JJ5WM8.rar(文件大小:843K) (原文件名:STM32FreeRTOS.rar)

因為FreeRTOS和3.5的庫文件太大,這兩個目錄是空的,只要把對應的目錄文件複製到對應位置即可。

阿莫论坛20周年了!感谢大家的支持与爱护!!

如果想吃一顿饺子,就得从冰箱里取出肉,剁馅儿,倒面粉、揉面、醒面,擀成皮儿,下锅……
一整个繁琐流程,就是为了出锅时那一嘴滚烫流油的热饺子。

如果这个过程,禁不住饿,零食下肚了,饺子出锅时也就不香了……《非诚勿扰3》

出0入0汤圆

发表于 2011-12-6 08:30:21 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-12-6 08:34:22 | 显示全部楼层
nice,写得很细致。

出0入0汤圆

发表于 2011-12-6 09:25:08 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-12-6 09:29:47 | 显示全部楼层
学习中

出0入0汤圆

发表于 2011-12-6 09:32:51 | 显示全部楼层
Preprocessor Symbols中增加USE_STDPERIPH_DRIVER及STM32F10X_MD定義  

为何 增加USE_STDPERIPH_DRIVER及STM32F10X_MD定義  ???

增加USE_STDPERIPH_DRIVER及STM32F10X_MD定義 的作用是什么???

出0入8汤圆

发表于 2011-12-6 09:45:07 | 显示全部楼层
STM32的PMSM FOC 3.0库里面有一个使用FreeRTOS的Demo,可以拿来参考。



5楼,预编译的配置等同于修改。。。\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\stm32f10x.h文件的宏


#if !defined (STM32F10X_LD) && !defined (STM32F10X_LD_VL) && !defined (STM32F10X_MD) && !defined (STM32F10X_MD_VL) && !defined (STM32F10X_HD) && !defined (STM32F10X_XL) && !defined (STM32F10X_CL)
  /* #define STM32F10X_LD */     /*!< STM32F10X_LD: STM32 Low density devices */
  /* #define STM32F10X_LD_VL */  /*!< STM32F10X_LD_VL: STM32 Low density Value Line devices */  
  /* #define STM32F10X_MD */     /*!< STM32F10X_MD: STM32 Medium density devices */
  /* #define STM32F10X_MD_VL */  /*!< STM32F10X_MD_VL: STM32 Medium density Value Line devices */  
  /* #define STM32F10X_HD */     /*!< STM32F10X_HD: STM32 High density devices */
  #define STM32F10X_XL      /*!< STM32F10X_XL: STM32 XL-density devices */
  /* #define STM32F10X_CL */     /*!< STM32F10X_CL: STM32 Connectivity line devices */
#endif

出0入0汤圆

发表于 2011-12-6 14:55:53 | 显示全部楼层
按照楼主说的配置好了,困扰了很多天的问题解决了,谢谢楼主

出0入0汤圆

发表于 2011-12-7 12:38:29 | 显示全部楼层
;DCD     SVC_Handler                ; SVCall Handler
                DCD     vPortSVCHandler           ; SVCall Handler
                DCD     DebugMon_Handler           ; Debug Monitor Handler
                DCD     0                          ; Reserved
                ;DCD     PendSV_Handler             ; PendSV Handler  
                ;DCD     SysTick_Handler            ; SysTick Handler
                DCD     xPortPendSVHandler        ; PendSV Handler
                DCD     xPortSysTickHandler       ; SysTick Handler
必须按这个顺序配置才不会进入死循环

出0入0汤圆

发表于 2011-12-9 12:58:41 | 显示全部楼层
你好楼主 能联系我吗?我有个问题不能解决,想请你帮忙!QQ 35086744

出0入0汤圆

发表于 2012-3-2 23:38:24 | 显示全部楼层
我的文章对楼主有所帮助我很高兴。。。我就是那个青岛小庄。。。哈哈

出0入0汤圆

发表于 2012-3-4 00:41:25 | 显示全部楼层
我也是看青岛小庄后移植成功的...
就是改6行代码...
比ucOS好多了...

出0入0汤圆

发表于 2012-3-4 19:34:54 | 显示全部楼层
学习一下

出0入0汤圆

发表于 2012-3-6 15:56:11 | 显示全部楼层
freeRTOS的IAR插件没有ucos-ii和mqx做的那么好。
建议楼主研究下MQX 3.8,很完善的RTOS,直接就能在STM32上面跑。

出0入30汤圆

发表于 2012-3-6 17:52:34 | 显示全部楼层
MARK

出0入0汤圆

发表于 2012-3-6 23:01:06 | 显示全部楼层
该顶就顶

出0入0汤圆

发表于 2012-7-4 19:49:52 | 显示全部楼层
看了 资料就一定要顶!!!

出0入0汤圆

发表于 2012-8-30 09:47:08 | 显示全部楼层
这个是我需要的,认真研究!感谢楼主的分享!

出0入0汤圆

发表于 2012-9-1 19:39:49 | 显示全部楼层
进来学习一下!

出0入0汤圆

发表于 2013-3-24 12:10:16 | 显示全部楼层
收藏!有时间再研究。

出0入0汤圆

发表于 2013-3-26 21:35:55 | 显示全部楼层
想移植FreeRTOS, 这个是很好的参考!

出0入0汤圆

发表于 2013-3-28 08:20:53 来自手机 | 显示全部楼层
有时间再研究

出0入0汤圆

发表于 2013-8-31 12:06:52 | 显示全部楼层
支持 学习下

出0入0汤圆

发表于 2013-9-1 00:09:03 | 显示全部楼层
mark 以后备查

出0入0汤圆

发表于 2013-9-13 15:11:33 | 显示全部楼层
收藏!有时间学习下

出0入0汤圆

发表于 2013-9-19 08:55:50 | 显示全部楼层
freertos挺好的,我现在正在用7.5.2版本,可以实现同时等待多个信号量或者序列,真的很好,

出0入0汤圆

发表于 2013-9-19 09:49:45 | 显示全部楼层
向lz学习,用空搞搞RTOS

出0入0汤圆

发表于 2013-9-21 12:34:48 来自手机 | 显示全部楼层
收藏了,,

出0入0汤圆

发表于 2013-9-21 12:44:07 来自手机 | 显示全部楼层
谢谢分享

出0入0汤圆

发表于 2013-10-9 16:13:31 | 显示全部楼层
非常好的文章,学习了。另外,参考其他一些资料,准备自己写一个

出0入0汤圆

发表于 2014-4-17 11:25:42 | 显示全部楼层
非常感谢楼主的分享,写得真的很细致,而且附件中的文件夹也列出来了,真的很nice.

出0入0汤圆

发表于 2014-4-19 11:57:33 | 显示全部楼层
hen bu cuo, thanks

出0入0汤圆

发表于 2014-5-8 21:01:45 | 显示全部楼层
支持开源

出0入0汤圆

发表于 2014-5-18 13:54:33 | 显示全部楼层
mark 学习学习

出0入0汤圆

发表于 2014-9-25 13:30:42 | 显示全部楼层
mark,学习

出0入0汤圆

发表于 2014-9-25 13:35:25 | 显示全部楼层
不错 , 正准备研究一下 Freertos

出0入0汤圆

发表于 2014-9-25 19:55:52 | 显示全部楼层
我也要从0开始啦。。。。。。

出0入0汤圆

发表于 2014-9-27 17:22:18 | 显示全部楼层
FreeRTOS 谢谢楼主

出0入0汤圆

发表于 2014-9-27 17:32:16 | 显示全部楼层
MARK ,学习

出0入0汤圆

发表于 2014-10-15 20:59:40 | 显示全部楼层
mark下。。。

出0入0汤圆

发表于 2014-10-19 22:01:23 | 显示全部楼层
mark下学习。

出0入4汤圆

发表于 2014-10-20 00:44:32 | 显示全部楼层
高手点评,收藏!

出0入0汤圆

发表于 2014-10-20 00:50:13 | 显示全部楼层
不错的贴。顶

出0入0汤圆

发表于 2014-10-21 21:26:19 | 显示全部楼层
时间到了我也好好学习下

出0入0汤圆

发表于 2015-3-3 18:50:45 | 显示全部楼层
谢谢分享,学习下,

出0入0汤圆

发表于 2015-3-30 10:17:10 | 显示全部楼层
FreeRTOS移植 收藏!有时间学习下.

出0入0汤圆

发表于 2015-3-31 18:39:47 | 显示全部楼层
mark!!!!!!!!!!!!!!!!!

出0入0汤圆

发表于 2015-3-31 20:37:27 | 显示全部楼层
学习一下 !

出0入0汤圆

发表于 2016-8-20 11:31:25 | 显示全部楼层
不错,正在学习

出0入0汤圆

 楼主| 发表于 2016-8-21 21:32:04 来自手机 | 显示全部楼层
stm32cube直接內建了。其實不要再花心思移植了。趕快轉到HAL吧!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-28 23:49

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表