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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

简单操作stm32f10xIO端口配置

發(fā)布時間:2023/12/18 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 简单操作stm32f10xIO端口配置 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

stm32f10x IO端口的配置
STM32 的 IO 口
可以由軟件配置成如下 8 種模式:
1、輸入浮空
2、輸入上拉
3、輸入下拉
4、模擬輸入
5、開漏輸出
6、推挽輸出
7、推挽式復用功能
8、開漏復用功能

STM32 的每個 IO 端口都有 7 個寄存器來控制。他們分別是:配置模式的 2 個 32 位的端口配置寄存器 CRL 和 CRH;2 個 32 位的數(shù)據(jù)寄存器 IDR 和 ODR;1 個 32 位的置位/復位寄存器BSRR;一個 16 位的復位寄存器 BRR;1 個 32 位的鎖存寄存器 LCKR。CRL 和 CRH 控制著每個 IO 口的模式及輸出速率。

端口低配置寄存器 CRL :

該寄存器的復位值為 0X44444444,復位值其實就是配置端口為浮空輸入模式。STM32 的 CRL 控制著每組 IO 端口(A~G)的低 8 位的模式。
每個 IO 端口的位占用 CRL 的 4 個位,高兩位為 CNF,低兩位為 MODE。這里我們可以記住幾個常用的配置,比如 0X0 表示模擬輸入模式(ADC 用)、0X3 表示推挽輸出模式(做輸出口用,50M 速率)、0X8 表示上/下拉輸入模式(做輸入口用)、0XB 表示復用輸出(使用 IO 口的第二功能,50M 速率)。
CRH 的作用和 CRL 完全一樣,只是 CRL 控制的是低 8 位輸出口,而 CRH 控制的是高 8位輸出口。下面我們了解一下怎樣通過固件庫設置 GPIO的相關參數(shù)和輸出。
GPIO 相關的函數(shù)和定義分布在固件庫文件 stm32f10x_gpio.c 和頭文件 stm32f10x_gpio.h 文件中。
在固件庫開發(fā)中,操作寄存器 CRH 和 CRL 來配置 IO 口的模式和速度是通過 GPIO 初始化函數(shù)完成:

void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)

這個函數(shù)有兩個參數(shù),第一個參數(shù)是用來指定 GPIO,取值范圍為 GPIOA~GPIOG。第二個參數(shù)為初始化參數(shù)結構體指針,結構體類型為 GPIO_InitTypeDef。下面我們看看這個結構體的定義 我學的是正點原子,參考標準庫函數(shù)例程,找到 FWLib 組下面的 stm32f10x_gpio.c文件,定位到 GPIO_Init 函數(shù)體處,雙擊入口參數(shù)類型 GPIO_InitTypeDef 后右鍵選擇“Go todefinition of …”可以查看結構體的定義:

typedef struct{ uint16_t GPIO_Pin;GPIOSpeed_TypeDef GPIO_Speed;GPIOMode_TypeDef GPIO_Mode;}GPIO_InitTypeDef;

通過初始化結構體初始化 GPIO 的常用格式是:

GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //LED0-->PB.5 端口配置 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽輸出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度 50MHz GPIO_Init(GPIOB, &GPIO_InitStructure);//根據(jù)設定參數(shù)配置 GPIO

第二個成員變量 GPIO_Mode 是用來設置對應 IO 端口的輸出輸入模式,在 MDK 中是通過一個枚舉類型定義的:

typedef enum { GPIO_Mode_AIN = 0x0, //模擬輸入 GPIO_Mode_IN_FLOATING = 0x04, //浮空輸入 GPIO_Mode_IPD = 0x28, //下拉輸入 GPIO_Mode_IPU = 0x48, //上拉輸入 GPIO_Mode_Out_OD = 0x14, //開漏輸出 GPIO_Mode_Out_PP = 0x10, //通用推挽輸出 GPIO_Mode_AF_OD = 0x1C, //復用開漏輸出 GPIO_Mode_AF_PP = 0x18 //復用推挽 }GPIOMode_TypeDef;

第3個成員變量 IO 口速度設置,有三個可選值,在 MDK 中同樣是通過枚舉類型定義:

typedef enum { GPIO_Speed_10MHz = 1, GPIO_Speed_2MHz, GPIO_Speed_50MHz }GPIOSpeed_TypeDef;

IDR 是一個端口輸入數(shù)據(jù)寄存器,只用了低 16 位。該寄存器為只讀寄存器且只能以16 位的形式讀出。

在固件庫中操作 IDR 寄存器讀取 IO 端口數(shù)據(jù)是通GPIO_ReadInputDataBit 函數(shù)實現(xiàn)的:

uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)

ODR 是一個端口輸出數(shù)據(jù)寄存器,也只用了低 16 位。該寄存器為可讀寫,從該寄存器讀出來的數(shù)據(jù)可以用于判斷當前 IO 口的輸出狀態(tài)。而向該寄存器寫數(shù)據(jù),則可以控制某個 IO 口的輸出電平。

在固件庫中設置 ODR 寄存器的值來控制 IO 口的輸出狀態(tài)是通過函數(shù)GPIO_Write 來實現(xiàn)的:

void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);

BSRR 寄存器是端口位設置/清除寄存器。該寄存器和 ODR 寄存器具有類似的作用,都可以用來設置 GPIO 端口的輸出位是 1 還是 0。

假如設置 GPIOA 的第 1 個端口值為 1,那么只需要往寄存器 BSRR 的低 16 位對應位寫 1 :

GPIOA->BSRR=1<<1;

假如設置 GPIOA 的第 1 個端口值為 0,只需要往寄存器高 16 位對應為寫 1 :

GPIOA->BSRR=1<<(16+1)

該寄存器往相應位寫 0 是無影響的,所以我們要設置某些位,我們不用管其他位的值。
BRR 寄存器是端口位清除寄存器。該寄存器的作用跟 BSRR 的高 16 位雷同,在 STM32 固件庫中,通過 BSRR 和 BRR 寄存器設置 GPIO 端口輸出是通過函數(shù)GPIO_SetBits()和函數(shù) GPIO_ResetBits()來完成的。

void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)

GPIO 相關的函數(shù),雖然 IO 操作步驟很簡單,這里我們做個概括性
的總結,操作步驟為:
1) 使能 IO 口時鐘。調(diào)用函數(shù)為 RCC_APB2PeriphClockCmd()。
2) 初始化 IO 參數(shù)。調(diào)用函數(shù) GPIO_Init();
3) 操作 IO。

總結

以上是生活随笔為你收集整理的简单操作stm32f10xIO端口配置的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。