本文不特殊說明都以stc32f103c8為例,軟體平台為keil5v5.15
首先這次我們用暫存器直接點亮led燈
led電路圖如下圖:
可以看出如果需要點亮一盞led燈只需要io口輸出高電平即可,本次以gpiob為例子。
點亮led燈
控制io輸出高電平通常需要三步:
1.開啟時鐘:因為stm32為了節約消耗,故上電時候外設時鐘預設不開啟。故我們需要開始gpio的時鐘。
2.設定gpio輸出模式:stm32f103提供了4種輸出模式和3種輸出速度:
- 通用輸出推挽
- 通用輸出開漏
- 復用輸出推挽:串列埠輸出
- 復用輸出開漏:iic
推挽輸出電路如下圖:
兩個三極體都是半個週期導通,輪流導通。從而減低了功耗,提高了每個管的承受能力。又由於不論走哪一路,管子導通電阻都很小,使rc常數很小,轉變速度很快。因此,推拉式輸出級既提高電路的負載能力,又提高開關速度。所以推挽輸出可以輸出高低電平,但輸出幅度取決於輸入,不可控。
開漏輸出電路如下圖:
從圖中可以看出,當沒有上拉電平和上拉電阻,當in輸出低電平時候,out輸出低電平,當in輸出高電平時,out處於開漏狀態,電平狀態未知,當加上拉電阻時候,則上拉電平跟上拉電阻有關。
開漏輸出相當於三極體集電極,故它只能輸出低電平,需要接上拉電阻才能得到高電平。開漏是用來連線不同電平的器件。很好的乙個優點是通過改變上拉電源的電壓,便可以改變傳輸電平。比如加上上拉電阻就可以提供ttl/cmos電平輸出等。(上拉電阻的阻值決定了邏輯電平轉換的沿的速度 。阻值越大,速度越低功耗越小,所以負載電阻的選擇要兼顧功耗和速度。)
而且可以將多個開漏輸出的管腳,連線到一條線上。通過乙隻上拉電阻,在不增加任何器件的情況下,形成「與邏輯」關係。這也是i2c,smbus等匯流排判斷匯流排占用狀態的原理。
3.輸出高電平
暫存器設定
1.設定時鐘暫存器
首先gpio是掛載在apb2匯流排上的,apb2時鐘使能暫存器為rcc_apb2enr,如下圖
故只需開啟gpiob的時鐘,即將rcc_apb2enr第3位置1
2.設定io口輸出狀態
有關暫存器為gpiob_crl和gpiob_crh,如下圖:
可以看出只需要設定modex[1:0]即可,我們可將他置01,設定成中速即可,則預設為推挽輸出
3.設定io口輸出電平
因為暫存器可以寫和讀,故可以直接置1即可。
注意事項:
1.需要提前設定相關匯流排和暫存器位址,如下表:
2.初學者為了簡單,通常都操作gpiox_odr暫存器,但實際上我還是推薦使用gpiox_bsrr暫存器,因為bsrr只有寫操作,和odr要經歷讀——寫操作,時間顯然慢很多,而且使用bsrr不會被中斷打斷。
以下附**(燈接gpiob_8~15)
/*定義相關暫存器位址*/
#define gpiob_odr *(unsigned int *)(0x40010c00+0x0c)
#define gpiob_crh *(unsigned int *)(0x40010c00+0x04)
#define rcc_apb2enr *(unsigned int *)(0x40021000+0x18)
/*延時函式*/
void delay()
}int main()
for(i = 0;i<7;i++)}}
複製**
2 點亮第一盞LED燈
對微控制器的控制,其實就是對i 0口的控制。15系列微控制器最多有p0 p7八個8位雙向輸入輸出埠 p5除外 比賽所用的iap15f2k61s2僅用到p0 p4五組i 0口。注 新增.c檔案到工程中,否則程式設計不能通過。對keil的幾項設定 標頭檔案中stc15f2k60s2.h中已包含了位定義 ...
學習記錄 STM32點亮LED實驗
使用藍橋杯ct117e板子 使用stm32標準庫檔案 1.初始化gpio埠 使能相應埠的時鐘 gpio inittypedef gpio init gpioc rcc apb2periphclockcmd rcc apb2periph gpioc,enable gpio init gpioc.gpi...
STM32點亮乙個LED
圖 i o埠位的基本結構 stm32f103c8t6共有2組gpio埠 pa pb,每組16個埠。每個埠有兩個32位配置暫存器 gpiox crl,gpiox crh 兩個32位資料暫存器 gpiox idr,gpiox odr 乙個32位置位 復位暫存器 gpiox bsrr 乙個16位復位暫存器...