前言
本文分別通過庫函數(shù)、寄存器以及位操作完成跑馬燈實(shí)驗(yàn),使用的開發(fā)板是正點(diǎn)原子的min核心板。
一、庫函數(shù)
1.1?硬件連接
圖1?LED 與 STM32 連接原理圖
?通過min板的原理圖可以看出兩個(gè)LED燈分別接到PD2和PA8引腳,并且LED燈是共陽極,當(dāng)IO口輸出高電平,LED滅;輸出低電平,LED亮。
在實(shí)際的程序編程中我們需要用到GPIO文件也就是stm32f10x_gpio.h和stm32f10x_gpio.c,來操作對應(yīng)IO口。同時(shí)我們需要設(shè)置時(shí)鐘就要用到stm32f10x_rcc.c與其頭文件進(jìn)行時(shí)鐘使能。
1.2 GPIO庫函數(shù)介紹
-
重要函數(shù)
1個(gè)初始化函數(shù):
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);
主要用途是用來初始化GPIO口的狀態(tài)
第一個(gè)參數(shù)是一個(gè)結(jié)構(gòu)體類型變量,指定哪組IO口,第二個(gè)同樣是一個(gè)結(jié)構(gòu)體類型變量,它共有三個(gè)變量,第一個(gè)指定哪個(gè)IO口,第二個(gè)指定速度,第三個(gè)指定Mode模式。
GPIO_Init函數(shù)初始化樣例:
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;//IO口速度為50MHz
GPIO_Init(GPIOB,&GPIO_InitStructure); //根據(jù)設(shè)定參數(shù)初始化為GPIOB.5
2個(gè)讀取輸入電平函數(shù):
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, unit16_t GPIO_Pin);
作用:讀取某個(gè)GPIO的輸入電平。實(shí)際操作的是GPIOx_IDR寄存器。
例如:
GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_5);//讀取GPIOA.5的輸入電平
uint16_t GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
作用:讀取某個(gè)GPIO的輸入電平。實(shí)際操作的是GPIOx_IDR寄存器。
例如:
GPIO_ReadInputData(GPIOA);//讀取GPIOA組中所有io口輸入電平
2個(gè)讀取輸出電平函數(shù):
uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);
上面兩個(gè)函數(shù)的作用與讀取輸入電平大致相同,不同處在于這里讀取的是某組或某個(gè)GPIO的輸出電平。實(shí)際操作的是GPIO_ODR寄存器。
4個(gè)設(shè)置輸出電平函數(shù):
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
作用:設(shè)置某個(gè)IO口輸出為高電平(1)。實(shí)際操作BSRR寄存器。
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
作用:設(shè)置某個(gè)IO口輸出為低電平(0)。實(shí)際操作BRR寄存器。
void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);
這兩個(gè)函數(shù)不常用,也是用來設(shè)置IO口輸出電平。
所有的函數(shù)都是在主函數(shù)中設(shè)置寄存器的值,例如SetBits使用了BSRR,ResetBit使用了BRR寄存器。
1.3 跑馬燈程序
庫函數(shù)——步驟:
- 使能IO口時(shí)鐘。調(diào)用函數(shù)RCC_APB2PeriphColckCmd();? ? ? ?
????????不同的IO組,調(diào)用的始終使能函數(shù)不一樣。
- 初始化IO口模式。調(diào)用函數(shù)GPIO_Init();
- 操作IO口,輸出高低電平。
? ? ? ? GPIO_SetBits();
? ? ? ? GPIO_ResetBits();
注意:操作IO口之前,必須使能對應(yīng)的時(shí)鐘位。
在項(xiàng)目中新建一個(gè)HAREWARE文件夾,在其中新建程序文件夾,創(chuàng)建對應(yīng)c文件與頭文件,例如led.h與LED.c,在led.h頭文件中定義LED_Init函數(shù)。
注意這里需要將對應(yīng)頭文件路徑加入項(xiàng)目中來。以下是本次程序LED.c的代碼內(nèi)容,實(shí)現(xiàn)兩個(gè)LED燈初始化。
?接下來在USER文件夾中編寫main函數(shù),
?編寫完后利用flymcu燒錄至開發(fā)板中,兩個(gè)LED燈將同時(shí)點(diǎn)亮,間隔500毫秒后又同時(shí)熄滅,循環(huán)往復(fù)。
二、寄存器
2.1 硬件連接
連接如庫函數(shù)。
2.2 跑馬燈程序
寄存器——步驟:
- 使能IO口時(shí)鐘。配置寄存器RCC_APB2ENR;
- 初始化IO口模式。配置寄存器GPIOx_CRH/CRL;
- 操作IO口,輸出高低電平。配置寄存器GPIOX_ODR或者BSRR/BRR。
2.2.1 使能IO口時(shí)鐘
?
?mini板的LED引腳分別為PA8和PD2,所以選擇配置寄存器RCC_APB2ENR的位5和位2如上面原理圖所示。
同樣在項(xiàng)目中新建HAREWARE文件夾,其余操作步驟如庫函數(shù),在led.h頭文件中定義LED_Init函數(shù),首先我們需要操作RCC寄存器,它的定義在stm23f10x.h中,可以看到定義中使用RCC結(jié)構(gòu)體指針定義了所有寄存器,在代碼中我們將RCC指向APB2ENR來操作寄存器。
2.2.2 初始化IO口模式
?接下來操作端口配置寄存器,我們需要用GPIOx結(jié)構(gòu)體指針指向該寄存器,配置為通用推挽輸出模式,最大速度50MHz,對應(yīng)到寄存器的每一個(gè)位是0011B,實(shí)際代碼中先將對應(yīng)位清零再進(jìn)行配置,調(diào)用GPIOx的ODR寄存器,拉高需要操作的相應(yīng)位。
2.2.3 操作IO口
?main.c里面把stm32f10x.h、delay.h、led.h頭文件包含進(jìn)來,主函數(shù)中調(diào)用delay_init和LED_Init初始化函數(shù),隨后進(jìn)入while死循環(huán),在死循環(huán)中同樣可以直接用ODR寄存器對LED進(jìn)行操作。
?
?程序編寫完畢后燒錄至開發(fā)板實(shí)現(xiàn)跑馬燈功能。
三、位操作
3.1 位操作基本原理
位操作原理:
把每個(gè)比特膨脹為一個(gè)32位的字,當(dāng)訪問這些字的時(shí)候就達(dá)到了訪問比特的目的,比如說BSRR寄存器有32個(gè)位,那么可以映射到32個(gè)地址上,我們?nèi)ピL問(讀-改-寫)這32個(gè)地址就達(dá)到訪問32個(gè)比特的目的。
哪些區(qū)域支持位操作:
?
?由于位帶區(qū)一個(gè)位對應(yīng)32位的地址,所以位帶區(qū)1MB對應(yīng)別名區(qū)32MB。
?映射關(guān)系:
-
位帶區(qū):支持位帶操作的地址區(qū)
-
位帶別名:對別名地址的訪問最終作用到位帶區(qū)的訪問上
3.2 硬件連接
硬件連接與前兩個(gè)方法相同。
3.3?跑馬燈程序
具體的代碼實(shí)現(xiàn)里面,實(shí)際上運(yùn)用的就是映射關(guān)系,比如要操作PA,就會(huì)宏定義一個(gè)PAout()函數(shù),他的原理實(shí)際上就是在操作ODR寄存器,相應(yīng)的,PAin()函數(shù)就是操作IDR寄存器,所有方法的最終原理都是操作寄存器,這是永恒不變的。
//IO口地址映射
#define GPIOA_ODR_Addr (GPIOA_BASE+12) //0x4001080c
//IO口操作,針對單一IO口
#define PAout(n) BIT_ADDR(GPIOA_ODR_Addr,n) //輸出
#define PAin(n) BIT_ADDR(GPIOA_IDR_Addr,n) //輸入
位操作——步驟:
- 使能IO口時(shí)鐘。調(diào)用函數(shù)RCC_APB2PeriphColckCmd();
- 初始化IO口模式。調(diào)用函數(shù)GPIO_Init();
- 操作IO口,輸出高低電平。使用位帶操作。
大體上位操作的步驟和庫函數(shù)相同,其使用的模板與庫函數(shù)相同。
3.3.1 使能IO口時(shí)鐘
與庫函數(shù)版本程序代碼相同。
3.3.2 初始化IO口模式
與庫函數(shù)版本程序代碼相同。
3.3.3 操作IO口
文章來源:http://www.zghlxwxcb.cn/news/detail-740455.html
在這里只需要通過宏定義的位帶函數(shù)操作LED燈即可。文章來源地址http://www.zghlxwxcb.cn/news/detail-740455.html
到了這里,關(guān)于STM32入門——三種編寫跑馬燈程序的方法的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!