搜档网
当前位置:搜档网 › stm32位带操作详细说明

stm32位带操作详细说明

stm32位带操作详细说明
stm32位带操作详细说明

stm32位带操作介绍

在CM3中,有两个区中实现了位带。其中一个是SRAM 区的最低1MB 范围,第二个则是片内外设区的最低1MB 范围。这两个区中的地址除了可以像普通的RAM 一样使用外,它们还都有自己的“位带别名区”,位带别名区把每个比特膨胀成一个32 位的字。当你通过位带别名区访问这些字时,就可以达到访问原始比特的目的。

在位带区中,每个比特都映射到别名地址区的一个字(这是只有LSB 有效的字)。当一个别名地址被访问时,会先把该地址变换成位带地址。对于读操作,读取位带地址中的一个字,再把需要的位右移到LSB,并把LSB 返回。对于写操作,把需要写的位左移至对应的

位序号处,然后执行一个原子的“读-改-写”过程。

支持位带操作的两个内存区的范围是:

0x2000_0000‐0x200F_FFFF(SRAM 区中的最低1MB)

0x4000_0000‐0x400F_FFFF(片上外设区中的最低1MB)

位带(Bit-band)操作是Cortex-M3提供的特殊操作:位带区的每个位都有位带别名区的一个字与之对应。Bit-band区域的存储器以32位方式进行访问,其中有效的仅仅是BIT0位,只有BIT0的值才对应到相应的普通区域的比特位上,其他位无效。STM32F系列芯片为所有外设寄存器和SRAM提供相对应的Bit-band区域,以简化对外设寄存器和SRAM的操作位带操作最重要的一环就是寻址,即为需要操作的“目标位”找到位带别名区相对应的地址:位带别名区首地址+(操作字节的偏移量*32) +(操作位的偏移量*4)

内置SRAM区的位带别名区首地址= 0x2200,0000

外设寄存器区的位带别名区首地址= 0x4200,0000

例如:GPIOA的端口输出数据寄存器地址0x4001080c(stm32f1xx系列),对于PA.0来

说控制其输出电平的比特位的位带操作地址为:

0x42000000+(0x1080c*32)+(0*4) = 0x42021018

以stm32f207为例,介绍stm32的位带操作。

在《ARM Cortex M3权威指南》92页介绍了如何在C语言中使用位带操作。个人在使用位带操作过程中将其大致总结为三种:

①查找需要定义的位所在的地址,将地址强制转换为指针,通过取指针内容的方式

使用。

例如:

#define PD12 ((volatile unsigned long *)(0x424182b0))

//0x424182b0为GPIOD_Pin12引脚对应的映射地址*PD12=0x01; //PD12引脚置高

②直接使用地址进行操作

(*((u32*)0x424182b0))=0x01; //PD12引脚置高

当然也可以通过如下定义使用

例如:

#define PD12 *((volatile unsigned long *)(0x424182b0))

//0x424182b0为GPIOD_Pin12引脚对应的映射地址PD12=0x01; //PD12引脚置高

③在多个引脚需要定义时,显然上面两种方法都比较繁琐。为简化位带操作,也可以定义一些宏。比如,我们可以建立一个把“位带地址+位序号”换成别名地址的宏,再建立一个把别名地址转换成指针类型的宏。

例如

#define GPIOD_ODR_Addr ((uint32_t)(GPIOD_BASE+0x14)) // GPIOD_BASE已经定义过

#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) )

#define PD12 BIT_ADDR(GPIOD_ODR_Addr, 12) //12为GPIOD对应的引脚号

#define PD12 BIT_ADDR(GPIOD_ODR_Addr, 13) //13为GPIOD对应的引脚号

PD12=0x01;//PD12引脚置高

PD13=0x01;//PD13引脚置高

说明:GPIOD_BASE已经在库文件stm32f2xx.h中定义过,直接使用即可,对应地址是GPIOD的基地址,0x14是ODR的偏移地址。第二条语句是把“位带地址+序号”转换为对应的位带别名区地址。第三条语句MEM_ADDR(addr)代表的是(addr)地址中的内容。volatile必须使用,原因如下。

volatile 是易变的、不稳定的意思。用它修饰的变量表示可以被某些编译器未知的因素更改,比如操作系统、硬件或者其它线程等。遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问。

先看看下面的例子:

int i=10;

int j = i;//(1)语句

int k = i;//(2)语句

这时候编译器对代码进行优化,因为在(1)、(2)两条语句中,i 没有被用作左值。这时候编译器认为i 的值没有发生改变,所以在(1)语句时从内存中取出i 的值赋给j 之后,这个值并没有被丢掉,而是在(2)语句时继续用这个值给k 赋值。编译器不会生成出汇编代码重新从内存里取i 的值,这样提高了效率。但要注意:(1)、(2)语句之间i 没有被用作左值才行。

再看另一个例子:

volatile int i=10;

int j = i;//(3)语句

int k = i;//(4)语句

volatile 关键字告诉编译器i 是随时可能发生变化的,每次使用它的时候必须从内存中取出i的值,因而编译器生成的汇编代码会重新从i 的地址处读取数据放在k 中。这样看来,如果i 是一个寄存器变量或者表示一个端口数据或者是多个线程的共享数据,就容易出错,所以说volatile 可以保证对特殊地址的稳定访问。

STM32 开发板的介绍

STM32 开发板的介绍 STM32的开发板硬件资源如下: 1、STM32F103RBT6 TQFP64 FLASH:128K SRAM:20K; 2、MAX232通讯口可用于程序代码下载和调试实验; 3、SD卡接口; 4、RTC后备电池座; 5、两个功能开关; 6、复位连接; 7、两个状态灯; 8、所有I/O输出全部引用; 9、USB接口、可用于USB与MCU通讯实验; 10、标准的TJAG/SWDT仿真下载; 11、BOOT0 BOOT1Q启动模式; 12、电源开关; 13、电源指示灯

STM32开发板硬件详解 1、MCU部分原理图 该开发板采用3.3V工作电压,几个耦合电容使系统更加稳定。系统工作频率8M晶振、时钟频率32.768。 这里STM32的VBAT采用CR1220纽扣电池和VCC3.3混合供电方式,在有外部电源(VCC3.3)的时候,CR1220不给VBAT供电,而在外部电源断开的时候,则由CR1220给VBAT供电。这样,VBAT 总是有电的,以保证RTC的走时以及后备寄存器的内容不丢失。2、启动模式电路图 上图中的BOOT1用于设置STM32的启动方式,其对应启动模式如下表所示

PCB板标志图解如下: 3、TJAG电路 4、LED状态灯原理图 两个LED状态灯,其中LED0接在PA8、LED1接在PD2。 5、SD卡原理图

SD卡我们使用的是SPI1模式通讯,SD卡地SPI接口连接到STM32的SPI1上,SD-CS接在PA3上,MOSI接MCU PA7(MOSI)、SCK 接在MCU PA5(SCK)、MIS0接在MCU PA6(MIS0). 6、按键原理图 KEY1和KEY2用作普通按键输入,分别接在PA13和PA15上,

战舰STM32开发板原理图3(共7份)

Title: Author:Date: Size:Revision:File: Version:ALIENTEK 3.5' TFTLCD Module 2012-10-250 ATOM A43.5TFTLCD.SchDoc V1.2 GND 1VDD 2IOVCC 3CS 4RS 5WR 6RD 7RST 8DB0 9DB110DB211DB312DB413DB514DB615DB716DB817DB918DB1019DB1120DB1221DB1322DB1423DB1524FMARK 25Y-26X-27Y+28X+29LEDK130LEDK231LEDK332LEDK433LEDK534LEDK635LEDA 36GND 37TFTLCD TFT3.5' CS 1RS 2WR 3RD 4RST 5DB06DB17DB28DB39DB410DB511DB612DB713DB814DB915DB1016DB1117DB1218DB1319DB1420DB1521GND 22BL 23VDD3.324VDD3.325GND 26GND 27BL_VDD 28MISO 29MOSI 30T_PEN 31MO 32T_CS 33CLK 34LCD TFT_LCD2 LEDK1LEDK2LEDK3LEDK4T_CLK T_CS T_MISO T_MOSI T_PEN R11100K X+ X-Y+Y- C3 104 C4 104 TVDD TVDD C2 10uF VCC3.3 VCC 1X+2Y+3X-4Y-5GND 6IN37IN48Vref 9VCC 10PEN 11DOUT 12BUSY 13DIN 14CS 15CLK 16 U1 XPT2046 R1/R2:BACKLIGHT VOLTAGE SEL R4 10R Q1 S8050 GND R9 1K BL_CTR R310R LCD_RST LCD_CS LCD_RS LCD_WR LCD_RD LCD_D0LCD_D1LCD_D2LCD_D3LCD_D4LCD_D5LCD_D6LCD_D7LCD_D8LCD_D9 LCD_D10LCD_D11LCD_D12LCD_D13LCD_D14LCD_D15 GND C1104VCC3.3LEDK1LEDK2LEDK3LEDK4LEDK5LEDK6LEDA LEDA R1 0R R20R VCC3.3 BL_VDD BL_VDD R510R R610R R810R R1010R R12 10R LEDK5LEDK6X+X-Y+Y-LCD_RST LCD_CS LCD_RS LCD_WR LCD_RD LCD_D0LCD_D1LCD_D2LCD_D3LCD_D4LCD_D5LCD_D6LCD_D7LCD_D8LCD_D9LCD_D10LCD_D11LCD_D12LCD_D13LCD_D14LCD_D15GND GND VCC3.3BL_CTR GND T_CS T_MISO T_PEN T_MOSI T_CLK VCC3.3T_BUSY T_BUSY R710K A L I E N T E K S T M 3 2 开发板 配套模块开源电子网 https://www.sodocs.net/doc/d31451275.html,

STM32开发板介绍

STM32最小开发板硬件简介 STM32F103RBT6

STM32开发板简介: STM32开发板硬件资源如下: 1、STM32F103RBT6 TQFP64 FLASH:128K SRAM:20K; 2、MAX232通讯接口可用于程序代码下载和调试实验; 3、SD卡接口; 4、RTC后备电池座; 5、两个功能开关; 6、复位按键; 7、两个状态灯; 8、所有I/O输出全部引出 9、USB接口、可用于USB与MCU通讯实验; 10、标准的TJAG/SWDT仿真下载 11、BOOT0 BOOT1启动模式。 12、电源开关; 13、电源提示灯

STM32开发板硬件详解 本节介绍各部分硬件,让大家对该开发板各部分原理有个理解; STM32F103RBT6作为MCU, STM32F103型号众多,我们选择这款原因看重性比价,作为低端开发板,选择STM32F103RBT6是最佳的选择。128K FLASH 20K SRAM、2个SPI 、3个串口、1个USB 、1个CAN、2个12位ADC、RTC、51个I/O口。 1、MCU 部分原理图 该开发板采用3.3V工作电压,几个耦合电容使系统更加稳定。系统工作频率8M晶振、时钟频率32.768。 这里STM32的VBAT采用CR1220纽扣电池和VCC3.3混合供电的方式,在有外部电源(VCC3.3)的时候,CR1220不给VBAT供电,而在外部电源断开的时候,则由CR1220给VBAT供电。这样,VBAT总是有电的,以保证RTC 的走时以及后备寄存器的内容不丢失。 2、启动模式电路图

上图中中上部的BOOT1用于设置STM32的启动方式,其对应启动模式如下表所示: 我们用串口下载代码,则配置BOOT0为1,BOOT1为0即可,如果想让STM32一按复位键就开始跑代码,则需要配置BOOT0为0,BOOT1随便设置都可以。 P3和P1分别用于PORTA和PORTB的IO口引出,其中P2还有部分用于PORTC 口的引出。PORTA和PORTB都是按顺序排列的,这样设计的目的是为了让大家更方便地与外部设备连接。 PCB板标志图解如下: 3、TJAG电路 这里采用的是标准的JTAG接法,但是STM32还有SWD接口,SWD只需要最少2跟线(SWCLK和SWDIO)就可以下载并调试代码了,这同我们使用串口下载代码差不多,而且速度更快,能调试。所以建议大家在设计产品的时候,可以留出SWD来下载调试代码,而摒弃JTAG。STM32的SWD接口与JTAG是共用的,只要接上JTAG,你就可以使用SWD模式了(其实并不需要JTAG这么多线),JLINKV8和ULINK2都支持SWD

相关主题