stm32初学笔记(一)真·入门笔记

最近在学习stm32,看的是野火的,b站就有视频,此博客记录我在学习中的重点与困惑

笔者不是第一次学习嵌入式,之前学过51,知道嵌入式的门槛,此文章旨在解决真正零基础的人的疑问,所以写的很详细,每一个视频我都看了两遍以上,尽可能的列举了我在学习中犯的错误,以及我的发散思维和作业答案,看了后面的视频会回来补充,此博客会一直完善的,但是此博客不能起到教学的作用,还是要结合视频。最后此博客大多是我自己的理解,有些地方可能会不太对,欢迎指正和交流,有问题留言即可,有问必答。

一、寄存器

1.丝印及方向

器件的外形的边框可以用丝印进行表示,焊接的方便。
	器件的编号也使用丝印进行标识,PCB板上的每个器件都有一个唯一的编号,
	PCB板上器件的编号和原理图中器件的编号具有唯一对应的管理。
	因此我们就可以通过PCB板上器件的丝印编号再原理图中找到对应器件的原理图。

图 1 芯片实物图

 型号可以查手册,此芯片对应下表模式:stm32 F 103 Z E T 6

 

图 2  芯片每一位含义

 方向辨别:

(1)找芯片自带的小圆点,小圆点那侧对应的即为1,从小圆点开始逆时针读取

(2)没点,正看丝印,左上角开始为1,也是逆时针读取

2.什么是寄存器?

(1)flash是什么?

         以手机内存为例,一般买手机的时候都会宣传8+128,8是运行内存,128就可以理解为flash,存在这里的数据是可以一直存在的 ,内存里的运行完则会释放。

补充:要想搞明白什么是flash,首先要知道flash的全称,flash全程flash EEPROM, EEPROM全称:Electrically Erasable Programmable read only memory

有点长是吧,我们一点一点理解,学过51单片机的人应该听说过RAM和ROM吧,没听过也没事,现在我们来讲什么是ROM和RAM

ROM:Read Only Memory只读存储器,memory在这里译为存储器

RAM:Random Access Memory 随机存取存储器

ROM的特点是在断电以后仍然可以保存数据,但是不能改变里面的数据,或者需特殊操作;RAM则是可以改变数据,但断电以后里面的数据不会保存,RAM里的Random就是可以随意修改数据,随用随取,用完就扔,典型的RAM是计算机运行内存。

PROM是可以编程的ROM,但是只能修改一次

EEPROM就是带电可擦除可编程存储器,既可以多次修改数据又可以断电保留数据

由flash的名字可以知道,flash结合了RAM和ROM的长处,既具备电子可擦出可编性能,可以多次修改数据,又能断电不丢失数据,U盘里用的就是flash。

关于存储器这块,有一张专门介绍存储器的,可以去那边看,这里简单介绍一下。

(2)粉色部分为外设,粉色部分就是要学习的寄存器,总共占4GB内存

图 3 系统框图

 粉色部分和下表可对应

图 4   寄存器地址图

 2.什么是寄存器

0x40010C0C从下方获取

 图 5   ORD寄存器

(3)(unsigned int * ) 的意思

unsigned int * p = (unsigned int * ) 2048解释:

(unsigned int * ) 2048 表示把2048转换为unsigned int指针类型,默认情况下2048为整型这样一来2048就可以表示一个地址了

*(volatile unsigned int *)0x500的解释:

该代码使用 (unsigned int *) 把 GPIOH_BSRR 宏的数值强制转换成了地址,然后再用
“ *”号做取指针操作,对该地址的赋值,从而实现了写寄存器的功能。
 

(unsigned int *)0x500:将地址0x500强制转化为int型指针
*(unsigned int *)0x500=0x10:对地址为0x500赋值为0x10

寄存器就是有特定功能的内存的别名。寄存器是0-32GB连续的内存。

总线由慢到快为,APB1,APB2,AHB。

APB1:0x4000 0000

APB2:0x4001 0000

AHB : 0x4002 0000

3.外设寄存器

 ①名字

寄存器说明中首先列出了该寄存器中的名称,“ (GPIOx_BSRR)(x=A…I)”这段的意思
是该寄存器名为“GPIOx_BSRR”其中的“ x”可以为 A-I,也就是说这个寄存器说明适用
于 GPIOA、 GPIOB 至 GPIOI,这些 GPIO 端口都有这样的一个寄存器。

②偏移地址
偏移地址是指本寄存器相对于这个外设的基地址的偏移。本寄存器的偏移地址是 0x18,
从参考手册中我们可以查到 GPIOA 外设的基地址为 0x4002 0000 ,我们就可以算出
GPIOA 的这个 GPIOA_BSRR 寄存器的地址为: 0x4002 0000+0x18 ;同理,由于 GPIOB 的
外设基地址为 0x4002 0400,可算出 GPIOB_BSRR 寄存器的地址为: 0x4002 0400+0x18 。
其他 GPIO 端口以此类推即可。

③寄存器位表
紧接着的是本寄存器的位表,表中列出它的 0-31 位的名称及权限。表上方的数字为位
编号,中间为位名称,最下方为读写权限,其中 w 表示只写, r 表示只读, rw 表示可读写。
本寄存器中的位权限都是 w,所以只能写,如果读本寄存器,是无法保证读取到它真正内
容的。而有的寄存器位只读,一般是用于表示 STM32 外设的某种工作状态的,由 STM32
硬件自动更改,程序通过读取那些寄存器位来判断外设的工作状态。
 ④位功能说明
位功能是寄存器说明中最重要的部分,它详细介绍了寄存器每一个位的功能。例如本
寄存器中有两种寄存器位,分别为 BRy 及 BSy,其中的 y 数值可以是 0-15,这里的 0-15表示端口的引脚号,如 BR0、 BS0 用于控制 GPIOx 的第 0 个引脚,若 x 表示 GPIOA,那就
是控制 GPIOA 的第 0 引脚,而 BR1、 BS1 就是控制 GPIOA 第 1 个引脚。
其中 BRy 引脚的说明是“ 0:不会对相应的 ODRx 位执行任何操作; 1:对相应 ODRx
位进行复位”。这里的“复位”是将该位设置为 0 的意思,而“置位”表示将该位设置为
1;说明中的 ODRx 是另一个寄存器的寄存器位,我们只需要知道 ODRx 位为 1 的时候,
对应的引脚 x 输出高电平,为 0 的时候对应的引脚输出低电平即可(感兴趣的读者可以查询
该寄存器 GPIOx_ODR 的说明了解)。所以,如果对 BR0 写入“ 1”的话,那么 GPIOx 的第
0 个引脚就会输出“低电平”,但是对 BR0 写入“ 0”的话,却不会影响 ODR0 位,所以引
脚电平不会改变。要想该引脚输出“高电平”,就需要对“ BS0”位写入“ 1”,寄存器位
BSy 与 BRy 是相反的操作。

封装这一部分可以只看个大概,没有必要在这里理解清楚,理解不清可以先往后看,下一个笔记详细记录了如何封装以及封装遇到的问题。在这里写这个部分,是视频里提到了,简单列举一下定义。浅看一下即可
4.C 语言对寄存器的封装

(1)封装总线和外设基地址

示例

 (2)封装寄存器列表
用上面的方法去定义地址,还是稍显繁琐,例如 GPIOA-GPIOH 都各有一组功能相同
的寄存器,如 GPIOA_MODER/GPIOB_MODER/GPIOC_MODER 等等,它们只是地址不一
样,但却要为每个寄存器都定义它的地址。为了更方便地访问寄存器,我们引入 C 语言中
的结构体语法对寄存器进行封装,具体见代码 5-6。
代码 5-6 使用结构体对 GPIO 寄存器组的封装

这样的地址偏移与 STM32 GPIO 外设定义的寄存器地址偏移一一对应,只要给结构体
设置好首地址,就能把结构体内成员的地址确定下来,然后就能以结构体的形式访问寄存
器了,具体见代码 5-7。
代码 5-7 通过结构体指针访问寄存器

 

 从这可以开始细看了

图 6

C语言置位 清零操作

置位 | =    清零 & =~()

一般来说,置零置一第一反应都会这样写

GPIOB_ODR=0;

 GPIOB_ODR=1;这样是将上图寄存器每一位都写为0或1了,目前我们只想让bit 0=0,所以采用图6中方式写入

补充:左移<<      右移>>运算

举例:9<<3;

先将9换成二进制,1001,在左移三位0100 1000

所以9<<3=72;需要注意的是,以下规则不适用于所有情况,具体等笔者百度完补上

不考虑符号,左移x位相当于扩大2^x倍,右移相当于缩小2^x倍

&操作可以在不改变原有bit数值的情况下,使其他为置零

|操作可以在不改变原有bit数值的情况下,使其他为置一。

GPIOB_ODR  & =~(1<<0)

表示1左移零位,就是bit0这一位的数值和1进行与操作,初始值为零,0&1还是0,所以是低电平

GPIOB_ODR  | =(1<<0)

表示1左移零位,也就是1目前还在bit0这一位,bit0的数值和1进行与操作,初始值为零,0 | 1是1,所以是高电平

  • 11
    点赞
  • 55
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值