事先聲明哦,我也是最近才開始學32的,不過我會盡可能詳細的講解這些小知識點
我們口中常說的LED燈其實是指LED發光二極管,關于這一點涉及到的知識點,我已經在51單片機教程中提及(同點亮LED燈),故而不再詳述。
剛開始接觸STM32的時候,覺得他的操作明顯區別于51,比如我們點亮一個LED燈,直接控制相應的IO口即可;但32不一樣,我們需要先設置時鐘控制寄存器
RCC_APB2ENR|=1<<4; //一共32位
然后設置它的工作方式,輸出速度。
GPIOC_CRL&=~(0x0f<<(4*i)); //控制第i+1個led
GPIOC_CRL|=(3<<(4*i)); //3可以表示為0011,然后在它的前面補零,湊成32位。
//4是因為一個端口由四位控制,見下
最后!我們需要控制端口輸出數據寄存器...
GPIOC_ODR=0<
當然了,這些語句我直接放這里,很多小白肯定看不懂,沒關系呀,這不有我么~
首先:我們看第一段代碼。它用于設置我們的 APB2 外設時鐘使能寄存器,但我們為什么控制它,而不是RCC_APB1ENR?這是因為我所用的開發板中,GPIO_C控制led,而RCC_APB2ENR控制著GPIO口。那為什么我要1<<4呢?這是因為RCC_APB2ENR的位4控制GPIO_C端口;這里有的小伙伴就會有疑問了,1左移4位為什么能夠控制GPIO_C端口呢?這是因為,雖然我賦值1,但是它內部會自動在前面補0,使之為32位,實際上就是0000 0000 0000 0000 0000 0000 0000 0001,左移四位就是:0000 0000 0000 0000 0000 0000 0001 0000.
然后,我們看看第二段代碼。為什么我對GPIOC_CRL操作而不是GPIOC_CRH操作呢?這是因為控制我LED燈的是GPIO_C的低八位,所以我們選擇GPIOC_CRL。但是GPIOC_CRL有32位,它需要控制8個端口,就意味著每4位控制一個端口,而這4個端口分為端口的配置位以及模式位;
在這里,我將MODE設置為11,CNF設置為00。這個過程中,為了不影響其他位,我先將低四位置1,而后取反,即可使低四位為全0,最后通過簡單的數值移位即可。
最后,我們只需要控制相應的引腳輸出低電平即可: GPIOC_ODR = 0 <
按照慣例,我把我的完整代碼也附上~
Tips:我的注釋寫的很詳細哦
#include "stm32f10x.h"
//我們需要控制GPIO的工作模式以及輸出速度,開啟GPIO_C的時鐘
#define i 4 //控制第i+1個led燈點亮
void SystemInit() //初始化
{
}
void delay(unsigned int x)
{
while(x--);
}
int main()
{
RCC_APB2ENR|=1<<4; //第一步,開啟GPIO_C的時鐘
GPIOC_CRL&=~(0x0f<<(4*i)); //這里的&=和前面的|=都是為了減小干擾誤差
//設置工作模式,因為我們需要控制GPIO_C的第一個口,屬于低八位,故而最后一個字母為 L
//GPIOC_CRL有32位,每四位控制一個引腳;兩位的Mode,控制工作方式以及輸出速度;兩位的CNY,控制上拉,下拉之類的
//過程:先將第四位置零:0x0f左移4*0位,也就是沒有移位,雖然0x0f只能表示8位,但我們知道的,他會按照高位自動補位(設置為0)
// 最后取反即可設置低四位全0.
GPIOC_CRL|=(3<<(4*i)); //mode工作方式設置為11,CNY設置為00
//接下來,我們需要控制GPIO_C輸出,所以現在開始設置輸出控制位:
// GPIOC_BSRR(清除寄存器)/GPIOC_ODR(端口輸出數據寄存器)都可以滿足條件,因為我們需要將一個端口置0
GPIOC_ODR=0<
-
led燈
+關注
關注
22文章
1592瀏覽量
108142 -
寄存器
+關注
關注
31文章
5357瀏覽量
120689 -
發光二極管
+關注
關注
13文章
1201瀏覽量
66389 -
STM32
+關注
關注
2270文章
10910瀏覽量
356608 -
時鐘
+關注
關注
11文章
1736瀏覽量
131589
發布評論請先 登錄
相關推薦
評論