1. 程式人生 > >STM32F103+RTT從零開始(一)——點亮LED

STM32F103+RTT從零開始(一)——點亮LED

最近心血來潮,打算重新撿起老本行,結果發現很多都忘記了。乾脆重新開始學習,並做個從零開始的筆記了。

STM32系列MCU

STM32系列晶片包括F0/F1/F2/F3/F4/F7/L0/L1/L4/H7等系列晶片晶片。不同系列的晶片適用於不同的應用場景。
F0/L0基於ARM Cortex®-M0,F1/F2/L1系列基於ARM Cortex®-M3,F3/F4/L4系列基於ARM Cortex®-M4,F7/H7基於ARM Cortex®-M7。L系列表示超低功耗,H表示超高效能(對應就是高功耗了),F就是個折中方案了,效能不錯,功耗也不高。

其他的先不管,F1系列晶片主要分類如下:

  • 超值型STM32F100 - 24 MHz CPU,具有電機控制和CEC功能
  • 基本型STM32F101 - 36 MHz CPU,具有高達1MB的Flash
  • 連線型STM32F102 – 48 MHz CPU具備USB FS device介面
  • 增強型STM32F103 - 72 MHz CPU,具有高達1MB的Flash、電機控制、USB和CAN
  • 互聯型STM32F105/107 - 72 MHz CPU,具有乙太網MAC、CAN和USB 2.0 OTG

STM32型號的說明:以STM32F103RBT6這個型號的晶片為例,該型號的組成為7個部分,其命名規則如下:
這裡寫圖片描述

具體資訊可查閱網站

RTT作業系統

官網的簡介:

RT-Thread是一款來自中國的開源嵌入式實時作業系統,由國內一些專業開發人員從2006年開始開發、維護,除了類似FreeRTOS和UCOS的實時作業系統核心外,也包括一系列應用元件和驅動框架,如TCP/IP協議棧,虛擬檔案系統,POSIX介面,圖形使用者介面,FreeModbus主從協議棧,CAN框架,動態模組等,因為系統穩定,功能豐富的特性被廣泛用於新能源,電網,風機等高可靠性行業和裝置上,已經被驗證是一款高可靠的實時作業系統。
RT-Thread實時作業系統遵循GPLv2+許可證,實時作業系統核心及所有開源元件可以免費在商業產品中使用,不需要公佈應用原始碼,沒有任何潛在商業風險。

RT-Thread作業系統原始碼風格與linux一致,在官方提供的原始碼中,包含有諸多晶片的工程示例,LPC系列和STM32F系列的很多。再者RT-Thread程式碼開源,又有那麼詳細的資料,如果遇到官方bsp下沒有的晶片,對於動手能力強的同學,自己動手移植也比較方便。而且官方提供了詳細的中文文件,對於英語不太好的同學簡直就是一個福音。而且,RT-Thread提供了豐富的元件,使用者可以非常方便的實現諸如GUI、網路協議棧、Modbus甚至是SQLite資料庫等功能。後續使用的時候再細細體會它的強大之處了。

寫暫存器Or利用韌體庫

嵌入式的程式設計,往下說就是操作MCU的暫存器。而韌體庫就是函式的集合,韌體庫函式的作用是向下負責與暫存器直接打交道,向上提供使用者函式呼叫的介面(API)。相對於韌體庫的方式,直接寫暫存器的程式碼更為簡潔,只需要對指定的暫存器進行需要的操作就可以了,但是對於STM32來說,暫存器多達數百個,記起來也是一件非常讓人頭疼的事情。ST推出了官方韌體庫,韌體庫將這些暫存器底層操作都封裝起來,提供一整套介面,你不需要去知道操作的是哪個暫存器,你只需要知道呼叫哪些函式即可。
關於寫暫存器還是利用韌體庫去開發哪個好,一直都有爭議,只能說存在即為合理,各有各的好處,我個人比較懶,不太喜歡去記那些暫存器都是啥。再者,我也不是專門搞STM32的,要是用寫暫存器的方式開發的話,過一段時間不弄,再回來估計又得花些時間對著文件看了。所以在後續的部落格,我也都會利用韌體庫開發。當然,用不用是一回事兒,根據官網技術文件,操作暫存器的方式是必須要會的。
個人建議,還是需要學會看硬體文件,看官方的技術資料,而不是遇到問題就百度。學會看官方的技術文件後,遇到問題解決起來將會事半功倍。

點亮LED

點亮LED,首先自然是安裝Keil了。當然,使用其他工具也可以,對於我來說,我還是比較鍾情於Keil。我現在使用的是Keil5,編譯工具鏈為MDK-ARM v5.24。開發板為淘寶上找的便宜的不能再便宜的一塊STM32C8T6開發板,引腳都要自己焊。下載線為ST-Link v2。根據淘寶商提供的硬體資料,這個板子PB12連線了一個LED燈,LED另外一端連線了上拉電阻,即LED在PB12低電平時點亮。
開發板和燒寫器

廢話不說了,Keil的安裝和破解,網上多的是,隨便找個教程,走一走就完了。

第一步,建立工程

開啟Keil後,首先需要建立個工程。點選project->New μVision Project。
這裡寫圖片描述
填寫工程名
這裡寫圖片描述
選擇晶片,如果沒有你要的晶片,就需要到官網上去下載,然後安裝。
這裡寫圖片描述
選擇需要用到的功能,Core、Startup和GPIO,可以看到下面有警告,GPIO依賴FrameWork和RCC,也要去勾選上就好了。
這裡寫圖片描述
然後確定,工程就建立成功了。

第二步,增加main.c檔案到工程中

點選如下按鈕,建立一個新檔案,並儲存檔案到工程目錄中。
這裡寫圖片描述
點選工程管理按鈕,管理工程
這裡寫圖片描述
點選Add Files 把main.c加入到Source Group 1下,Target 1和Source Group 1都可以修改,改成一個合適的名字。
這裡寫圖片描述

第三部,編寫main.c 檔案

#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"

#define CLOCK 72/8

//時鐘配置,後續再詳細捋時鐘這塊的東西,現在姑且按照這樣設定這者
void RCC_Configuration(void)   
{   
    ErrorStatus HSEStartUpStatus;   
    //將RCC暫存器設定為預設值
    RCC_DeInit(); 
    //開啟外部高速時鐘
    RCC_HSEConfig(RCC_HSE_ON);
    //等待外部高速時鐘晶振起振
    HSEStartUpStatus = RCC_WaitForHSEStartUp();
    if(HSEStartUpStatus == SUCCESS){
        //設定PLL時鐘時鐘源及倍頻係數   
        RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_16);
        //設定AHB時鐘
        RCC_HCLKConfig(RCC_SYSCLK_Div1); 
        //設定APB1低速時鐘
        RCC_PCLK1Config(RCC_HCLK_Div2);
        //設定APB2高速時鐘
        RCC_PCLK2Config(RCC_HCLK_Div1); 
        //使能PLL
        RCC_PLLCmd(ENABLE);
        //等待PLL工作
        while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)    
        {   
        } 
        //設定系統時鐘為PLL時鐘
        RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
        //等待系統時鐘切換為PLL時鐘
        while(RCC_GetSYSCLKSource() != 0x08)    
        {   
        }   
    }
    //開啟需要使用的外設的時鐘
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB |   
    RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE, ENABLE);  
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);   
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE); 
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);   
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);   
}

//延時微妙
void delay_us(unsigned int us)
{
    u8 n;           
    while(us--)for(n=0;n<CLOCK;n++);     
}

int main(){
    RCC_Configuration();
    //設定GPIOB12 為推輓輸出模式,速度為2MHz
    GPIO_InitTypeDef gpioInit;
    gpioInit.GPIO_Mode=GPIO_Mode_Out_PP;
    gpioInit.GPIO_Pin=GPIO_Pin_12;
    gpioInit.GPIO_Speed=GPIO_Speed_2MHz;
    GPIO_Init(GPIOB,&gpioInit);

    while(1){
        //點亮LED
        GPIO_ResetBits(GPIOB,GPIO_Pin_12);
        //延時500ms
        delay_us(500000);
        //關閉LED
        GPIO_SetBits(GPIOB,GPIO_Pin_12);
        //延時500ms
        delay_us(500000);
    }

}

第四步,配置並編譯燒寫程式

點選build按鈕,或者rebuild按鈕進行編譯
這裡寫圖片描述
編譯成功,Build Output輸出如下:
這裡寫圖片描述

無錯誤,然後可以進行程式燒寫,燒寫前需要設定Options for target。我使用的是ST-Link,所以需要選擇ST-Link Debugger。然後點選後面的Setting按鈕,進行其他設定。
這裡寫圖片描述這裡寫圖片描述
這裡寫圖片描述
這裡寫圖片描述

設定完畢後點擊download按鈕,進行燒寫即可。燒寫時,讓Boot0接低電平。
這裡寫圖片描述