博客專欄

EEPW首頁(yè) > 博客 > STM32F103+RT-Thread從零開始(一)——點(diǎn)亮LED

STM32F103+RT-Thread從零開始(一)——點(diǎn)亮LED

發(fā)布人:創(chuàng)客物聯(lián)網(wǎng) 時(shí)間:2019-03-29 來(lái)源:工程師 發(fā)布文章

STM32系列MCU


STM32系列芯片包括F0/F1/F2/F3/F4/F7/L0/L1/L4/H7等系列芯片芯片。不同系列的芯片適用于不同的應(yīng)用場(chǎng)景。 F0/L0基于ARM Cortex-M0,F(xiàn)1/F2/L1系列基于ARM Cortex-M3,F(xiàn)3/F4/L4系列基于ARM Cortex-M4,F(xiàn)7/H7基于ARM Cortex-M7。L系列表示超低功耗,H表示超高性能(對(duì)應(yīng)就是高功耗了),F(xiàn)就是個(gè)折中方案了,性能不錯(cuò),功耗也不高。


其他的先不管,F(xiàn)1系列芯片主要分類如下:


· 超值型STM32F100 - 24 MHz CPU,具有電機(jī)控制和CEC功能· 基本型STM32F101 - 36 MHz CPU,具有高達(dá)1MB的Flash· 連接型STM32F102 – 48 MHz CPU具備USB FS device接口· 增強(qiáng)型STM32F103 - 72 MHz CPU,具有高達(dá)1MB的Flash、電機(jī)控制、USB和CAN· 互聯(lián)型STM32F105/107 - 72 MHz CPU,具有以太網(wǎng)MAC、CAN和USB 2.0 OTGSTM32型號(hào)的說(shuō)明:以STM32F103RBT6這個(gè)型號(hào)的芯片為例,該型號(hào)的組成為7個(gè)部分。


寫寄存器Or利用固件庫(kù)


嵌入式的編程,往下說(shuō)就是操作MCU的寄存器。而固件庫(kù)就是函數(shù)的集合,固件庫(kù)函數(shù)的作用是向下負(fù)責(zé)與寄存器直接打交道,向上提供用戶函數(shù)調(diào)用的接口(API)。相對(duì)于固件庫(kù)的方式,直接寫寄存器的代碼更為簡(jiǎn)潔,只需要對(duì)指定的寄存器進(jìn)行需要的操作就可以了,但是對(duì)于STM32來(lái)說(shuō),寄存器多達(dá)數(shù)百個(gè),記起來(lái)也是一件非常讓人頭疼的事情。ST推出了官方固件庫(kù),固件庫(kù)將這些寄存器底層操作都封裝起來(lái),提供一整套接口,你不需要去知道操作的是哪個(gè)寄存器,你只需要知道調(diào)用哪些函數(shù)即可。 關(guān)于寫寄存器還是利用固件庫(kù)去開發(fā)哪個(gè)好,一直都有爭(zhēng)議,只能說(shuō)存在即為合理,各有各的好處,我個(gè)人比較懶,不太喜歡去記那些寄存器都是啥。再者,我也不是專門搞STM32的,要是用寫寄存器的方式開發(fā)的話,過(guò)一段時(shí)間不弄,再回來(lái)估計(jì)又得花些時(shí)間對(duì)著文檔看了。所以在后續(xù)的博客,我也都會(huì)利用固件庫(kù)開發(fā)。當(dāng)然,用不用是一回事兒,根據(jù)官網(wǎng)技術(shù)文檔,操作寄存器的方式是必須要會(huì)的。 個(gè)人建議,還是需要學(xué)會(huì)看硬件文檔,看官方的技術(shù)資料,而不是遇到問(wèn)題就百度。學(xué)會(huì)看官方的技術(shù)文檔后,遇到問(wèn)題解決起來(lái)將會(huì)事半功倍。


點(diǎn)亮LED


點(diǎn)亮LED,首先自然是安裝Keil了。當(dāng)然,使用其他工具也可以,對(duì)于我來(lái)說(shuō),我還是比較鐘情于Keil。我現(xiàn)在使用的是Keil5,編譯工具鏈為MDK-ARM v5.24。開發(fā)板為淘寶上找的便宜的不能再便宜的一塊STM32C8T6開發(fā)板,引腳都要自己焊。下載線為ST-Link v2。根據(jù)淘寶商提供的硬件資料,這個(gè)板子PB12連接了一個(gè)LED燈,LED另外一端連接了上拉電阻,即LED在PB12低電平時(shí)點(diǎn)亮。


廢話不說(shuō)了,Keil的安裝和破解,網(wǎng)上多的是,隨便找個(gè)教程,走一走就完了。


第一步,創(chuàng)建工程


打開Keil后,首先需要?jiǎng)?chuàng)建個(gè)工程。點(diǎn)擊project->New μVision Project。


填寫工程名


選擇芯片,如果沒(méi)有你要的芯片,就需要到官網(wǎng)上去下載,然后安裝。


選擇需要用到的功能,Core、Startup和GPIO,可以看到下面有警告,GPIO依賴FrameWork和RCC,也要去勾選上就好了。


然后確定,工程就創(chuàng)建成功了。


第二步,增加main.c文件到工程中


點(diǎn)擊如下按鈕,創(chuàng)建一個(gè)新文件,并保存文件到工程目錄中。


點(diǎn)擊工程管理按鈕,管理工程


點(diǎn)擊Add Files 把main.c加入到Source Group 1下,Target 1和Source Group 1都可以修改,改成一個(gè)合適的名字。


第三部,編寫main.c 文件


#include “stm32f10x.h”


#include “stm32f10x_gpio.h”


#include “stm32f10x_rcc.h”


#define CLOCK 72/8


//時(shí)鐘配置,后續(xù)再詳細(xì)捋時(shí)鐘這塊的東西,現(xiàn)在姑且按照這樣設(shè)置這者


void RCC_Configuration(void)


{


ErrorStatus HSEStartUpStatus;


//將RCC寄存器設(shè)置為默認(rèn)值


RCC_DeInit();


//打開外部高速時(shí)鐘


RCC_HSEConfig(RCC_HSE_ON);


//等待外部高速時(shí)鐘晶振起振


HSEStartUpStatus = RCC_WaitForHSEStartUp();


if(HSEStartUpStatus == SUCCESS){


//設(shè)置PLL時(shí)鐘時(shí)鐘源及倍頻系數(shù)


RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_16);


//設(shè)置AHB時(shí)鐘


RCC_HCLKConfig(RCC_SYSCLK_Div1);


//設(shè)置APB1低速時(shí)鐘


RCC_PCLK1Config(RCC_HCLK_Div2);


//設(shè)置APB2高速時(shí)鐘


RCC_PCLK2Config(RCC_HCLK_Div1);


//使能PLL


RCC_PLLCmd(ENABLE);


//等待PLL工作


while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)


{


}


//設(shè)置系統(tǒng)時(shí)鐘為PLL時(shí)鐘


RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);


//等待系統(tǒng)時(shí)鐘切換為PLL時(shí)鐘


while(RCC_GetSYSCLKSource() != 0x08)


{


}


}


//打開需要使用的外設(shè)的時(shí)鐘


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);


}


//延時(shí)微妙


void delay_us(unsigned int us)


{


u8 n;


while(us–)for(n=0;n<CLOCK;n++);


}


int main(){


RCC_Configuration();


//設(shè)置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){


//點(diǎn)亮LED


GPIO_ResetBits(GPIOB,GPIO_Pin_12);


//延時(shí)500ms


delay_us(500000);


//關(guān)閉LED


GPIO_SetBits(GPIOB,GPIO_Pin_12);


//延時(shí)500ms


delay_us(500000);


}


}


第四步,配置并編譯燒寫程序


點(diǎn)擊build按鈕,或者rebuild按鈕進(jìn)行編譯



編譯成功,Build Output輸出如下:


無(wú)錯(cuò)誤,然后可以進(jìn)行程序燒寫,燒寫前需要設(shè)置Options for target。我使用的是ST-Link,所以需要選擇ST-Link Debugger。然后點(diǎn)擊后面的Setting按鈕,進(jìn)行其他設(shè)置。


設(shè)置完畢后點(diǎn)擊download按鈕,進(jìn)行燒寫即可。燒寫時(shí),讓Boot0接低電平。

*博客內(nèi)容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀點(diǎn),如有侵權(quán)請(qǐng)聯(lián)系工作人員刪除。



關(guān)鍵詞:

相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉