|
之前按照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周年了!感谢大家的支持与爱护!!
你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。
|