【STM32】位带原理分析和应用
00. 目錄
文章目錄
- 00. 目錄
- 01. 位帶概述
- 02. 位帶操作
- 03. 位帶C語言實現(xiàn)
- 04. 應(yīng)用示例一
- 05. 應(yīng)用示例二
- 06. 附錄
- 07. 聲明
01. 位帶概述
位帶操作簡單的說,就是把每個比特膨脹為一個 32 位的字,當(dāng)訪問這些字的時候就達到了訪問比特的目的,比如說 GPIO 的 ODR 寄存器有 32 個位,那么可以映射到 32 個地址上,我們?nèi)ピL問這 32 個地址就達到訪問 32 個比特的目的。這樣我們往某個地址寫 1 就達到往對應(yīng)比特位寫 1 的目的,同樣往某個地址寫 0 就達到往對應(yīng)的比特位寫 0 的目的。
支持了位帶操作后,可以使用普通的加載、存儲指令來對單一的比特進行讀寫。在CM3中,有兩個區(qū)中實現(xiàn)了位帶。其中一個是 SRAM 區(qū)的最低 1MB 范圍,第二個則是片內(nèi)外設(shè)區(qū)的最低 1MB 范圍。這兩個區(qū)中的地址除了可以像普通的 RAM 一樣使用外,它們還都有自
己的“位帶別名區(qū)”,位帶別名區(qū)把每個比特膨脹成一個 32 位的字。當(dāng)你通過位帶別名區(qū)訪問這些字時,就可以達到訪問原始比特的目的。
02. 位帶操作
SRAM 區(qū)中的位帶地址映射
對于片上外設(shè),映射關(guān)系如下表所示
03. 位帶C語言實現(xiàn)
//位帶操作,實現(xiàn)51類似的GPIO控制功能 //IO口操作宏定義 #define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2)) #define MEM_ADDR(addr) *((volatile unsigned long *)(addr)) #define BIT_ADDR(addr, bitnum) MEM_ADDR(BITBAND(addr, bitnum)) //IO口地址映射 #define GPIOA_ODR_Addr (GPIOA_BASE+20) //0x40020014 #define GPIOB_ODR_Addr (GPIOB_BASE+20) //0x40020414 #define GPIOC_ODR_Addr (GPIOC_BASE+20) //0x40020814 #define GPIOD_ODR_Addr (GPIOD_BASE+20) //0x40020C14 #define GPIOE_ODR_Addr (GPIOE_BASE+20) //0x40021014 #define GPIOF_ODR_Addr (GPIOF_BASE+20) //0x40021414 #define GPIOG_ODR_Addr (GPIOG_BASE+20) //0x40021814 #define GPIOH_ODR_Addr (GPIOH_BASE+20) //0x40021C14 #define GPIOI_ODR_Addr (GPIOI_BASE+20) //0x40022014 #define GPIOA_IDR_Addr (GPIOA_BASE+16) //0x40020010 #define GPIOB_IDR_Addr (GPIOB_BASE+16) //0x40020410 #define GPIOC_IDR_Addr (GPIOC_BASE+16) //0x40020810 #define GPIOD_IDR_Addr (GPIOD_BASE+16) //0x40020C10 #define GPIOE_IDR_Addr (GPIOE_BASE+16) //0x40021010 #define GPIOF_IDR_Addr (GPIOF_BASE+16) //0x40021410 #define GPIOG_IDR_Addr (GPIOG_BASE+16) //0x40021810 #define GPIOH_IDR_Addr (GPIOH_BASE+16) //0x40021C10 #define GPIOI_IDR_Addr (GPIOI_BASE+16) //0x40022010 //IO口操作,只對單一的IO口! //確保n的值小于16! #define PAout(n) BIT_ADDR(GPIOA_ODR_Addr,n) //輸出 #define PAin(n) BIT_ADDR(GPIOA_IDR_Addr,n) //輸入 #define PBout(n) BIT_ADDR(GPIOB_ODR_Addr,n) //輸出 #define PBin(n) BIT_ADDR(GPIOB_IDR_Addr,n) //輸入 #define PCout(n) BIT_ADDR(GPIOC_ODR_Addr,n) //輸出 #define PCin(n) BIT_ADDR(GPIOC_IDR_Addr,n) //輸入 #define PDout(n) BIT_ADDR(GPIOD_ODR_Addr,n) //輸出 #define PDin(n) BIT_ADDR(GPIOD_IDR_Addr,n) //輸入 #define PEout(n) BIT_ADDR(GPIOE_ODR_Addr,n) //輸出 #define PEin(n) BIT_ADDR(GPIOE_IDR_Addr,n) //輸入#define PFout(n) BIT_ADDR(GPIOF_ODR_Addr,n) //輸出 #define PFin(n) BIT_ADDR(GPIOF_IDR_Addr,n) //輸入#define PGout(n) BIT_ADDR(GPIOG_ODR_Addr,n) //輸出 #define PGin(n) BIT_ADDR(GPIOG_IDR_Addr,n) //輸入#define PHout(n) BIT_ADDR(GPIOH_ODR_Addr,n) //輸出 #define PHin(n) BIT_ADDR(GPIOH_IDR_Addr,n) //輸入#define PIout(n) BIT_ADDR(GPIOI_ODR_Addr,n) //輸出 #define PIin(n) BIT_ADDR(GPIOI_IDR_Addr,n) //輸入04. 應(yīng)用示例一
LED循環(huán)亮1秒 滅1秒
led.h文件
#ifndef __LED_H__ #define __LED_H__#include "sys.h"//LED初始化 void LED_Init(void);//位帶操作 #define LED1 PFout(9) #define LED2 PFout(10)#endif /*__LED_H__*/led.c文件
#include "led.h"//LED初始化 void LED_Init(void) {GPIO_InitTypeDef gpio_InitTypeDef;gpio_InitTypeDef.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;gpio_InitTypeDef.GPIO_Mode = GPIO_Mode_OUT;gpio_InitTypeDef.GPIO_Speed = GPIO_Speed_100MHz;gpio_InitTypeDef.GPIO_OType = GPIO_OType_PP;gpio_InitTypeDef.GPIO_PuPd = GPIO_PuPd_UP;//使能時鐘RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);//GPIO初始化GPIO_Init(GPIOF, &gpio_InitTypeDef);//設(shè)置高電平 LED滅GPIO_SetBits(GPIOF, GPIO_Pin_9 | GPIO_Pin_10); }main.c文件
#include "stm32f4xx.h"#include "delay.h" #include "led.h"int main(void) { delay_init(168);LED_Init();//3. LED閃爍while(1){//滅LED1 = 1;LED2 = 1;delay_ms(1000);//亮LED1 = 0;LED2 = 0;delay_ms(1000);} }05. 應(yīng)用示例二
流水燈
main.c文件
#include "stm32f4xx.h"#include "delay.h" #include "led.h"int main(void) { delay_init(168);LED_Init();//3. LED閃爍while(1){//滅LED1 = 0;LED2 = 1;delay_ms(1000);//亮LED1 = 1;LED2 = 0;delay_ms(1000);} }06. 附錄
6.1 【STM32】STM32系列教程匯總
網(wǎng)址:【STM32】STM32系列教程匯總
07. 聲明
該教程參考了正點原子的《STM32 F4 開發(fā)指南》
與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的【STM32】位带原理分析和应用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【STM32】GPIO之LED
- 下一篇: 【STM32】GPIO之蜂鸣器