STM32 库开发指南 第七章

  1. STM32 单片机寄存器地址

  2. 地址空间划分

4GB的孔吉纳被分成8各block,每个Block 512MB。

Block0 内部Flash

512KB

Block1 内部RAM

64KB

Block2 片上外设

APB1, 外设地址30719

APB2,外设地址16383

AHB,外设地址229375

0x4000 0000 使所有外设的基地址

举例GPIO 寄存器地址构造

总外设基地址+特定外设偏移地址+寄存器偏移地址 --》寄存器位操作

寄存器封装

宏定义

使用宏定义对总外设基地址, 外设偏移地址和寄存器偏移地址进行重新命名,主要是方便后续访问和理解。

结构体定义

在结构体中结构体成员的地址是顺序排列的,以GPIO为例 每个寄存器都是 4个字节,即32bit, 其地址都是4的倍数。

GPIO 结构体定义如下

GPIO_TypeDef *GPIOx; //定义GPIO结构体指针

GPIOx =GPIOB_BASE; //把GPIOB的基地址赋值给结构体

GPIOx->IDR; //通过结构体访问寄存器

在STM32 的固件库中,已经把GPIOA~H的基地址通过(GPIO_TypeDef*)强制转换成结构体指针。所有我们可以直接通过GPIOA->IDR 直接访问寄存器。

修改寄存器的位操作方法

STM32中寄存器是32的,如果我们只想修改寄存器中某一位或者某几位,我们需要一种比较直观和方便的方法。

位清零操作

寄存器某位清零

变量a=1001 1111b

对bit2 清零

a &=~ (1<<2); 1 左移两位,取反,跟a 进行位与操作;

寄存器连续几位清零

对bit2和bit3 清理

a &=~ (3<<2*1); 11 左移2位,取反,跟a 进行位与操作;

对bit4和bit5 清理

a &=~ (3<<2*2); 11 左移4位,取反,跟a 进行位与操作;

位赋值操作

某一位赋值

变量a=1001 1111b

对bit2 赋值

a |=(1<<2); 1 左移两位,跟a 进行位或操作;

寄存器连续几位清零

对bit2和bit3 清理

a |=(3<<2*1); 11 左移2位,跟a 进行位或操作;

对bit4和bit5 清理

a |=(3<<2*2); 11 左移4位,跟a 进行位或操作;

位取反操作

以下操作是异或操作,如果实现某位取反功能的????

GPIO 操作

输入:模拟输入 和数字输入

数字输入: 悬空/上拉和下拉

输出:OD 和PP

复用值非GPIO 功能更下的输出模式

第七章学习总结

最简单的通过寄存器编写单片机程序的过程其实很简单。

  1. 只需要startup_stm32f10x_hd.s 做启动引导, 这个文件是固件库中自带的可以完全不用修改,其作用就是创建堆栈,把启动引导到main函数的位置。
  2. 需要一个main 函数, 我们可以直接在main 函数通过 强制类型转换,把寄存器地址转换位指针,再通过指针给寄存器赋值的方法来编程,这样还把宏定义给省了,但是这样的编程方法会比较繁琐。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值