您的位置:首頁>正文

STM32打卡003-STM32通過寄存器點亮LED燈

>

一、LED電路

學過C51的童鞋都知道, 通過控制GPIO的電平狀態就可以控制LED燈的點亮與熄滅, C51中通過就是直接控制寄存器, 比如控制P0的GPIO0等於高電平, 通常是P0=0x01, 或者直接操作P0的第一位P0^1=1, 以上都是通過寄存器的方式控制GPIO的狀態。

現在來看看STM32通過寄存器控制LED, 我的開發板的LED有2個, 分別接在PA8和PD2, 硬體上只要GPIO輸出高電平就能熄滅LED, GPIO輸出低電平就能點亮GPIO。

LED電路圖

二、GPIO寄存器配置

GPIO的配置通過有3步, 如下:

●使能IO口時鐘。 配置寄存器RCC_APB2ENR;

●初始化IO口模式, 配置寄存器GPIOx_CRH/CRL;

● 操作IO口輸出高低電平, 配置寄存器GPIOX_ODR或者BSRR/BRR。

1、使能IO時鐘:配置寄存器RCC_APB2ENR

為什麼要使能IO時鐘,

IO有時鐘嗎?C51為啥不用使能, 帶著疑問, 先看下C51的晶片內部結構圖。 C51的GPIO是直接掛在匯流排上的。 如下圖

C51結構圖

再看看STM32的晶片內部結構圖, STM32的GPIO通過了APB2和AHB2, 然後再接到匯流排, AHB和APB又是什麼鬼?2個AHB/APB橋在AHB和2個APB匯流排間提供同步連接。 APB1操作速度限於36MHz, APB2操作於全速(最高72MHz)。

原來是設定這個IO時鐘的!

STM32結構圖

在運行模式下, 任何時候都可以通過停止為外設和記憶體提供時鐘(HCLK和PCLKx)來減少功耗。 為了在睡眠模式下更多地減少功耗, 可在執行WFI或WFE指令前關閉所有外設的時鐘。 通 過 設 置 AHB 外 設 時 鐘 使 能 寄 存 器 (RCC_AHBENR) 、 APB2 外 設 時 鐘 使 能 寄 存 器(RCC_APB2ENR)和APB1外設時鐘使能寄存器(RCC_APB1ENR)來開關各個外設模組的時鐘。

如何設置這個寄存器?這是個32位寄存器, 16-31位保留, 0-15位為可使能位, 從下面可以看出, 第2位控制A組GPIO, 第3位控制B組GPIO, 依次類推, 後面還有控制其他功能的使能位, 比如ADC/SPI/TIM/USART等, 這裡我們用到PA和PD, 因此使能第2位和第5位。

RCC_APB2ENR

寄存器配置為:

RCC->APB2ENR|=1

RCC->APB2ENR|=1

2、初始化IO口模式:配置寄存器GPIOx_CRH/CRL

從C51得知, 再使用GPIO前要初始化下GPIO的裝態。 在C51中, 晶片上電後, GPIO的預設狀態其實是高電平, P0除外, P0內部沒有上拉;而STM32的GPIO狀態, 上一學習說過, 復位後是浮空輸入, 因此我們要配置寄存器設置GPIO狀態, 也就是GPIOx_CRH/CRL。 我們需要配置PA8和PD2, PA8是A組GPIO第8個, 因此需要配置GPIOA_CRH的第0-3位;PD2是D組GPIO第3個, 因此需要配置GPIOD_CRL的第8-11位;

埠配置寄存器配置

3、操作IO口輸出高低電平:配置寄存器GPIOX_ODR或者BSRR/BRR

這裡發現操作GPIO的狀態可以用3種方式

●直接操作輸出資料寄存器GPIOX_ODR;可直接控制GPIO的裝態。

●操作位設置/清除寄存器BSRR;通過清除GPIO的裝態達到控制。

●操作位清除寄存器;通過操作位清除達到控制。

通過運算元據輸出寄存器的代碼如下:

GPIOD->ODR|=1<2>

GPIOD->ODR|=~(1<2)>

深入學習了GPIO,

才能操作更多的外設, 好好加油。

同類文章
Next Article
喜欢就按个赞吧!!!
点击关闭提示