一、 STM32時(shí)鐘分析
寄存器 :寄存器的功能是存儲(chǔ)二進(jìn)制代碼,它是由具有存儲(chǔ)功能的觸發(fā)器組合起來(lái)構(gòu)成的。一個(gè)觸發(fā)器可以存儲(chǔ)1位二進(jìn)制代碼,故存放n位二進(jìn)制代碼的寄存器,需用n個(gè)觸發(fā)器來(lái)構(gòu)成
在計(jì)算機(jī)領(lǐng)域,寄存器是CPU內(nèi)部的元件,包括通用寄存器、專(zhuān)用寄存器和 控制寄存器 。寄存器擁有非常高的讀寫(xiě)速度,所以在寄存器之間的數(shù)據(jù)傳送非???。
控制寄存器 :相當(dāng)一排可通過(guò)0/1進(jìn)行設(shè)置外設(shè)功能的開(kāi)關(guān),程序中通過(guò)地址查找到對(duì)應(yīng)的寄存器,所以說(shuō)控制寄存器的地址是唯一。
芯片時(shí)鐘:芯片工作時(shí),是需要脈沖,脈沖相當(dāng)于給芯片起振,可保證芯片的正常工作,類(lèi)似于人,心臟正常跳動(dòng),人體生命特征才能正常。
1HZ:一秒產(chǎn)生1個(gè)脈沖
頻率換算單位:
1GHZ = 1000MHZ = 1000 000KHZ = 1000 000 000HZ
STM32時(shí)鐘源
時(shí)鐘源是可以產(chǎn)生器件。
LSIRC 32KHZ | 32 kHz低速內(nèi)部RC (LSI RC) |
---|---|
LSEOSC 32.168KHZ | 32.768 kHz低速外部晶振(LSE晶振) |
16MHZ HSI RC | 16MHZ高速內(nèi)部RC (LSI RC) |
4-26MHZ HSE OSC | 4-26MHZ高速外部晶振(HSE 晶振)粵嵌開(kāi)發(fā)板外部晶振為8MHZ |
注意:外部晶振產(chǎn)生的脈沖是精準(zhǔn), RC振蕩時(shí)鐘產(chǎn)生的脈沖是不精準(zhǔn)
STM32主要總線時(shí)鐘頻率
SYSCLK | 168MHZ |
---|---|
HCLK | 168MHZ |
AHB1/AHB2 | 168MHZ |
APB1 | 42MHZ |
APB2 | 84MHZ |
Al解釋?zhuān)?/p>
在STM32微控制器中,有一些關(guān)鍵的概念需要了解:
- SYSCLK(System Clock):是微控制器系統(tǒng)中的主時(shí)鐘源,它驅(qū)動(dòng)著整個(gè)系統(tǒng),包括CPU、外設(shè)等。SYSCLK的頻率決定了整個(gè)系統(tǒng)的工作速度。
- HCLK(AHB Bus Clock):是系統(tǒng)的主總線時(shí)鐘,它連接了CPU、內(nèi)存、外設(shè)等,用于數(shù)據(jù)傳輸和控制信號(hào)。
- AHB1/AHB2(Advanced High-performance Bus):是高性能總線,用于連接內(nèi)存和一些高性能外設(shè),如DMA控制器、GPIO控制器等。AHB1和AHB2是兩個(gè)不同的總線,它們可以擁有不同的配置和頻率。
- APB1(Advanced Peripheral Bus 1):是高級(jí)外設(shè)總線,用于連接一些低速外設(shè),如定時(shí)器、串口通信等。APB1總線上的外設(shè)可以以較低的頻率工作。
- APB2(Advanced Peripheral Bus 2):是高級(jí)外設(shè)總線,用于連接一些高速外設(shè),如GPIO、SPI、I2C等。APB2總線上的外設(shè)可以以較高的頻率工作。
二、 GPIO分析
1、GPIO
GPIO: GPIO(英語(yǔ):General-purpose input/output),通用型之輸入輸出的簡(jiǎn)稱(chēng)。
GPIO分組
STM32F407ZET6(芯片型號(hào))
- 一共有7組IO口(PA PB PC PD PE PF PG)
- 每組IO口有16個(gè)IO引腳
- 一共16X7=112個(gè)IO引腳
外加2個(gè)PH0和PH1
一共114個(gè)IO口引腳(I:input O:output)
原理圖上GPIO連接與功能說(shuō)明
每組(PA PB PC PD PE PF PG)通用 I/O 端口包括:
?4 個(gè) 32 位配置寄存器(GPIOx_MODER、GPIOx_OTYPER、GPIOx_OSPEEDR 和 GPIOx_PUPDR)。
?2 個(gè) 32 位數(shù)據(jù)寄存器(GPIOx_IDR 和 GPIOx_ODR)。
?1 個(gè) 32 位置位/復(fù)位寄存器 (GPIOx_BSRR)、
?1 個(gè) 32 位鎖定寄存器(GPIOx_LCKR)
?2 個(gè) 32 位復(fù)用功能選擇寄存器(GPIOx_AFRH 和 GPIOx_AFRL)。
GPIO工作方式(寄存器設(shè)置GPIO工作方式)
n4種輸入模式
q浮空輸入(沒(méi)有上下拉電阻)
q上拉輸入(有上拉電阻)
q下拉輸入(有下拉電阻)
q模擬輸入
n4種輸出模式
q開(kāi)漏輸出(帶上拉或者下拉)
q開(kāi)漏復(fù)用功能(帶上拉或者下拉)
q推挽式輸出(帶上拉或者下拉)
q推挽是復(fù)用功能(帶上拉或者下拉)
n4種最大輸出速度
q2MHZ
q25MHZ
q50MHZ
q100MHZ
注意點(diǎn):
開(kāi)漏輸出只能輸出0(低電平),若想出輸出1(高電平),需要外部接上拉電阻(類(lèi)似到51單片機(jī)P0組)。
推挽式輸出可輸出0(低電平)或者1(高電平),這是常用模式
2、寄存器地址查找
寄存器地址 = 寄存組基地址+偏移地址
寄存器查看
三、 LED燈開(kāi)發(fā)
1、理解led燈原理圖
LED0連接在PF9
PF9輸出低電平(0),燈亮;PF9輸出高電平(1),燈滅;
2、打開(kāi)GPIOF組時(shí)鐘
//將第5位置1 使能GPIOF組時(shí)鐘
RCC_AHB1ENR |= (0x01< 5);
3、設(shè)置PF9燈為輸出模式 輸出推挽 上拉 速度(50MHZ)
4、通過(guò)GPIOF_BSRR控制LED燈亮與滅
LED舉例-1
一、led.h
#ifndef __LED_H
#define __LED_H
#include "stm32f4xx.h"
#define RCC_AHB1ENR (*((unsigned int *)(0x40023800+0x30))) //值強(qiáng)制類(lèi)型轉(zhuǎn)為地址,通過(guò)地址解引用,訪問(wèn)地址空間的值
#define GPIOF_MODER (*((unsigned int *)(0x40021400+0x00))) //值強(qiáng)制類(lèi)型轉(zhuǎn)為地址,通過(guò)地址解引用,訪問(wèn)地址空間的值
#define GPIOF_OTYPER (*((unsigned int *)(0x40021400+0x04))) //值強(qiáng)制類(lèi)型轉(zhuǎn)為地址,通過(guò)地址解引用,訪問(wèn)地址空間的值
#define GPIOF_OSPEEDR (*((unsigned int *)(0x40021400+0x08))) //值強(qiáng)制類(lèi)型轉(zhuǎn)為地址,通過(guò)地址解引用,訪問(wèn)地址空間的值
#define GPIOF_PUPDR (*((unsigned int *)(0x40021400+0x0C))) //值強(qiáng)制類(lèi)型轉(zhuǎn)為地址,通過(guò)地址解引用,訪問(wèn)地址空間的值
#define GPIOF_ODR (*((unsigned int *)(0x40021400+0x14))) //值強(qiáng)制類(lèi)型轉(zhuǎn)為地址,通過(guò)地址解引用,訪問(wèn)地址空間的值
#define GPIOF_BSRR (*((unsigned int *)(0x40021400+0x18))) //值強(qiáng)制類(lèi)型轉(zhuǎn)為地址,通過(guò)地址解引用,訪問(wèn)地址空間的值
void Led_Init(void);
#endif
二、led.c
#include "led.h"
/*********************************
引腳說(shuō)明:
LED0 -- PF9
**********************************/
void Led_Init(void)
{
//將第5位置1 使能GPIOF組時(shí)鐘
RCC_AHB1ENR |= (0x01< 5);
//設(shè)置GPIOF9為輸出模式
GPIOF_MODER &= ~(0x01< 19); //19位清0
GPIOF_MODER |= (0x01< 18); //18位置1
//設(shè)置GPIOF9為輸出推挽
GPIOF_OTYPER &= ~(0x01< 9); //9位清0
//設(shè)置GPIOF9為上拉
GPIOF_PUPDR &= ~(0x01< 19); //19位清0
GPIOF_PUPDR |= (0x01< 18); //18位置1
//設(shè)置GPIOF9輸出速度50MHZ
GPIOF_OSPEEDR |= (0x01< 19); //19位置1
GPIOF_OSPEEDR &= ~(0x01< 18); //18位清0
}
三、main.c
#include "stm32f4xx.h"
#include "led.h"
// 延時(shí)函數(shù)
void delay(int n)
{
int i,j;
for(i=0; i< n; i++)
for(j=0; j< 30000; j++);
}
int main(void)
{
Led_Init();
while(1)
{
//BSRR 25位置1 ODR輸出0 燈亮
GPIOF_BSRR |= (0x01< 25);
delay(1000);
//BSRR 9位置1 ODR輸出1 燈滅
GPIOF_BSRR |= (0x01< 9);
delay(1000);
}
return 0;
}
四、作業(yè)拓展
上拉電阻和下拉電阻二者共同的作用是:避免電壓的“懸浮”,造成電路的不穩(wěn)定。
1、概念:將一個(gè)不確定的信號(hào),通過(guò)一個(gè)電阻與電源VCC相連,固定在高電平;通過(guò)一個(gè)電阻與電源GND相連,固定在低電平
2、上拉是對(duì)器件注入電流,灌電流;下拉是對(duì)引腳進(jìn)行分流,拉電流;
3、當(dāng)一個(gè)接有上拉電阻的IO端口設(shè)置為輸入狀態(tài)時(shí),它的常態(tài)為高電平。
LED流水燈舉例-2
一、led.h
#ifndef __LED_H
#define __LED_H
#include "stm32f4xx.h"
#define RCC_AHB1ENR (*((unsigned int *)(0x40023800+0x30))) //值強(qiáng)制類(lèi)型轉(zhuǎn)為地址,通過(guò)地址解引用,訪問(wèn)地址空間的值
#define GPIOF_MODER (*((unsigned int *)(0x40021400+0x00))) //值強(qiáng)制類(lèi)型轉(zhuǎn)為地址,通過(guò)地址解引用,訪問(wèn)地址空間的值
#define GPIOF_OTYPER (*((unsigned int *)(0x40021400+0x04))) //值強(qiáng)制類(lèi)型轉(zhuǎn)為地址,通過(guò)地址解引用,訪問(wèn)地址空間的值
#define GPIOF_OSPEEDR (*((unsigned int *)(0x40021400+0x08))) //值強(qiáng)制類(lèi)型轉(zhuǎn)為地址,通過(guò)地址解引用,訪問(wèn)地址空間的值
#define GPIOF_PUPDR (*((unsigned int *)(0x40021400+0x0C))) //值強(qiáng)制類(lèi)型轉(zhuǎn)為地址,通過(guò)地址解引用,訪問(wèn)地址空間的值
#define GPIOF_ODR (*((unsigned int *)(0x40021400+0x14))) //值強(qiáng)制類(lèi)型轉(zhuǎn)為地址,通過(guò)地址解引用,訪問(wèn)地址空間的值
#define GPIOF_BSRR (*((unsigned int *)(0x40021400+0x18))) //值強(qiáng)制類(lèi)型轉(zhuǎn)為地址,通過(guò)地址解引用,訪問(wèn)地址空間的值
#define GPIOE_MODER (*((unsigned int *)(0x40021000+0x00))) //值強(qiáng)制類(lèi)型轉(zhuǎn)為地址,通過(guò)地址解引用,訪問(wèn)地址空間的值
#define GPIOE_OTYPER (*((unsigned int *)(0x40021000+0x04))) //值強(qiáng)制類(lèi)型轉(zhuǎn)為地址,通過(guò)地址解引用,訪問(wèn)地址空間的值
#define GPIOE_OSPEEDR (*((unsigned int *)(0x40021000+0x08))) //值強(qiáng)制類(lèi)型轉(zhuǎn)為地址,通過(guò)地址解引用,訪問(wèn)地址空間的值
#define GPIOE_PUPDR (*((unsigned int *)(0x40021000+0x0C))) //值強(qiáng)制類(lèi)型轉(zhuǎn)為地址,通過(guò)地址解引用,訪問(wèn)地址空間的值
#define GPIOE_ODR (*((unsigned int *)(0x40021000+0x14))) //值強(qiáng)制類(lèi)型轉(zhuǎn)為地址,通過(guò)地址解引用,訪問(wèn)地址空間的值
#define GPIOE_BSRR (*((unsigned int *)(0x40021000+0x18))) //值強(qiáng)制類(lèi)型轉(zhuǎn)為地址,通過(guò)地址解引用,訪問(wèn)地址空間的值
void Led_Init(void);
void Led0(void);
void Led1(void);
void Led2(void);
void Led3(void);
void Beep(void);
#endif
二、led.c
#include "led.h"
void Led_Init(void)
{
//將第5位置1 使能GPIOF組時(shí)鐘
RCC_AHB1ENR |= (0x01< 5);
//將第4位置1 使能GPIOE組時(shí)鐘
RCC_AHB1ENR |= (0x01< 4);
Led0();
Led1();
Led2();
Led3();
}
/*********************************
引腳說(shuō)明:
LED0 -- PF9
**********************************/
void Led0()
{
//設(shè)置GPIOF9為輸出模式
GPIOF_MODER &= ~(0x01< 19); //19位清0
GPIOF_MODER |= (0x01< 18); //18位置1
//設(shè)置GPIOF9為輸出推挽
GPIOF_OTYPER &= ~(0x01< 9); //9位清0
//設(shè)置GPIOF9為上拉
GPIOF_PUPDR &= ~(0x01< 19); //19位清0
GPIOF_PUPDR |= (0x01< 18); //18位置1
//設(shè)置GPIOF9輸出速度50MHZ
GPIOF_OSPEEDR |= (0x01< 19); //19位置1
GPIOF_OSPEEDR &= ~(0x01< 18); //18位清0
}
/*********************************
引腳說(shuō)明:
LED1 -- PF10
**********************************/
void Led1()
{
//設(shè)置GPIOF10為輸出模式
GPIOF_MODER &= ~(0x01< 21); //21位清0
GPIOF_MODER |= (0x01< 20); //20位置1
//設(shè)置GPIOF9為輸出推挽
GPIOF_OTYPER &= ~(0x01< 10); //10位清0
//設(shè)置GPIOF9為上拉
GPIOF_PUPDR &= ~(0x01< 21); //21位清0
GPIOF_PUPDR |= (0x01< 20); //20位置1
//設(shè)置GPIOF9輸出速度50MHZ
GPIOF_OSPEEDR |= (0x01< 21); //21位置1
GPIOF_OSPEEDR &= ~(0x01< 20); //20位清0
}
/*********************************
引腳說(shuō)明:
LED2 -- PE13
**********************************/
void Led2()
{
//將第4位置1 使能GPIOE組時(shí)鐘
RCC_AHB1ENR |= (0x01< 4);
//設(shè)置GPIOF13為輸出模式
GPIOE_MODER &= ~(0x01< 27); //27位清0
GPIOE_MODER |= (0x01< 26); //26位置1
//設(shè)置GPIOE輸出速度為50MHZ
GPIOE_OSPEEDR |= (0x01< 26); //26位置1
GPIOE_OSPEEDR &= ~(0x01< 27); //27為清0
//設(shè)置GPIOE為上拉
GPIOE_PUPDR &= ~(0x01< 27); //27位清0
GPIOE_PUPDR |= (0x01< 26); //26位置1
//設(shè)置GPIOE為輸出推挽
GPIOE_OTYPER &= ~(0x01< 13); //13位清0
}
/*********************************
引腳說(shuō)明:
LED3 -- PE14
**********************************/
void Led3()
{
//設(shè)置GPIOE14為輸出模式
GPIOE_MODER &= ~(0x01< 29); //29位清0
GPIOE_MODER |= (0x01< 28); //28位置1
//設(shè)置GPIOE輸出速度為50MHZ
GPIOE_OSPEEDR |= (0x01< 28); //28位置1
GPIOE_OSPEEDR &= ~(0x01< 29); //29為清0
//設(shè)置GPIOE為上拉
GPIOE_PUPDR &= ~(0x01< 29); //29位清0
GPIOE_PUPDR |= (0x01< 28); //28位置1
//設(shè)置GPIOE為輸出推挽
GPIOE_OTYPER &= ~(0x01< 14); //14位清0
}
三、main.c
#include "stm32f4xx.h"
#include "led.h"
void delay(int n)
{
int i,j;
for(i=0; i< n; i++)
for(j=0; j< 30000; j++);
}
int main(void)
{
Led_Init();
while(1)
{
//BSRR 25位置1 ODR輸出0 Led0燈亮
GPIOF_BSRR |= (0x01< 25);
delay(1000);
//BSRR 9位置1 ODR輸出1 燈滅
GPIOF_BSRR |= (0x01< 9);
//delay(1000);
//BSRR 26位置1 ODR輸出0 Led1燈亮
GPIOF_BSRR |= (0x01< 26);
delay(1000);
//BSRR 10位置1 ODR輸出1 燈滅
GPIOF_BSRR |= (0x01< 10);
//delay(1000);
//BSRR 29位置1 ODR輸出0 Led2燈亮
GPIOE_BSRR |= (0x01< 29);
delay(1000);
//BSRR 13位置1 ODR輸出1 燈滅
GPIOE_BSRR |= (0x01< 13);
//delay(1000);
//BSRR 30位置1 ODR輸出0 Led3燈亮
GPIOE_BSRR |= (0x01< 30);
delay(1000);
//BSRR 14位置1 ODR輸出1 燈滅
GPIOE_BSRR |= (0x01< 14);
//delay(1000);
//BSRR 24位置1 ODR輸出0 蜂鳴器響
GPIOE_BSRR |= (0x01< 30);
delay(1000);
//BSRR 8位置1 ODR輸出1 蜂鳴器關(guān)
GPIOE_BSRR |= (0x01< 14);
//BSRR 24位置1 ODR輸出0 蜂鳴器響
GPIOF_BSRR |= (0x01< 8);
delay(100);
}
return 0;
}
LED流水燈和蜂鳴器舉例-3
一、beep.h
#ifndef __BEEP_H
#define __BEEP_H
#include "stm32f4xx.h"
#include "led.h"
void Beep_Init(void);
#endif
二、beep.c
#include "beep.h"
/*********************************
引腳說(shuō)明:
Beep -- PF8
**********************************/
void Beep_Init(void)
{
//將第5位置1 使能GPIOF組時(shí)鐘
RCC_AHB1ENR |= (0x01< 5);
//設(shè)置GPIOF8為輸出模式
GPIOF_MODER &= ~(0x03< 16); //16、17位清0
GPIOF_MODER |= (0x01< 16); //16位置1
//設(shè)置GPIOF8為輸出推挽
GPIOF_OTYPER &= ~(0x01< 8); //8位清0
//設(shè)置GPIOF8為下拉
GPIOF_PUPDR &= ~(0x03< 16) ;
//設(shè)置GPIOF8輸出速度100MHZ
GPIOF_OSPEEDR |= (0x01< 17); //17位置1
GPIOF_OSPEEDR |= (0x01< 16); //16位置1
}
三、main.c
#include "stm32f4xx.h"
#include "led.h"
#include "beep.h"
void delay(int n)
{
int i,j;
for(i=0; i< n; i++)
for(j=0; j< 30000; j++);
}
int main(void)
{
Beep_Init();
while(1)
{
//BSRR 24位置1 ODR輸出0 蜂鳴器響
GPIOF_BSRR |= (0x01< 8);
delay(100);
//BSRR 8位置1 ODR輸出1 蜂鳴器關(guān)
GPIOF_BSRR |= (0x01< 24);
delay(1000);
}
return 0;
}
-
寄存器
+關(guān)注
關(guān)注
31文章
5302瀏覽量
119875 -
STM32
+關(guān)注
關(guān)注
2265文章
10858瀏覽量
354425 -
時(shí)鐘
+關(guān)注
關(guān)注
10文章
1716瀏覽量
131295 -
觸發(fā)器
+關(guān)注
關(guān)注
14文章
1995瀏覽量
61015 -
GPIO
+關(guān)注
關(guān)注
16文章
1189瀏覽量
51851
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論