STM32F103寄存器方式点亮LED流水灯
一、学习STM32芯片
1、存储器映射
存储器本身不具有地址信息,它的地址是由芯片厂商或用户分配,给存储器分配地址
的过程就称为存储器映射
下图为STM32F10xxx中内置外设的起始地址。
2、以GPIOx为例讲解相关寄存器
将已经分配好地址的有特定功能的内存单元取别名的过程就叫寄存器映射。
(1)、找到GPIOx的地址,通过上图可看到GPIOA的地址为0x40010800
(2)GPIO端口低寄存器
这是存储数据的地址。方法为端口起始地址+偏移地址。所以GPIOA_CRL的储存数据的位置为0x40010800+0x00=0x40010800。
每个寄存器含有32位,每4位用来设置1个GPIO引脚功能。GPIOx_CRL/GPIOx_CRH 两个寄存器共含有64位,因此可完成对GPIO015的设定。其中GPIOx_CRL用于设置GPIO07引脚,GPIOx_CRH用于设置GPIO8~15引脚。
(3)GPIO端口配置高寄存器
推挽输出:可以输出高,低电平,连接数字器件;推挽结构一般是指两个三极管分别受两互补信号的控制,总是在一个三极管导通的时候另一个截止。
开漏输出:输出端相当于三极管的集电极,要得到高电平状态需要上拉电阻才行,适合于做电流型的驱动,其吸收电流的能力相对强(一般20ma以内)。
GPIOA_CRH=0xFFFFFFF0;//清调PA8原来的设置,同时屏蔽其它端口,不影响其他端口的设置
GPIO_CRH|=0x00000003;//PA8推挽输出
十六进制中的3换成二进制00 11 前两位00表示推挽输出,后两位11表示输出频率50Mhz。
(4)GPIO端口输入数据寄存器
// 读取 GPIOB 端口的 16 位数据值
uint16_t temp;
temp = GPIOB->IDR;
(5)GPIO端口输出数据寄存器
该地址偏移为:0x0C。 低16位有效,每一个位对应一个IO,控制引脚输出状态。ODR寄存器可读可写:既能控制管脚为高电平,也能控制管脚为低电平。
(6)GPIO端口位设置/清除寄存器
BSRR 只写寄存器:[color=Red]既能控制管脚为高电平,也能控制管脚为低电平。对寄存器高 16bit 写1 对应管脚为低电平,对寄存器低16bit写1对应管脚为高电平。写 0 ,无动作。
(7)开启外设时钟
开启 GPIOB 端口 时钟
RCC_APB2ENR |= (1<<3);
由于 STM32的 外设很多,为了降低功耗,每个外设都对应着一个时钟,在芯片刚
上电的时候这些时钟都是被关闭的,如果想要外设工作,必须把相应的时钟打开。
(8)GPIO端口初始化
以GPIOB为例。
// 开启 GPIOB 端口时钟
GPIOB_CRL &= ~( 0x0F<< (4*4));
// 配置 PB4 为通用推挽输出,速度为 10M
GPIOB_CRL |= (1<<4*4);
// PB4 输出 低电平
GPIOB_ODR |= (0<<4);
二、寄存器实现LED灯点亮
1、代码编写
(1)C语言
//--------------APB2使能时钟寄存器------------------------
#define RCC_APB2ENR *((unsigned volatile int*)0x40021018)