懶得看 FreeRTOS 專案建置方法的人,我已幫大家建置好了 ,這裡提供 STM32F4 Free RTOS 8.0.0 的工程模板 (專案) 下載點:http://lolikitty.pixnet.net/blog/post/167858043
建置方法(教學影片):
建置方法(文字敘述):
階段一:準備好 STM32F4 基本開發環境
# include "stm32f4xx.h"
int t = 1000000;
void delay(int t2){
int i = 0;
for(; i < t2; i++);
}
int main(void){
GPIO_InitTypeDef g;
g.GPIO_Pin = GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15; // 指定 12,13,14,15 腳
g.GPIO_Mode = GPIO_Mode_OUT; // 設定針腳為輸出
//g.GPIO_PuPd = GPIO_PuPd_UP; // 使用上拉電阻
//g.GPIO_PuPd = GPIO_PuPd_DOWN; // 使用下拉電阻
g.GPIO_Speed = GPIO_Speed_100MHz; // 指定 GPIO 頻率為100 MHz
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE); // 啟用 GPIOD
GPIO_Init(GPIOD, &g); // 初始化 GPIO D
while(1){
GPIO_SetBits(GPIOD,GPIO_Pin_12); // 設定12腳為高電位
delay(t); // 延遲
GPIO_ResetBits(GPIOD,GPIO_Pin_12); // 設定 12 腳為低電位
GPIO_SetBits(GPIOD,GPIO_Pin_13);
delay(t);
GPIO_ResetBits(GPIOD,GPIO_Pin_13);
GPIO_SetBits(GPIOD,GPIO_Pin_14);
delay(t);
GPIO_ResetBits(GPIOD,GPIO_Pin_14);
GPIO_SetBits(GPIOD,GPIO_Pin_15);
delay(t);
GPIO_ResetBits(GPIOD,GPIO_Pin_15);
}
}
2. 將下載回來的 FreeRTOSV8.0.0_Release_Candidate_2.zip 解壓縮至 工程模板中
3. 將
4. 將 *.c 檔案加入至專案中
7. 將以下程式碼複製貼上至專案中,並燒入執行。
// 本範例使用 STM32F407VGT6
//
// 執行結果:
// PD13 每 1000 毫秒 點亮/熄滅 LED 一次
// PD15 每 500 毫秒 點亮/熄滅 LED 一次
#include "FreeRTOS.h"
#include "task.h"
#include "stm32f4xx.h"
// Task priorities: Higher numbers are higher priority.
#define mainTIME_TASK_PRIORITY ( tskIDLE_PRIORITY + 4 )
#define mainTIME2_TASK_PRIORITY ( tskIDLE_PRIORITY + 3 )
#define mainMEMS_TASK_PRIORITY ( tskIDLE_PRIORITY + 2 )
#define mainDEBUG_TASK_PRIORITY ( tskIDLE_PRIORITY + 1 )
#define mainINTEGER_TASK_PRIORITY ( tskIDLE_PRIORITY )
xTaskHandle hTimeTask;
xTaskHandle hTimeTask2;
xTaskHandle hMemsTask;
xTaskHandle hDebugTask;
portTASK_FUNCTION_PROTO( vTimeTask, pvParameters );
portTASK_FUNCTION_PROTO( vTimeTask2, pvParameters );
portTASK_FUNCTION_PROTO( vMemsTask, pvParameters );
portTASK_FUNCTION_PROTO( vDebugTask, pvParameters );
uint64_t u64Ticks=0; // Counts OS ticks (default = 1000Hz).
uint64_t u64IdleTicks=0; // Value of u64IdleTicksCnt is copied once per sec.
uint64_t u64IdleTicksCnt=0; // Counts when the OS has no task to execute.
uint16_t u16PWM1=0;
// 任務一
// ----------------------------------------------------------------------------
void myTask1(){
portTickType xLastWakeTime = xTaskGetTickCount();
while(1){
GPIO_ToggleBits(GPIOD,GPIO_Pin_13);
vTaskDelayUntil( &xLastWakeTime, ( 1000 / portTICK_RATE_MS ) );
}
}
// 任務二
// ----------------------------------------------------------------------------
void myTask2(){
portTickType xLastWakeTime = xTaskGetTickCount();
while(1){
GPIO_ToggleBits(GPIOD,GPIO_Pin_15);
vTaskDelayUntil( &xLastWakeTime, ( 500 / portTICK_RATE_MS ) );
}
}
// 初始化 GPIO
// ----------------------------------------------------------------------------
void GPIOInit(){
GPIO_InitTypeDef g;
g.GPIO_Pin = GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15; // 指定 12,13,14,15 腳
g.GPIO_Mode = GPIO_Mode_OUT; // 設定針腳為輸出
g.GPIO_Speed = GPIO_Speed_100MHz; // 指定 GPIO 頻率為100 MHz
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE); // 啟用 GPIOD
GPIO_Init(GPIOD, &g); // 初始化 GPIO D
}
int main(void){
GPIOInit(); // 初始化 GPIO
// 創建任務一,執行 myTask1 () 涵式。
xTaskCreate( myTask1, (signed char *) "TIME", configMINIMAL_STACK_SIZE,
NULL, mainTIME_TASK_PRIORITY, &hTimeTask );
// 創建任務二,執行 myTask2 () 涵式。
xTaskCreate( myTask2, (signed char *) "TIME", configMINIMAL_STACK_SIZE,
NULL, mainTIME_TASK_PRIORITY, &hTimeTask );
vTaskStartScheduler(); // 開始任務調度
// Will only get here if there was insufficient memory to create
// the idle task.
while(1);
}
// This FreeRTOS callback function gets called once per tick (default = 1000Hz).
// ----------------------------------------------------------------------------
void vApplicationTickHook( void ) {
++u64Ticks;
}
// This FreeRTOS call-back function gets when no other task is ready to execute.
// On a completely unloaded system this is getting called at over 2.5MHz!
// ----------------------------------------------------------------------------
void vApplicationIdleHook( void ) {
++u64IdleTicksCnt;
}
// A required FreeRTOS function.
// ----------------------------------------------------------------------------
void vApplicationMallocFailedHook( void ) {
configASSERT( 0 ); // Latch on any failure / error.
}

前輩您好~ 小弟看到您一系列對於RTOS的教學一文,有很大的興趣想要學習這塊知識, 有在露天看到一些開發板,但是也發現一堆問題我不瞭解,可以請教前輩一些問題, 小弟我一些建議. 我看到開發板有"STM32F407" "STM32F429",雖然都是STM32F系列,但是有什麼不一樣, 若我想要學習前輩您的教學文,來學習您po的文章上的技術,要購買哪種板子比較好, 感謝前輩您~
兩個都可以,但本篇教學我是使用 STM32F407 如果: 1. 你要完全跟著影片做,以降低失敗率,就選 STM32F407 2. 你要體驗強大的硬體 & 液晶螢幕,就選 STM32F429 3. 第一點與第二點兩個都想要? 那就兩片都買吧...
前輩感謝您~ 我會按照前輩您的部落文一步步學習,類似教學實在太少了,剛好有前輩您的教學, 讓我可以好好學習,希望前輩您還能夠多指導一下後輩.
如果我能幫上忙的話,我很樂意。
前輩您好: 看了您的教學有些不懂的地方可以請教您一些問題! 我上網查Free RTOS 是一個迷你操作系統內核的小型嵌入式系統,請問加入這個os 可以做些什麼樣的功能出來!我手邊只有STM32F103大陸萬利電子開發版!謝謝前輩分享許多ARM的資源,謝謝分享教學。
由於平常程式只會 [由上到下] 執行,如果要平行處理的時候該怎麼辦? 必須使用執行緒(線程) 使用作業系統(OS)就是要使CPU多工處理,並且可以使用執行緒(線程) 例如:看影片,實際上是圖片切換 + 聲音 同時撥放 如果我今天只有單線程,我會變成...圖片切換完畢,才開始撥聲音... 這個我想不是大家所期望的... 所以這時就必須安裝作業系統,在單晶片上也是如此 STM32加入OS後可以同時進行:邊閃LED、邊上網、邊撥放影片、邊控制馬達...等等
謝謝前輩的講解,說的也是這樣32位元的MCU沒加入這OS簡直就化身為昂貴8位元單工的C51單晶片 程式只能做完才能做下一個指令,就跟電腦多執行緒 多工 才是大家所要的~不然STM32 IO PORT這麼多引腳 就無法實現它完整功能。 謝謝前輩~讓我受益良多~感謝您~
你好,我剛開始學習如何使用ARM的系統,但是對於很多設定的部分還是有許多的問題,像是我已下載STM32F4 工程模板,使用KeilC去建置以後卻燒不進去板子內,而且我的開發版的驅動程式不知道該去哪裡下載,可否交換個聯絡資料私下聯絡,謝謝。
我的專案檔是要用 KEIL uVision 4 才能跑,最近升級到 5 ,第 5 版我還沒做...
*****
前輩您好: 小弟我目前也在學習這塊開發板,想請教您有STM32F32407的指令集(control reguster、status register......)的datasheet嗎?
前輩您好: 想請問一下如果要在UNITY裡播放影片,但最後又要輸出到行動裝置上的話,程式碼該怎麼寫呢@@因為我上網找了大部分都是寫這個 function Start () { Handheld.PlayFullScreenMovie ("StarWars.mp4", Color.black, FullScreenMovieControlMode.CancelOnInput); } 但這個好像也不行,所以想請教您一下><
前輩你好 如果我只要單純的跑LED(不需FreeRTOS),用你一開始的程式碼在u5上跑要改些什麼呢? 謝謝
純 LED 閃爍可以參考這篇: http://lolikitty.pixnet.net/blog/post/141772135
我想請問一下 我想用運arduino 我現在想做一個 四-六個按鈕 按鈕可以接到arduino上的pin點沒有問題 按對順序可以有output 5v 的機關 那個程式碼不是很會寫他的邏輯 望指教
請問如果我要在第5版的環境執行需要修改哪些部分,可以稍微點一下嗎,謝謝。
前輩你好,拜讀前輩寫的這份資料,感覺受益匪淺,在此先感謝你囉。
照步驟後得error,請問以下是什麼問題? .\Objects\test.axf: Error: L6200E: Symbol SVC_Handler multiply defined (by port.o and stm32f4xx_it.o). .\Objects\test.axf: Error: L6200E: Symbol PendSV_Handler multiply defined (by port.o and stm32f4xx_it.o). .\Objects\test.axf: Error: L6200E: Symbol SysTick_Handler multiply defined (by port.o and stm32f4xx_it.o).
*****
Hi 作者您好: 我最近是買了一塊 STM32F429的開發板, 目前對於架構和更了解STM32F429有點不知道怎麼入門 不知道你有什麼聯絡方式可以和你交流嗎? 謝謝