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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【STM32】位带原理分析和应用

發(fā)布時間:2024/4/24 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【STM32】位带原理分析和应用 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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)容,希望文章能夠幫你解決所遇到的問題。

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