前言
单片机开发第一站,LED点灯。
目标:点亮引脚PF9上的LED灯
一、使用到的运算符
我们在应用单片机进行各种控制时,都是利用计算机语言设置单片机的内部寄存器来完成操作的。在涉及寄存器的大部分操作中,C语言的位运算符是不可或缺的一环。
& 位逻辑与
| 位逻辑或
^ 位逻辑异或
~ 位逻辑非
以及 >> 右移和 << 左移
熟练掌握C语言中的位运算符以及进制之间的转换,对我们使用寄存器非常重要。
二、寄存器相关
对寄存器的配置:先清零,后设置;先读,再改,后写入。
1.寄存器地址
相关操作将以下列代码为例;
#define GPIOF_ODR(*(volatile unsigned int*)0x40021414)
基地址:STM32的每个模块都包含多个寄存器,它们的地址通常是连续的,而第一个寄存器的地址(即地址值最低的地址),就是基地址。
偏移地址:寄存器在本模块中的地址偏移量。
绝对地址:即寄存器的实际地址,相当于基地址+偏移地址。
2.寄存器定义过程
表1-1中的GPIOF_MODER等不过是开发人员为了便于操作人为定义的符号,使这些符号能够真正的代表其对应的寄存器单元,还需要进一步处理。
- 找到GPIOF输出数据寄存器的绝对地址:0x40021414
- 将十六进制数 0x40021414 转为地址:强制类型转换
(*) 0x40021414
- 说明地址
(*) 0x40021414
指向的存储单元的数据类型:由于寄存器中存放的都是无符号整型数据,故有(unsigned int*) 0x40021414
- 使用volatile修饰地址,确保处理器每次都是对相应寄存器单元进行操作,避免没必要的数据读写错误:
(volatile unsigned int*) 0x40021414
- 将地址转为地址指向的储存单元:
*(volatile unsigned int*) 0x40021414