日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

STM32F03寄存器方式点亮LED流水灯

發布時間:2023/12/8 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 STM32F03寄存器方式点亮LED流水灯 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

STM32F03寄存器方式點亮LED流水燈

文章目錄

    • STM32F03寄存器方式點亮LED流水燈
  • 一、題目內容
  • 二、STM32F03系列芯片的地址映射和寄存器映射映射原理;了解GPIO端口的初始化設置三步驟
    • 1、地址映射和寄存器映射原理
    • 2、GPIO端口初始化設置
  • 三、用STM32最小系統核心板STM32F103C8T6+面板板+3只紅綠藍LED 搭建電路,使用GPIOB、GPIOC、GPIOD這3個端口控制LED燈,輪流閃爍,間隔時長1秒。
    • 1、建立工程文件
    • 2、使用寄存器點亮LED燈(代碼部分)
      • (1)硬件連接設計
      • (2)打開之前的工程文件
      • (3)代碼
      • (4)硬件連接
      • (5)燒錄
  • 四、實驗總結
  • 五、參考文獻

一、題目內容

1、學習和理解STM32F103系列芯片的地址映射和寄存器映射原理;了解GPIO端口的初始化設置三步驟(時鐘配置、輸入輸出模式設置、最大速率設置)。
2、以 STM32最小系統核心板(STM32F103C8T6)+面板板+3只紅綠藍LED 搭建電路,使用GPIOB、GPIOC、GPIOD這3個端口控制LED燈,輪流閃爍,間隔時長1秒。
1)寫出程序設計思路,包括GPIOx端口的各寄存器地址和詳細參數;
2)分別用匯編語言,C語言編程實現。

二、STM32F03系列芯片的地址映射和寄存器映射映射原理;了解GPIO端口的初始化設置三步驟

1、地址映射和寄存器映射原理

一、寄存器
寄存器是中央處理器內的組成部分。 寄存器是有限存貯容量的高速存貯部件,它們可用來暫存指令、數據和地址。
簡單來說,寄存器就是存放東西的一個空間器物。寄存器可能存放的是指令、數據或地址。
  存放數據的寄存器是最好理解的,如果你需要讀取一個數據,直接到這個寄存器所在的地方來問問他,數據是多少就行了。問寄存器這個動作,叫做訪問寄存器。不同的數據會存放在不同的寄存器,例如引腳PA2與PB8的高低電平數據(1或0)肯定放在不同的寄存器里,那么怎么區分不同的寄存器呢?通過地址,不同的寄存器有不同的地址,就像老張行李寄存處在101號店鋪,老王行李寄存處在258號店鋪。
  指令、地址寄存器與數據寄存器類似,里邊存放的都是0和1,畢竟單片機也只認識機器碼,機器碼都是0或1,只是特別的規定下,數據寄存器里面存放的0和1表示數據,指令寄存器里存放的表示指令。
二、地址映射和寄存器映射原理
(1)地址映射:由百度詞條可知為了保證CPU執行指令時可正確訪問存儲單元,需將用戶程序中的邏輯地址轉換為運行時由機器直接尋址的物理地址,這一過程稱為地址映射。
(2)寄存器映射:在存儲器的區域單元中,每一個單元對應不同的功能,當我們控制這些單元時就可以驅動外設工作。我們可以找到每個單元的起始地址,然后通過 C 語言指針的操作方式來訪問這些單元,如果每次都是通過這種地址的方式來訪問,不僅不好記憶還容易出錯,這時我們可以根據每個單元功能的不同,以功能為名給這個內存單元取一個別名,這個別名就是我們經常說的寄存器,這個給已經分配好地址的有特定功能的內存單元取別名的過程就叫寄存器映射。

2、GPIO端口初始化設置

(1)GPIO初始化步驟:
第一步:使能GPIOx口的時鐘。
第二步:指明GPIOx口的哪一位,這一位的速度大小以及模式。
第三步:調用GPIOx初始化函數進行初始化。
第四步:調用GPIO-SetBits函數,進行相應位的置位。
(2)實例
單個GPIO端口

GPIO_InitTypeDef GPIO_InitStructure; 第一步:使能GPIOA的時鐘: RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);第二步:設置GPIOA參數:輸出OR輸入,工作模式,端口翻轉速率 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_6| GPIO_Pin_7| GPIO_Pin_8; //設定要操作的管腳 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //設置為推挽輸出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // IO口速度為50MHz第三步:調用GPIOA口初始化函數,進行初始化。 GPIO_Init(GPIOA, &GPIO_InitStructure); //根據設定參數初始化GPIOA第四步:調用GPIO-SetBits函數,進行相應為的置位。 GPIO_SetBits(GPIOA,GPIO_Pin_0); //輸出高

多個GPIO端口

GPIO_InitTypeDef GPIO_InitStructure; 第一步:使能GPIOA,GPIOE的時鐘: RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);第二步:設置GPIOA,GPIOE參數:輸出OR輸入,工作模式,端口翻轉速率 第三步:調用GPIOA口初始化函數,進行初始化。 第四步:調用GPIO-SetBits函數,進行相應為的置位。把第二、三、四步合并分別設置GPIOA和GPIOE 先設置GPIOA GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; // 第四個口,PA4 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //設置為推挽輸出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // IO口速度為50MHz GPIO_Init(GPIOA,&GPIO-InitST); //根據設定參數初始化GPIOA GPIO_SetBits(GPIOA,GPIO_Pin_4); //輸出高再設置GPIOE GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; // 第三個口,PE3 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //設置為推挽輸出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // IO口速度為50MHz GPIO_Init(GPIOE,&GPIO-InitST); //根據設定參數初始化GPIOE GPIO_SetBits(GPIOE,GPIO_Pin_3); //輸出高

三、用STM32最小系統核心板STM32F103C8T6+面板板+3只紅綠藍LED 搭建電路,使用GPIOB、GPIOC、GPIOD這3個端口控制LED燈,輪流閃爍,間隔時長1秒。

1、建立工程文件

新建工程LLight文件,工程名為Light,選擇STM32F103C8
之后彈出的添加庫文件窗口Manage Run-Time Environment,在這個界面,選擇Cancel即可。

我在這里采用startup_stm32f10x_md.s作為啟動文件。我們可以到這個網址去下載:http://www.openedv.com/posts/list/313.htm,
將啟動文件拷貝到Light2工程文件夾下。

我們找到 Target1→Source Group1→雙擊→設置打開文件類型為 Asm Source file→選擇 startup_stm32f10x_hd.s→點擊 Add,如下圖所示:

這里看到的 2 個文件夾:Listings 和 Objects,是 KEIL 自行創建的,用于保存編譯過程中生成的一些文件。
添加完之后,得到如下界面:

為了不讓之后生成的文件顯得混亂,在Light2文件夾下新建一個OBJ文件,用于存放生成的中間文件。
USER 文件夾專門用來存放啟動文件(startup_stm32f10x_md.s)、工程文件(test.uvprojx)等不可缺少的文件,而 OBJ 則用來存放這些編譯過程中產生的中間文件(包括.hex 文件也將存放在這個文件夾里面)。然后把 Listings 和Objects 文件夾里面的東西全部移到 OBJ 文件夾下。
在上面對話框的中間欄,點新建,新建 USER 和 SYSTEM 兩個組。然后點擊 Add Files 按鈕,把 SYSTEM 文件夾三個子文件夾里面的:sys.c、usart.c、delay.c 加入到 SYSTEM 組中。注意:此時 USER 組下還是沒有任何文件,我們只添加SYSTEM的三個。

點擊 OK,退出該界面返回 IDE。
此時界面如圖所示:

接著,我們新建一個 test.c 文件,并保存在 USER 文件夾下。然后雙擊 USER 組,會彈出加載文件的對話框,此時我們在 USER 目錄下選擇 test.c 文件,加入到 USER 組下。

點擊魔法棒,彈出 Options for Target’Target 1’對話框,選擇 Output 選項卡→選中 Create Hex File(用于生成 Hex 文件,后面會用到)→點擊 Select Folder for Objects→找到 OBJ 文件夾→點擊 OK
接著,再設置 Listings 文件路徑,在圖 3.2.16 的基礎上,打開 Listing 選項卡→點擊 Select
Folder for Listings→找到 OBJ 文件夾→點擊 OK

加入sys、delay、usart的include路徑:

接下來我們就可以進行代碼下載和仿真調試了。

2、使用寄存器點亮LED燈(代碼部分)

(1)硬件連接設計

題目要求,使用GPIOB,GPIOC,GPIOD端口來控制LED燈,在查詢C8T6數據手冊后,我選用了PB5,PC4,PD8管腳分別連接紅綠藍三種顏色的燈(由于我只有紅綠黃三個小燈,在之后實際硬件中,會用黃燈代替藍燈)

圖中從 3 個 LED 燈的陽極各經過 1 個限流電阻連接到 3.3V 電源,陰極連接STM32 的 3 個 GPIO 引腳中,所以我們只要控制這三個引腳輸出高低電平,即可控制其所連接 LED 燈的亮滅。
目標是把 GPIO 的引腳設置成推挽輸出模式并且默認下拉,輸出低電平,這樣就能讓 LED 燈亮起來了。
但是之后連電路的時候發現并沒有PD管腳,于是自己改成了PA1,PB0,PB5,只是在推挽輸出、以及聲明時代碼有所不同,其他變化不大。

(2)打開之前的工程文件

接之前步驟。

(3)代碼

在Light2文件夾下新建一個HARDWARE文件夾,用來存儲以后與硬件相關的代碼。

然后我們打開 USER 文件夾下的 test.uvprojx 工程,新建兩個文件,然后保存在HARDWARE→LED 文件夾下面,保存為 led.c,led.h
我們將文件添加到工程中,步驟如下圖:

在魔法棒這里將HARDWARE路徑加進去,否則之后會報錯。

下面來編寫led.c文件,要用到GPIOB、GPIOC、GPIOD則,對應時鐘設置:

在設置完時鐘之后就是配置完時鐘之后,LED_Init 配置了 目標三個端口 PB0 PB5 PA1 的模式為推挽輸出,
并且默認輸出 1。這樣就完成了對這三個 IO 口的初始化。
led.c:

#include "led.h" //初始化 PB1 PC4 PD8為輸出口.并使能這三個口的時鐘 //LED IO 初始化 void LED_Init(void) {RCC->APB2ENR|=1<<2; //使能 PORTA 時鐘 RCC->APB2ENR|=1<<3; //使能 PORTB 時鐘 // RCC->APB2ENR|=1<<4; //使能 PORTC 時鐘 // RCC->APB2ENR|=1<<5; //使能 PORTD 時鐘 GPIOB->CRL&=0XFF0FFFFF; GPIOB->CRL|=0X00300000;//PB.5 推挽輸出 GPIOB->ODR|=1<<5; //PB.5 輸出高 GPIOB->CRL&=0XFFFFFFF0; GPIOB->CRL|=0X00000003;//PB.0 推挽輸出 GPIOB->ODR|=1<<0; //PB.0 輸出高GPIOA->CRL&=0XFFFFFF0F; GPIOA->CRL|=0X00000030;//PA.1 推挽輸出 GPIOA->ODR|=1<<1; //PA.1 輸出高 }

led.h

#ifndef __LED_H #define __LED_H #include "sys.h" //LED 端口定義 #define LED0 PBout(5) // DS0 #define LED1 PBout(0) // DS1 #define LED2 PAout(1) // DS2 void LED_Init(void); //初始化 #endif

在USER文件夾的test.c中撰寫main函數:

#include "sys.h" #include "delay.h" #include "led.h" int main(void) { Stm32_Clock_Init(9); //系統時鐘設置delay_init(72); //延時初始化LED_Init(); //初始化與 LED 連接的硬件接口while(1){LED0=0;LED1=1;LED2=1;delay_ms(1000);LED0=1;LED1=0;LED2=1;delay_ms(1000);LED0=1;LED1=1;LED2=0;delay_ms(1000);} }

代碼包含了#include "led.h"這句,使得 LED0、LED1、LED2、LED_Init 等能在 main 函數里被調用。
接下來,main 函數先調用 Stm32_Clock_Init 函數,配置系統時鐘為 9 倍頻,也就是 8*9=72M(外部晶振是 8Mhz),然后調用 delay_init 函數,初始化延時函數。接著就是調用 LED_Init 來初始化 三個管腳 為輸出。最后在死循環里面實現 LED0 LED1 LED2 交替閃爍,間隔為 1s。

(4)硬件連接

TXD和RXD管腳位置
PA9——TX
PA10——RX
GND------GND
3V3------3V3
務必將boot0設為1,boot1設為0,利用跳線帽實現

(5)燒錄



芯片面包板連好電路后,通電,LED工作。



四、實驗總結

通過這次實驗,學會了流水燈的點亮,這次實驗遇到了很多的問題,但是經過網上參考,問同學,還是將實驗完成,這次實驗收獲還是挺多的。

五、參考文獻

https://blog.csdn.net/asdfg1075511750/article/details/79663568
https://blog.csdn.net/geek_monkey/article/details/86293880
https://blog.csdn.net/qq_46467126/article/details/120791793

總結

以上是生活随笔為你收集整理的STM32F03寄存器方式点亮LED流水灯的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。