做网站用php还是node,常熟智能网站开发,做网站建设的前景,apache 配置网站地址0、参考1、寄存器和存储器基本概念#xff08;1#xff09;基本概念#xff08;2#xff09;主要区别#xff08;3#xff09;联系#xff08;4#xff09;实际应用中的案例#xff08;5#xff09;总结#xff08;6#xff09;一些名词解释 2、STM32指南者板子-存… 0、参考1、寄存器和存储器基本概念1基本概念2主要区别3联系4实际应用中的案例5总结6一些名词解释 2、STM32指南者板子-存储器区域总划分Block0Block1Block2 3、STM32指南者板子-寄存器区域片子上是存储器的BLOCK2这块区域1片上外设基地址2总线基地址3GPIO外设基地址4GPIO外设寄存器地址总结 4、C语言使用封装寄存器1定义结构体GPIO_TypeDef2定义外设基地址3使用GPIO_TypeDef把地址强制转换成指针4则访问任意端口的某个寄存器 5、C语言常用位操作对某一位清零a ~(12)对某一位取反a ^(16)对某几位清零a ~(32*1)对某几位进行赋值a | (12*2) 6、GPIO-寄存器版1GPIO七个寄存器2GPIO八个工作模式3如何查找GPIO对应的功能4如何查找GPIO对应的工作模式 0、参考
https://doc.embedfire.com/mcu/stm32/f103zhinanzhe/std/zh/latest/book/register.htmlhttps://blog.csdn.net/m0_74091159/article/details/139794521
1、寄存器和存储器基本概念
在计算机系统中寄存器和存储器是两个重要的概念它们在数据存储和处理过程中扮演着不同但互补的角色。本文将详细讨论寄存器和存储器的区别与联系。
1基本概念
寄存器Register是一种速度极快的小容量存储单元通常集成在CPU内部用于暂存数据和指令。寄存器可以在一个CPU时钟周期内被读取或写入。
存储器Memory通常指随机存取存储器RAM是一种速度较慢但容量较大的存储设备用于存储正在执行的程序和数据。存储器分为主存储器如DRAM和辅助存储器如硬盘、SSD。
2主要区别
速度
寄存器速度最快通常是计算机中最快的存储设备因为它们直接集成在CPU内部能够在一个时钟周期内进行读写操作。
存储器速度相对较慢即使是快速的DRAM其访问速度也比寄存器慢一个数量级以上。容量
寄存器容量非常小通常在几个字节到几百字节之间。这是因为寄存器的制造成本高且CPU内部空间有限。
存储器容量较大现代计算机的RAM通常在几GB到几十GB之间而辅助存储器则可达到TB级别。位置和功能
寄存器位于CPU内部主要用于临时存储指令和数据参与运算操作。例如累加器Accumulator、程序计数器Program Counter和状态寄存器Status Register。
存储器位于CPU外部通过系统总线与CPU连接。用于存储当前运行的程序和数据是操作系统和应用程序的运行空间。功能与用途
寄存器用于快速存取需要立即处理的数据是CPU执行指令的关键组成部分。例如寄存器用于存储操作数、结果、地址和控制信息。
存储器用于存储大量数据和程序是计算机系统的主要数据存储设备。例如操作系统、应用程序以及用户数据都存储在存储器中。3联系
虽然寄存器和存储器在性能和用途上有显著区别但它们之间存在密切的联系
数据交换
寄存器和存储器之间需要频繁的数据交换。CPU从存储器中读取指令和数据到寄存器进行处理后再将结果存回存储器。这种数据交换是通过系统总线和高速缓存Cache实现的。层次结构
寄存器、缓存、主存储器RAM和辅助存储器如硬盘、SSD构成了计算机的存储层次结构。寄存器在最上层速度最快但容量最小辅助存储器在最底层速度最慢但容量最大。这种层次结构保证了在成本和性能之间的平衡。性能优化
现代计算机系统通过多级缓存L1、L2、L3来优化寄存器和存储器之间的数据交换从而提升整体性能。缓存存储器介于寄存器和主存储器之间存储经常使用的数据和指令减少对较慢存储器的访问次数。4实际应用中的案例
CPU指令执行过程
在执行一条指令时CPU首先从存储器中取出指令Fetch将其存入指令寄存器Instruction Register。然后指令译码器Decoder将指令译码并根据指令类型从存储器或其他寄存器中获取操作数。接下来执行单元如算术逻辑单元ALU对操作数进行运算并将结果存入目标寄存器或存储器中。高性能计算
在高性能计算HPC中寄存器和存储器的有效利用对于提高计算效率至关重要。通过优化寄存器分配和存储器访问模式可以显著提升计算速度。例如使用寄存器重命名技术可以避免寄存器资源冲突从而提高指令级并行性。5总结
寄存器和存储器在计算机系统中扮演着不同但互补的角色。寄存器负责快速数据存取和处理而存储器则提供大量数据和程序的存储空间。通过高效的数据交换和存储层次结构计算机系统在性能和成本之间找到了平衡。这种分工和协作是现代计算机系统高效运行的基础。
6一些名词解释
存储器
FLASH闪存存储器我们编写好的程序就放在这个地方SRAM即我们通常说的RAM程序的变量堆栈等的开销都是基于内部的SRAMROM只读存储器
2、STM32指南者板子-存储器区域
总划分 Block0 Block1 Block2 3、STM32指南者板子-寄存器区域片子上是存储器的BLOCK2这块区域
在存储器Block2这块区域设计的是片子的外设它们以四个字节为一个单元共32bit每一个单元对应不同的功能 当我们控制这些单元时就可以驱动外设工作。使用板子的时候就是用这一块来控制外设
我们可以找到每个单元的起始地址然后通过C语言指针的操作方式来访问这些单元 如果每次都是通过这种地址的方式来访问不仅不好记忆还容易出错这时我们可以根据每个单元功能的不同以功能为名给这个内存单元取一个别名 这个别名就是我们经常说的寄存器这个给已经分配好地址的有特定功能的内存单元取别名的过程就叫寄存器映射。
1片上外设基地址
即存储器Block2的首地址
0x400000002总线基地址
片上外设区分为三条总线根据外设速度的不同不同总线挂载着不同的外设APB1挂载低速外设APB2和AHB挂载高速外设。 相应总线的最低地址我们称为该总线的基地址总线基地址也是挂载在该总线上的首个外设的地址。其中APB1总线的地址最低片上外设从这里开始也叫外设基地址。
3GPIO外设基地址
总线上挂载着各种外设这些外设也有自己的地址范围特定外设的首个地址称为“XX外设基地址”也叫XX外设的边界地址。
以GPIO这个外设来讲解外设的基地址GPIO属于高速的外设 挂载到APB2总线上
4GPIO外设寄存器地址
GPIO有很多个寄存器每一个都有特定的功能。每个寄存器为32bit占四个字节在该外设的基地址上按照顺序排列 寄存器的位置都以相对该外设基地址的偏移地址来描述。
以GPIOB端口为例说明GPIO都有哪些寄存器 有关外设的寄存器说明可参考《STM32F10xx参考手册》中具体章节的寄存器描述部分在编程的时候我们需要反复的查阅外设的寄存器说明。
总结
/* 外设基地址 */
#define PERIPH_BASE ((unsigned int)0x40000000)/* 总线基地址 */
#define APB1PERIPH_BASE PERIPH_BASE
#define APB2PERIPH_BASE (PERIPH_BASE 0x00010000)
#define AHBPERIPH_BASE (PERIPH_BASE 0x00020000)/* GPIO外设基地址 */
#define GPIOA_BASE (APB2PERIPH_BASE 0x0800)
#define GPIOB_BASE (APB2PERIPH_BASE 0x0C00)
#define GPIOC_BASE (APB2PERIPH_BASE 0x1000)
#define GPIOD_BASE (APB2PERIPH_BASE 0x1400)
#define GPIOE_BASE (APB2PERIPH_BASE 0x1800)
#define GPIOF_BASE (APB2PERIPH_BASE 0x1C00)
#define GPIOG_BASE (APB2PERIPH_BASE 0x2000)/* 寄存器基地址以GPIOB为例 */
#define GPIOB_CRL (GPIOB_BASE0x00)
#define GPIOB_CRH (GPIOB_BASE0x04)
#define GPIOB_IDR (GPIOB_BASE0x08)
#define GPIOB_ODR (GPIOB_BASE0x0C)
#define GPIOB_BSRR (GPIOB_BASE0x10)
#define GPIOB_BRR (GPIOB_BASE0x14)
#define GPIOB_LCKR (GPIOB_BASE0x18)4、C语言使用封装寄存器
因为GPIOA ~ GPIOG每一个都有GPIOXXX_CRL ~ GPIOXXX_LCKR因此在C语言使用定义的时候可以用结构体封装好
1定义结构体GPIO_TypeDef
//寄存器的值常常是芯片外设自动更改的即使CPU没有执行程序也有可能发生变化
//编译器有可能会对没有执行程序的变量进行优化//volatile表示易变的变量防止编译器优化
#define __IO volatile
typedef unsigned int uint32_t;
typedef unsigned short uint16_t;// GPIO 寄存器结构体定义
typedef struct
{__IO uint32_t CRL; // 端口配置低寄存器 地址偏移0X00__IO uint32_t CRH; // 端口配置高寄存器 地址偏移0X04__IO uint32_t IDR; // 端口数据输入寄存器 地址偏移0X08__IO uint32_t ODR; // 端口数据输出寄存器 地址偏移0X0C__IO uint32_t BSRR; // 端口位设置/清除寄存器地址偏移0X10__IO uint32_t BRR; // 端口位清除寄存器 地址偏移0X14__IO uint32_t LCKR; // 端口配置锁定寄存器 地址偏移0X18
} GPIO_TypeDef;;2定义外设基地址
/* 外设基地址 */
#define PERIPH_BASE ((unsigned int)0x40000000)/* 总线基地址 */
#define APB1PERIPH_BASE PERIPH_BASE
#define APB2PERIPH_BASE (PERIPH_BASE 0x00010000)
#define AHBPERIPH_BASE (PERIPH_BASE 0x00020000)/* GPIO外设基地址 */
#define GPIOA_BASE (APB2PERIPH_BASE 0x0800)
#define GPIOB_BASE (APB2PERIPH_BASE 0x0C00)
#define GPIOC_BASE (APB2PERIPH_BASE 0x1000)
#define GPIOD_BASE (APB2PERIPH_BASE 0x1400)
#define GPIOE_BASE (APB2PERIPH_BASE 0x1800)
#define GPIOF_BASE (APB2PERIPH_BASE 0x1C00)
#define GPIOG_BASE (APB2PERIPH_BASE 0x2000)/*RCC外设基地址时钟用*/
#define RCC_BASE (AHBPERIPH_BASE 0x1000)3使用GPIO_TypeDef把地址强制转换成指针
#define GPIOA ((GPIO_TypeDef *) GPIOA_BASE)
#define GPIOB ((GPIO_TypeDef *) GPIOB_BASE)
#define GPIOC ((GPIO_TypeDef *) GPIOC_BASE)
#define GPIOD ((GPIO_TypeDef *) GPIOD_BASE)
#define GPIOE ((GPIO_TypeDef *) GPIOE_BASE)
#define GPIOF ((GPIO_TypeDef *) GPIOF_BASE)
#define GPIOG ((GPIO_TypeDef *) GPIOG_BASE)
#define GPIOH ((GPIO_TypeDef *) GPIOH_BASE)// RCC 外设声明
#define RCC ((RCC_TypeDef *) RCC_BASE)/*RCC的AHB1时钟使能寄存器地址,强制转换成指针*/
#define RCC_APB2ENR *(unsigned int*)(RCC_BASE0x18)4则访问任意端口的某个寄存器
/*使用定义好的宏直接访问*/
/*访问GPIOB端口的寄存器*/
GPIOB-BSRR 0xFFFF; //通过指针访问并修改GPIOB_BSRR寄存器
GPIOB-CRL 0xFFFF; //修改GPIOB_CRL寄存器
GPIOB-ODR 0xFFFF; //修改GPIOB_ODR寄存器uint32_t temp;
temp GPIOB-IDR; //读取GPIOB_IDR寄存器的值到变量temp中/*访问GPIOA端口的寄存器*/
GPIOA-BSRR 0xFFFF;
GPIOA-CRL 0xFFFF;
GPIOA-ODR 0xFFFF;uint32_t temp;
temp GPIOA-IDR; //读取GPIOA_IDR寄存器的值到变量temp中5、C语言常用位操作
对某一位清零a ~(12)
以变量a代表寄存器并假设寄存器中本来已有数值此时我们需要把变量a的某一位清零且其它位不变
//定义一个变量a 1001 1111 b (二进制数)
unsigned char a 0x9f;//对bit2 清零a ~(12);//括号中的1左移两位(12)得二进制数0000 0100 b
//按位取反~(12)得1111 1011 b
//假如a中原来的值为二进制数 a 1001 1111 b
//所得的数与a作”位与”运算a (1001 1111 b)(1111 1011 b),
//经过运算后a的值 a1001 1011 b
// a的bit2 位被清零而其它位不变。对某一位取反a ^(16)
对寄存器的某个位进行取反操作即 1变0 0变1这可以直接用如下操作其它位不变
//a 1001 0011 b
//把bit6取反其它位不变a ^(16);
//a 1101 0011 b对某几位清零a ~(32*1)
//定义一个变量a 1001 1111 b (二进制数)
unsigned char a 0x9f;
//1、分组
//若把a中的二进制位分成2个一组
//即bit0、bit1为第0组bit2、bit3为第1组
// bit4、bit5为第2组bit6、bit7为第3组
// 同理第4~15的高位由于a0x009f所以都为0也是按此方法排列
//2、对第1组的bit2、bit3清零
a ~(32*1);//!!!2:以2个为一组1第1组3清零工具11二进制!!!
//括号中的3左移两位(32*1)得二进制数0000 1100 b
//按位取反~(32*1)得1111 0011 b
//假如a中原来的值为二进制数 a 1001 1111 b
//所得的数与a作”位与”运算a (1001 1111 b)(1111 0011 b),
//经过运算后a的值 a1001 0011 b
// a的第1组的bit2、bit3被清零而其它位不变。//上述(~(32*1))中的(1)即为组编号;如清零第3组bit6、bit7此处应为3
//括号中的(2)为每组的位数每组有2个二进制位;若分成4个一组此处即为4
//括号中的(3)是组内所有位都为1时的值;若分成4个一组此处即为二进制数“1111 b”//例如对第2组bit4、bit5清零
a ~(32*2);对某几位进行赋值a | (12*2)
寄存器位先经过上面的清零操作后再对某几位写入所需要的数值且其它位不变
//先清零
//a 1000 0011 b
//此时对清零后的第2组bit4、bit5设置成二进制数“01 b ”a | (12*2);//1赋值工具“01 b ”2:以2个为一组1第1组
//a 1001 0011 b成功设置了第2组的值其它组不变6、GPIO-寄存器版
1GPIO七个寄存器 uint32_t CRL; /*GPIO端口配置低寄存器 地址偏移: 0x00 */uint32_t CRH; /*GPIO端口配置高寄存器 地址偏移: 0x04 */uint32_t IDR; /*GPIO数据输入寄存器 地址偏移: 0x08 */uint32_t ODR; /*GPIO数据输出寄存器 地址偏移: 0x0C */uint32_t BSRR; /*GPIO位设置/清除寄存器 地址偏移: 0x10 */uint32_t BRR; /*GPIO端口位清除寄存器 地址偏移: 0x14 */uint16_t LCKR; /*GPIO端口配置锁定寄存器 地址偏移: 0x18 */2GPIO八个工作模式 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 // 复用推挽输出3如何查找GPIO对应的功能
F:\BaiduNetdiskDownload\A盘资料盘[野火]STM32F103指南者_开发板规格书.pdf 如PB0和PB1分别接着LED绿灯和蓝灯
4如何查找GPIO对应的工作模式
F:\BaiduNetdiskDownload\A盘资料盘\3-STM32官方资料\STM32F1官方手册资料\1-STM32F10x-中文参考手册.pdf 若想让PB0对应的绿灯亮起则应设置PB0的低电平有效设置GPIOB_CRL为输出推挽模式在代码中我们先把控制PB0的端口位清0然后再向它赋值“0001 b”从而使GPIOB0引脚设置成输出模式速度为10M。
// 清空控制PB0的端口位
GPIOB_CRL ~( 0x0F (4*0));//11114组第0组注意低4位哦所以只清空低4位别的不要动
// 配置PB0为通用推挽输出速度为10M
GPIOB_CRL | (14*0);//0001,4组第0组
// PB0输出低电平
GPIOB_ODR ~(10);//0001,4组第0组管脚对于位写1 gpio 管脚为高电平写 0 为低电平1生效0无效注以 STM32F103ZET6 芯片为例子该芯片共有 144 脚芯片包括7个通用目的的输入/输出口GPIO组分别为GPIOA、GPIOB、GPIOC、GPIOD、GPIOE、GPIOF、GPIOG同时每组 GPIO 口组有 16 个 GPIO 口。通常简略称为PAx、PBx、PCx、PDx、PEx、PFx、PGx其中 x 为0-15也就是端口的0-15所有引脚PB0中的0代表CNF0MODE0要设置同理还有ODR0。 另外要记得开启时钟
// 开启 GPIOB 端口 时钟
RCC_APB2ENR | (13);