點燈點燈點到流水燈
效果圖:
1寄存器
寄存器的功能是存儲二進制代碼,它是由具有存儲功能的觸發器組合起來構成的。一個觸發器可以存儲1位二進制代碼,故存放n位二進制代碼的寄存器,需用n個觸發器來構成。
在計算機領域中,寄存器是CPU內部的元件,包括通用寄存器、專用寄存器和控制寄存器。寄存器擁有非常高的讀寫速度,所以在寄存器之間的數據傳送非常快。
舉一個例子,在殿上,寄存器比如太監,CPU比如皇帝,內存比如大臣,傳送文件,你細品,再細品....
STM32內部的所有寄存器都有唯一的地址
寄存器地址 = 寄存器基地址+偏移地址(偏移量)
比如說查找GPIO F端口模式寄存器的地址,首先通過 《STM32F4xx中文參考手冊》(可在本公眾號后臺點擊->筆記->技術秘籍大全獲取) 找到GPIOF的邊界地址:0x4002 1400,然后再查找GPIO端口模式寄存器 的偏移地址:0x00,最后就得到GPIO F端口模式寄存器的地址0x0x40021400+0x00,其他寄存器也是如此。
2時鐘樹分析
時鐘源:晶振、RC振蕩器
晶振:自身產生時鐘信號,為各種微處理芯片作時鐘參考,晶振相當于這些微處理芯片的心臟,沒有晶振,這些微處理芯片將無法工作。
RC振蕩器:適用于低頻振蕩,一般用于產生1Hz~1MHz的低頻信號。因為對于RC振蕩電路來說,增大電阻R即可降低振蕩頻率,而增大電阻是無需增加成本的
時鐘源用于產生方波時鐘脈沖信號
時鐘頻率是一秒產生方波的計量單位
時鐘頻率(主頻):1GHZ=1000MHZ=1000 000KHZ=1000 000 000HZ
1HZ:1S產生一個方波,1MHZ:1S產生1000 000 方波
1、STM32時鐘源
LSI RC 32KHZ 低速內部振蕩時鐘源
LSE OSC 32.768KHZ 低速外部晶振時鐘源
16MHZ HSI RC 高速內部振蕩時鐘源
4-26MHZ HSE OSC 高速外部晶振時鐘源(本次筆記使用的是晶振8HZ)
2、STM32F407主要的時鐘總線頻率
FCLK,HCLK,PCLK都稱為系統時鐘,但區別如下,
FCLK,提供給CPU內核的時鐘信號,CPU的主頻就是指這個信號;
HCLK,提供給高速總線AHB的時鐘信號;
PCLK,提供給低速總線APB的時鐘信號;
SYSCLK(cpu 主頻) 168MHZ
HCLK 168MHZ
AHB(AHB1 AHB2) 168MHZ
APB1 42MHZ
APB2 84MHZ
3GPIO輸出開發
GPIO:(General-purpose input/output)通用型之輸入輸出的簡稱
STM32F407ZET6板子:
一共有7組IO(ABCDEF)每組IO口有16個引腳,外加2個PH0和PH1(這兩個引腳用于連接晶振)一共有114個IO引腳
每組通用I/O端口包括10個寄存器:
4個32位配置寄存器(GPIOx_MODER、GPIOx_OTYPER、GPIOx_OSPEEDR 和 GPIOx_PUPDR)。
2 個32位數據寄存器(GPIOx_IDR 和 GPIOx_ODR)。
1 個32位置位/復位寄存器 (GPIOx_BSRR)、
1 個32位鎖定寄存器(GPIOx_LCKR)
2 個32位復用功能選擇寄存器(GPIOx_AFRH 和GPIOx_AFRL)。
GPIO工作方式:
4種輸入模式
浮空輸入(沒有上下拉電阻)
上拉輸入(有上拉電阻)
下拉輸入(有下拉電阻)
模擬輸入(模擬信號)
4種輸出模式
開漏輸出(帶上拉或者下拉)
開漏復用功能(帶上拉或者下拉)
推挽式輸出(帶上拉或者下拉)
推挽式復用功能(帶上拉或者下拉)
4種最大輸出速度
2MHZ
25MHZ
50MHZ
100MHZ
補充:
開漏只能輸出0,輸出要靠外部上拉電阻才輸出1(如IIC)
推挽式可輸出1及輸出0
上拉電阻和下拉電阻有什么用?
提高驅動能力:
例如,用單片機輸出高電平,但由于后續電路的影響,輸出的高電平不高,就是達不到VCC,影響電路工作。所以要接上拉電阻。下拉電阻情況相反,讓單片機引腳輸出低電平,結果由于后續電路影響輸出的低電平達不到GND,所以接個下拉電阻。
在單片機引腳電平不定的時候,讓后面有一個穩定的電平:
例如上面接下拉電阻的情況下,在單片機剛上電的時候,電平是不定的,還有就是如果你連接的單片機在上電以后,單片機引腳是輸入引腳而不是輸出引腳,那這時候的單片機電平也是不定的,R18的作用就是如果前面的單片機引腳電平不定的話,強制讓電平保持在低電平。
4LED燈寄存器
(1)理解LED燈原理圖
LED0連接在PF9引腳
PF9輸出VCC(1),燈滅
PF9輸出GND(0),燈亮
引腳電平變化是通過芯片內部(代碼來改變),作為輸出
引腳電平變化是通過芯片外部(按鍵、傳感器....),作為輸入
(2)配置好各個寄存器的地址(上面有提到如何尋找地址)
#define RCC_AHB1ENR *((volatile unsigned int *)(0x40023800+0x30)) //值強制轉化為地址,通過*解引訪問地址空間的值
#define GPIOF_MODER *((volatile unsigned int *)(0x40021400+0x00)) //值強制轉化為地址,通過*解引訪問地址空間的值
#define GPIOF_OTYPER *((volatile unsigned int *)(0x40021400+0x04)) //值強制轉化為地址,通過*解引訪問地址空間的值
#define GPIOF_OSPEEDR *((volatile unsigned int *)(0x40021400+0x08)) //值強制轉化為地址,通過*解引訪問地址空間的值
#define GPIOF_PUPDR *((volatile unsigned int *)(0x40021400+0x0C)) //值強制轉化為地址,通過*解引訪問地址空間的值
#define GPIOF_BSRR *((volatile unsigned int *)(0x40021400+0x18)) //值強制轉化為地址,通過*解引訪問地址空間的值
(3)配置好外設使能寄存器,打開GPIOF組時鐘,也叫做使能F組時鐘(STM32當中外設的時鐘不打開,降低功耗)
//使能GPIO F組時鐘,
RCC_AHB1ENR|= (0x01<<5);
(4)配置好GPIO9組的寄存器
把GPIOF9引腳設置為輸出模式輸出推挽上拉速度
設置GPIOF9引腳對應的是18、19位 ,然后為輸出模式:01,其他寄存器也類似,如圖下所示
void Led_Init(void)
{
//使能GPIO F組時鐘,
RCC_AHB1ENR |= (0x01<<5);
//設置為輸出模式
GPIOF_MODER &= ~(0x01<<19); //19位置0
GPIOF_MODER |= (0x01<<18); //18位置1
//輸出推挽
GPIOF_OTYPER &= ~(0x01<<9); //9位置0
//快速
GPIOF_OSPEEDR |= (0x01<<19); //19位置1
GPIOF_OSPEEDR &= ~(0x01<<18); //18位置0
//上拉
GPIOF_PUPDR &= ~(0x01<<19); //19位置0
GPIOF_PUPDR |= (0x01<<18); //18位置1
}
點燈來了......
通過手冊查找用來點燈的寄存器,就是這個GPIOx_BSRR寄存器
在25位 ,置1,燈會亮
在9位 ,置1,燈會滅
main.c
#include "stm32f4xx.h"
#include "led.h"
#define COUNT 100
//粗延時
void delayms(int n)
{
int i, j;
for(i=0; i
成功點亮一盞燈,至于流水燈,設置好一些燈,然后用延時控制燈的亮與滅
接下來的筆記是庫函數開發,按鍵中斷等等......
-
led燈
+關注
關注
22文章
1592瀏覽量
108108 -
寄存器
+關注
關注
31文章
5357瀏覽量
120634 -
晶振
+關注
關注
34文章
2878瀏覽量
68114 -
觸發器
+關注
關注
14文章
2000瀏覽量
61215 -
STM32F407
+關注
關注
15文章
188瀏覽量
29514
發布評論請先 登錄
相關推薦
評論