寄存器与操作寄存器(小白级教学)

张开发
2026/4/16 3:28:21 15 分钟阅读

分享文章

寄存器与操作寄存器(小白级教学)
前言到目前为止计算机依然只能读入二进制此时肯定会有读者好奇了那我们电脑中各种各样的图案声音还有颜色都是如何来的呢因为电脑本身就是硬件硬件内部中1就是代表高电压0就是代表低电压然后OLED屏幕其实本身就是通过多种像素点来实现的比如说当这个地方需要亮的时候就是通高电压使得这个像素点变亮发光的颜色的话也是通过RGB规则也是通过一个编号来代表一种颜色声音也是通过连续测量震动的大小进行采样存储01编码然后代表一种数字然后相同的就是当接收方接收其中的声音的时候就是会读取其中的数字然后电脑或者手机就会产生相同的震动也就是发送方的声音了。正是这两个最简单的0和1然后形成了整个多姿多彩的计算机世界。寄存器首先就是寄存器分为两种一种是CPU内核寄存器还有一种就是外设寄存器GPIO,RCC,SPI等单片机中常用的外设内核寄存器这个内核寄存器就是在CPU内部的用来做平时的变量相加减然后还有函数调用等等程序的操作我利用代码和注释详细的说一下其中的作用#include stdio.h int main(void){ //假设程序做了一个加法运算 int a5; int b8; int cab; //先说明就是开始时候变量被声明完了都是存储在内存(RAM)中的 //但是CPU内核寄存器的操作就是先将变量从内存中读取到CPU内核寄存器中进行运算 //因为CPU的运算速度是在内存中运算的好几倍甚至是10倍所以都是放到CPU内核寄存器上进行运算 //运算完之后再将CPU内核寄存器中的数放到内存中去 // a在内存中数据为00000000 00000000 00000000 00000101 // b在内存中数据为00000000 00000000 00000000 00001000 // CPU就是将上面的内存数据读取到CPU内核处理器中高速处理 // 最后再将运算好的数据放回c变量中永久保存 }外设寄存器外设寄存器是设置来专门来控制硬件例如USARTGPIO等等的寄存器我就拿下面这两张图片来进行讲解一下外设寄存器首先讲一下寄存器地址因为寄存器地址是由起始地址和偏移位置组成的第一张是可以看到外设的起始地址然后第二张图上面就有偏移位置我们就可以通过起始位置偏移位置等到最后寄存器的位置了从而就可以通过寄存器的地址来进行操作寄存器。然后就是每一个位其实单片机官方都已经设定好了我们通过第二张图就可以看到很多关于每一个寄存器中的位的作用后续就是保证这些位的数就是对应着我们想要的模式还有作用。操作寄存器其实我们进行操作寄存器就是通过查找手册找出其中的寄存器位置然后还有对应模式通过位操作就可以实现操作寄存器的方式了从这里我们也可以知道其实我们了解到的所有关于硬件的操作都是通过寄存器来实现的很多函数只是对操作寄存器进行了一个包装使其迁移性更强兼容性更强但是通过寄存器来操作硬件肯定是最快的。下面就是通过代码来体现一下如何进行操作寄存器还有大致开发的一个步骤流程。//开发流程去stm32指导手册中找到对应的我们需要更改的寄存器的地址 //寄存器的地址是初始地址偏移地址组成的 //初始地址比如说是 //GPIO_CRHGPIOA(基地址)偏移地址(图上声明了)0x04 最后0x40010800 //上面寄存器中的内容也是说明了要是想要操作寄存器就是操作寄存器地址 //所以我们一般就是使用两种方法来控制单一的寄存器 //指针法 *(unsigned int*)0x400108000x10001110; //就是通过将 unsigned int*类型的指针进行解引用然后得到就是这个地址上的数据值将数据值进行修改 //从而达到操作寄存器上的值 // 更名或者宏定义法 typedef (unsigned int*)0x40010800 GPIO_CRH; #define GPIO_CRH (unsingned int*)0x40010800 //更名或者宏定义之后这个 GPIO_CRH就是代表的是地址 //所以说可以 *GPIO_CRH0x10100100; //本质还是指针操作来进行寄存器中的操作要想了解如何操作寄存器的话我们肯定是要学习如何来进行位操作的 首先回忆一下几个位运算符号 是相同位上的数同时为1则是1 有0则0 |是相同位上的数有1则为1 有1则1 ^是相同位上 数不相同为1 不同为1 ~这是将位的1变为00变为1 右移动 就是整体向右移动不足补0但是需要注意负数即当第一位为1是代表为负数 代表为负数时向右移动需要补1 左移运算符位上的数整体向左移动然后不足补0 位运算操作 掩码操作也就是将其中一位或者多位置0或者1 重置为0 GPIOA-CRH ~(1n); 就是利用其中1左移n位就是我们要置0的那位然后反目来使那位为0 重置为1 GPIOA-CRH |(1n);这样就是保持其他位不变然后将第n位变为1 基本所有位都是可以通过位运算符和掩码都可以整出来整体操作寄存器就是通过查看stm32手册中的地址然后通过位运算来进行操作从而来控制硬件这个也是为什么c语言和c可以来控制硬件的原因直接进行底层控制。以上中有些图片是截取了stm32参考手册的资料来源RM0008 STM32F10xxx参考手册中文

更多文章