0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

STM32時鐘與GPIO分析 基于STM32的LED燈開發(fā)

CHANBAEK ? 來源:Qt歷險記 ? 作者:諾蘇編程 ? 2023-08-22 15:57 ? 次閱讀

一、 STM32時鐘分析

寄存器 :寄存器的功能是存儲二進制代碼,它是由具有存儲功能的觸發(fā)器組合起來構成的。一個觸發(fā)器可以存儲1位二進制代碼,故存放n位二進制代碼的寄存器,需用n個觸發(fā)器來構成

在計算機領域,寄存器是CPU內(nèi)部的元件,包括通用寄存器、專用寄存器和 控制寄存器 。寄存器擁有非常高的讀寫速度,所以在寄存器之間的數(shù)據(jù)傳送非常快。

控制寄存器 :相當一排可通過0/1進行設置外設功能的開關,程序中通過地址查找到對應的寄存器,所以說控制寄存器的地址是唯一。

芯片時鐘:芯片工作時,是需要脈沖,脈沖相當于給芯片起振,可保證芯片的正常工作,類似于人,心臟正常跳動,人體生命特征才能正常。

1HZ:一秒產(chǎn)生1個脈沖

頻率換算單位:

1GHZ = 1000MHZ = 1000 000KHZ = 1000 000 000HZ

STM32時鐘源

時鐘源是可以產(chǎn)生器件。

LSIRC 32KHZ32 kHz低速內(nèi)部RC (LSI RC)
LSEOSC 32.168KHZ32.768 kHz低速外部晶振(LSE晶振)
16MHZ HSI RC16MHZ高速內(nèi)部RC (LSI RC)
4-26MHZ HSE OSC4-26MHZ高速外部晶振(HSE 晶振)粵嵌開發(fā)板外部晶振為8MHZ

注意:外部晶振產(chǎn)生的脈沖是精準, RC振蕩時鐘產(chǎn)生的脈沖是不精準

STM32主要總線時鐘頻率

SYSCLK168MHZ
HCLK168MHZ
AHB1/AHB2168MHZ
APB142MHZ
APB284MHZ

Al解釋:

在STM32微控制器中,有一些關鍵的概念需要了解:

  1. SYSCLK(System Clock):是微控制器系統(tǒng)中的主時鐘源,它驅(qū)動著整個系統(tǒng),包括CPU、外設等。SYSCLK的頻率決定了整個系統(tǒng)的工作速度。
  2. HCLK(AHB Bus Clock):是系統(tǒng)的主總線時鐘,它連接了CPU、內(nèi)存、外設等,用于數(shù)據(jù)傳輸和控制信號。
  3. AHB1/AHB2(Advanced High-performance Bus):是高性能總線,用于連接內(nèi)存和一些高性能外設,如DMA控制器、GPIO控制器等。AHB1和AHB2是兩個不同的總線,它們可以擁有不同的配置和頻率。
  4. APB1(Advanced Peripheral Bus 1):是高級外設總線,用于連接一些低速外設,如定時器、串口通信等。APB1總線上的外設可以以較低的頻率工作。
  5. APB2(Advanced Peripheral Bus 2):是高級外設總線,用于連接一些高速外設,如GPIO、SPI、I2C等。APB2總線上的外設可以以較高的頻率工作。

二、 GPIO分析

1、GPIO

GPIO: GPIO(英語:General-purpose input/output),通用型之輸入輸出的簡稱。

GPIO分組

STM32F407ZET6(芯片型號)

-  一共有7組IO口(PA  PB  PC  PD  PE  PF  PG)

-  每組IO口有16個IO引腳

-  一共16X7=112個IO引腳

外加2個PH0和PH1

一共114個IO口引腳(I:input O:output)

原理圖上GPIO連接與功能說明

圖片

每組(PA PB PC PD PE PF PG)通用 I/O 端口包括:

?4 個 32 位配置寄存器(GPIOx_MODER、GPIOx_OTYPER、GPIOx_OSPEEDR 和 GPIOx_PUPDR)。

?2 個 32 位數(shù)據(jù)寄存器(GPIOx_IDR 和 GPIOx_ODR)。

?1 個 32 位置位/復位寄存器 (GPIOx_BSRR)、

?1 個 32 位鎖定寄存器(GPIOx_LCKR)

?2 個 32 位復用功能選擇寄存器(GPIOx_AFRH 和 GPIOx_AFRL)。

GPIO工作方式寄存器設置GPIO工作方式

n4種輸入模式

q浮空輸入(沒有上下拉電阻

q上拉輸入(有上拉電阻)

q下拉輸入(有下拉電阻)

q模擬輸入

n4種輸出模式

q開漏輸出(帶上拉或者下拉)

q開漏復用功能(帶上拉或者下拉)

q推挽式輸出(帶上拉或者下拉)

q推挽是復用功能(帶上拉或者下拉)

n4種最大輸出速度

q2MHZ

q25MHZ

q50MHZ

q100MHZ

注意點:

開漏輸出只能輸出0(低電平),若想出輸出1(高電平),需要外部接上拉電阻(類似到51單片機P0組)。

推挽式輸出可輸出0(低電平)或者1(高電平),這是常用模式

2、寄存器地址查找

寄存器地址 = 寄存組基地址+偏移地址

圖片

圖片

寄存器查看

圖片

三、 LED燈開發(fā)

1、理解led燈原理圖

LED0連接在PF9

PF9輸出低電平(0),燈亮;PF9輸出高電平(1),燈滅;

圖片

2、打開GPIOF組時鐘

//將第5位置1 使能GPIOF組時鐘
RCC_AHB1ENR |= (0x01< 5);

3、設置PF9燈為輸出模式 輸出推挽 上拉 速度(50MHZ)

4、通過GPIOF_BSRR控制LED燈亮與滅

LED舉例-1

一、led.h

#ifndef __LED_H
#define __LED_H


#include "stm32f4xx.h"





#define RCC_AHB1ENR   (*((unsigned int *)(0x40023800+0x30)))  //值強制類型轉為地址,通過地址解引用,訪問地址空間的值


#define GPIOF_MODER   (*((unsigned int *)(0x40021400+0x00)))  //值強制類型轉為地址,通過地址解引用,訪問地址空間的值
#define GPIOF_OTYPER  (*((unsigned int *)(0x40021400+0x04)))  //值強制類型轉為地址,通過地址解引用,訪問地址空間的值
#define GPIOF_OSPEEDR (*((unsigned int *)(0x40021400+0x08)))  //值強制類型轉為地址,通過地址解引用,訪問地址空間的值
#define GPIOF_PUPDR   (*((unsigned int *)(0x40021400+0x0C)))  //值強制類型轉為地址,通過地址解引用,訪問地址空間的值
#define GPIOF_ODR     (*((unsigned int *)(0x40021400+0x14)))  //值強制類型轉為地址,通過地址解引用,訪問地址空間的值
#define GPIOF_BSRR    (*((unsigned int *)(0x40021400+0x18)))  //值強制類型轉為地址,通過地址解引用,訪問地址空間的值










void Led_Init(void);


#endif

二、led.c

#include "led.h"




/*********************************
引腳說明:


LED0 -- PF9


**********************************/
void Led_Init(void)
{
  //將第5位置1  使能GPIOF組時鐘
  RCC_AHB1ENR |= (0x01< 5);

  //設置GPIOF9為輸出模式
  GPIOF_MODER &= ~(0x01< 19);  //19位清0
  GPIOF_MODER |= (0x01< 18);  //18位置1


  //設置GPIOF9為輸出推挽
  GPIOF_OTYPER &= ~(0x01< 9);  //9位清0

  //設置GPIOF9為上拉
  GPIOF_PUPDR &= ~(0x01< 19);  //19位清0
  GPIOF_PUPDR |= (0x01< 18);  //18位置1  

  //設置GPIOF9輸出速度50MHZ
  GPIOF_OSPEEDR |= (0x01< 19);  //19位置1
  GPIOF_OSPEEDR &= ~(0x01< 18);  //18位清0
}

三、main.c

#include "stm32f4xx.h"
#include "led.h"




// 延時函數(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、概念:將一個不確定的信號,通過一個電阻與電源VCC相連,固定在高電平;通過一個電阻與電源GND相連,固定在低電平

2、上拉是對器件注入電流,灌電流;下拉是對引腳進行分流,拉電流;

3、當一個接有上拉電阻的IO端口設置為輸入狀態(tài)時,它的常態(tài)為高電平。

圖片

LED流水燈舉例-2

一、led.h

#ifndef __LED_H
#define __LED_H


#include "stm32f4xx.h"





#define RCC_AHB1ENR   (*((unsigned int *)(0x40023800+0x30)))  //值強制類型轉為地址,通過地址解引用,訪問地址空間的值


#define GPIOF_MODER   (*((unsigned int *)(0x40021400+0x00)))  //值強制類型轉為地址,通過地址解引用,訪問地址空間的值
#define GPIOF_OTYPER  (*((unsigned int *)(0x40021400+0x04)))  //值強制類型轉為地址,通過地址解引用,訪問地址空間的值
#define GPIOF_OSPEEDR (*((unsigned int *)(0x40021400+0x08)))  //值強制類型轉為地址,通過地址解引用,訪問地址空間的值
#define GPIOF_PUPDR   (*((unsigned int *)(0x40021400+0x0C)))  //值強制類型轉為地址,通過地址解引用,訪問地址空間的值
#define GPIOF_ODR     (*((unsigned int *)(0x40021400+0x14)))  //值強制類型轉為地址,通過地址解引用,訪問地址空間的值
#define GPIOF_BSRR    (*((unsigned int *)(0x40021400+0x18)))  //值強制類型轉為地址,通過地址解引用,訪問地址空間的值


#define GPIOE_MODER   (*((unsigned int *)(0x40021000+0x00)))  //值強制類型轉為地址,通過地址解引用,訪問地址空間的值
#define GPIOE_OTYPER  (*((unsigned int *)(0x40021000+0x04)))  //值強制類型轉為地址,通過地址解引用,訪問地址空間的值
#define GPIOE_OSPEEDR (*((unsigned int *)(0x40021000+0x08)))  //值強制類型轉為地址,通過地址解引用,訪問地址空間的值
#define GPIOE_PUPDR   (*((unsigned int *)(0x40021000+0x0C)))  //值強制類型轉為地址,通過地址解引用,訪問地址空間的值
#define GPIOE_ODR     (*((unsigned int *)(0x40021000+0x14)))  //值強制類型轉為地址,通過地址解引用,訪問地址空間的值
#define GPIOE_BSRR    (*((unsigned int *)(0x40021000+0x18)))  //值強制類型轉為地址,通過地址解引用,訪問地址空間的值






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組時鐘
  RCC_AHB1ENR |= (0x01< _AHB1ENR |= (0x01< *********************************
引腳說明:


LED0 -- PF9


**********************************/
void Led0()
{
  //設置GPIOF9為輸出模式 
  GPIOF_MODER &= ~(0x01< MODER |= (0x01< _OTYPER &= ~(0x01< PUPDR &= ~(0x01< _PUPDR |= (0x01< OSPEEDR |= (0x01< _OSPEEDR &= ~(0x01< *********************************
引腳說明:


LED1 -- PF10


**********************************/
void Led1()
{
  //設置GPIOF10為輸出模式
  GPIOF_MODER &= ~(0x01< MODER |= (0x01< _OTYPER &= ~(0x01< PUPDR &= ~(0x01< _PUPDR |= (0x01< OSPEEDR |= (0x01< _OSPEEDR &= ~(0x01< *********************************
引腳說明:


LED2 -- PE13


**********************************/
void Led2()
{
  //將第4位置1  使能GPIOE組時鐘
  RCC_AHB1ENR |= (0x01< MODER &= ~(0x01< _MODER |= (0x01< OSPEEDR |= (0x01< _OSPEEDR &= ~(0x01< PUPDR &= ~(0x01< _PUPDR |= (0x01< OTYPER &= ~(0x01< *******************************
引腳說明:


LED3 -- PE14


**********************************/
void Led3()
{
  //設置GPIOE14為輸出模式
  GPIOE_MODER &= ~(0x01< MODER |= (0x01< _OSPEEDR |= (0x01< OSPEEDR &= ~(0x01< _PUPDR &= ~(0x01< PUPDR |= (0x01< _OTYPER &= ~(0x01< 

三、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  蜂鳴器關
    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"




/*********************************
引腳說明:


Beep -- PF8


**********************************/




void Beep_Init(void)
{
  //將第5位置1  使能GPIOF組時鐘
  RCC_AHB1ENR |= (0x01< _MODER &= ~(0x03< MODER |= (0x01< _OTYPER &= ~(0x01< PUPDR &= ~(0x03< _OSPEEDR |= (0x01< OSPEEDR |= (0x01< 

三、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  蜂鳴器關
    GPIOF_BSRR |= (0x01< 24);
    delay(1000);
  }


  return 0;
}
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 寄存器
    +關注

    關注

    31

    文章

    5359

    瀏覽量

    120780
  • STM32
    +關注

    關注

    2270

    文章

    10914

    瀏覽量

    356727
  • 時鐘
    +關注

    關注

    11

    文章

    1739

    瀏覽量

    131624
  • 觸發(fā)器
    +關注

    關注

    14

    文章

    2000

    瀏覽量

    61255
  • GPIO
    +關注

    關注

    16

    文章

    1214

    瀏覽量

    52215
收藏 人收藏

    評論

    相關推薦

    使用STM32 HAL庫進行GPIO控制的實例

    在基于STM32微控制器的嵌入式系統(tǒng)開發(fā)中,GPIO(GeneralPurposeInput/Output)控制是其中最基本、最常見的操作之一。通過使用STM32的HAL庫,可以輕松地
    的頭像 發(fā)表于 12-21 15:22 ?3599次閱讀

    采用STM32上一個GPIO口來控制對應的一個LED的點亮和熄滅

    實驗一 單個LED的閃爍1.1系統(tǒng)功能實現(xiàn)對STM32開發(fā)板上單個LED的循環(huán)點亮與熄滅,使
    發(fā)表于 12-15 06:08

    STM32GPIO使用

    分享本文,介紹STM32GPIO使用。
    的頭像 發(fā)表于 09-03 09:28 ?4515次閱讀

    STM32單片機學習】第四課:GPIO控制LED(用寄存器編程)

    GPIO點亮熄滅LED13.5.5.寫代碼控制GPIO點亮熄滅LED23.5.6.STM32時鐘設置函數(shù)移植與講解13.5.7.
    發(fā)表于 11-14 15:36 ?0次下載
    【<b class='flag-5'>STM32</b>單片機學習】第四課:<b class='flag-5'>GPIO</b>控制<b class='flag-5'>LED</b>(用寄存器編程)

    STM32-GPIO

    GPIO被分成很多組,每組有16個引腳,所有的GPIO引腳都有基本的輸入輸出功能。最基本的輸出功能是由STM32控制引腳輸出高、低電平,實現(xiàn)開關控制,如把GPIO引腳接入
    發(fā)表于 11-22 19:51 ?10次下載
    <b class='flag-5'>STM32-GPIO</b>篇

    STM32F103_IOT物聯(lián)網(wǎng)開發(fā)板學習專欄3_STM32F103控制LED

    STM32F103_IOT物聯(lián)網(wǎng)開發(fā)板學習專欄3_STM32F103控制LED
    發(fā)表于 12-03 17:51 ?7次下載
    <b class='flag-5'>STM32</b>F103_IOT物聯(lián)網(wǎng)<b class='flag-5'>開發(fā)</b>板學習專欄3_<b class='flag-5'>STM32</b>F103控制<b class='flag-5'>LED</b><b class='flag-5'>燈</b>

    STM32 LED位帶操作控制(以STM32F429為例)

    /*LED0GPIO口以及引腳,時鐘的宏定義,用于LED的初始化*/#define
    發(fā)表于 12-04 21:06 ?10次下載
    <b class='flag-5'>STM32</b> <b class='flag-5'>LED</b><b class='flag-5'>燈</b>位帶操作控制(以<b class='flag-5'>STM32</b>F429為例)

    STM32F103點亮LED

    點亮LED,需要用到GPIO端口。為了點亮LED,需要三個步驟:打開GPIO口的
    發(fā)表于 12-07 09:51 ?16次下載
    <b class='flag-5'>STM32</b>F103點亮<b class='flag-5'>LED</b><b class='flag-5'>燈</b>

    STM32開發(fā)板學習1 NUCLEO-L476RG:GPIO例程 點亮LED2

    STM32開發(fā)板學習1 NUCLEO-L476RG:GPIO例程 點亮LED2
    發(fā)表于 12-08 15:36 ?31次下載
    【<b class='flag-5'>STM32</b>】<b class='flag-5'>開發(fā)</b>板學習1 NUCLEO-L476RG:<b class='flag-5'>GPIO</b>例程 點亮<b class='flag-5'>LED</b>2<b class='flag-5'>燈</b>

    6 . STM32 GPIO介紹

    連接起來,從而實現(xiàn)與外部通訊、控制以及數(shù)據(jù)采集的功能。不過GPIO 最簡單的應用還屬點亮LED 了,只需通過軟件控制GPIO 輸出高低電平即可。當然
    發(fā)表于 12-24 19:08 ?2次下載
    6 . <b class='flag-5'>STM32</b> <b class='flag-5'>GPIO</b>介紹

    stm32控制led

    stm32控制LEDGPIO初始化配置void GPIO_Config(void)
    發(fā)表于 12-24 19:23 ?18次下載
    <b class='flag-5'>stm32</b>控制<b class='flag-5'>led</b><b class='flag-5'>燈</b>

    STM32F103LED流水燈

    STM32系列。所有的資料都可以在野火官網(wǎng)上下載野火資料下載中心二、點燈點亮LED,需要用到GPIO端口。為了點亮LED
    發(fā)表于 01-12 19:57 ?4次下載
    <b class='flag-5'>STM32F103LED</b>流水燈

    STM32庫函數(shù)開發(fā)-GPIO

    ” 的學習STM32,實際操作過程中知識盲區(qū)比想象中要多很多!只做了兩個GPIO口項目。實戰(zhàn)一 · I/O口1. 文件夾結構USERsystem_stm32f10x.c 系統(tǒng)時鐘初始
    發(fā)表于 01-13 16:17 ?14次下載
    <b class='flag-5'>STM32</b>庫函數(shù)<b class='flag-5'>開發(fā)</b>-<b class='flag-5'>GPIO</b>

    STM32G0開發(fā)筆記:LED示例

    使用Platformio平臺的libopencm3開發(fā)框架來開發(fā)STM32G0,下面為LED示例。
    的頭像 發(fā)表于 01-17 10:52 ?1448次閱讀
    <b class='flag-5'>STM32</b>G0<b class='flag-5'>開發(fā)</b>筆記:<b class='flag-5'>LED</b><b class='flag-5'>燈</b>示例

    STM32F407-點亮LED

    點亮LED需要首先初始化。這塊STM32F4開發(fā)板的LED共有4個,都是鏈接到GPIO上的。
    發(fā)表于 06-07 16:46 ?2283次閱讀
    <b class='flag-5'>STM32</b>F407-點亮<b class='flag-5'>LED</b><b class='flag-5'>燈</b>