作业1 实现GPIOB7个寄存器映射
查看参考手册知 GPIO有7个寄存器,接下来逐个进行寄存器映射
首先查看基地址
外设基地址(PERIPH_BASE) 0x40000000
APB1基地址(APB1_PERIPH_BASE) PERIPH_BASE
APB2基地址(APB2_PERIPH_BASE) PERIPH_BASE+0x10000
AHB基地址(AHB_PERIPH_BASE) PERIPH_BASE+0X20000 //在AHB中让DMA1为首地址方便计算
GPIOB基地址(GPIOB_BASE) APB2_PERIPH_BASE+0X0C00
1.端口配置低寄存器(GPIOB_CRL) GPIOB_BASE+0x00
2.端口配置高寄存器(GPIOB_CRH)GPIOB_BASE+0x04
3.端口输入数据寄存器(GPIOB_IDR)GPIOB_BASE+0x08
4.端口输出数据寄存器(GPIOB_ODR)GPIOB_BASE+0x0C
5.端口位设置/ 清除寄存器(GPIOx_BSRR) GPIOB_BASE+0x10
6.端口位清除寄存器(GPIOB_BRR) GPIOB_BASE+0x14
7.端口配置锁定寄存器(GPIOB_LCKR) GPIOB_BASE+0x18
#define PERIPH_BASE ((unsigned int)0x40000000)//外设基地址
#define APB1_PERIPH_BASE (PERIPH_BASE)//APB1基地址
#define APB2_PERIPH_BASE (PERIPH_BASE+0X10000)//APB2基地址
#define AHB_PERIPH_BASE (PERIPH_BASE+0X20000)//AHB基地址
#define RCC_BASE (AHB_PERIPH_BASE+0X1000)//RCC基地址
#define GPIOB_BASE (APB2_PERIPH_BASE+0X0C00)//GPIOB基地址
#define RCC_APB2ENR *(unsigned int*)(RCC_BASE+0x18)//APB2时钟外设使能寄存器
#define GPIOB_CRL *(unsigned int*)(GPIOB_BASE+0x00)//端口配置低寄存器
#define GPIOB_CRH *(unsigned int*)(GPIOB_BASE+0x04)//端口配置高寄存器
#define GPIOB_IDR *(unsigned int*)(GPIOB_BASE+0x08)//端口输入数据寄存器
#define GPIOB_ODR *(unsigned int*)(GPIOB_BASE+0x0C)//端口输出数据寄存器
#define GPIOx_BSRR *(unsigned int*)(GPIOB_BASE+0x10)//端口位设置/ 清除寄存器
#define GPIOB_LCKR *(unsigned int*)(GPIOB_BASE+0x18)//端口位清除寄存器
#define GPIOB_BRR *(unsigned int*)(GPIOB_BASE+0x14)//端口配置锁定寄存器
作业2 使用BSRR/BRR点灯
首先查看参考手册中相应寄存器说明
由原理图知IO口输出低电平时led点亮,又由上知
BSRR寄存器高16位实现清零,低16位实现置一功能,且置位优先级大于复位
BRR寄存器低16位实现清零
故
GPIOB_BRR |=(1<<(0));//PB0输出为0 点亮绿灯
GPIOB_BRR |=(1<<(1));//PB1输出为0 点亮蓝灯
GPIOB_BRR |=(1<<(5));//PB5输出为0 点亮红灯
通过BSRR寄存器熄灭led
GPIOB_BSRR |=(1<<(0));//PB0输出为1 熄灭绿灯
GPIOB_BSRR |=(1<<(1));//PB0输出为1 熄灭蓝灯
GPIOB_BSRR |=(1<<(5));//PB0输出为1 熄灭红灯
注:上述寄存器输出时同样需要配置时钟使能以及设置输出模式 具体见野火stm32指南针入门篇作业1
#include "stm32f10x.h"
void Delay(unsigned int count);//函数声明
int main (void)
{
RCC_APB2ENR |=((1)<<(3));//GPIOB时钟
while(1)
{
//点亮绿灯
GPIOB_CRL |=((1)<<(4*0));//配置IO为输出
GPIOB_BRR |=(1<<(0));//PB0输出0
Delay(500);
GPIOB_BSRR |=(1<<(0));//PB0置一
//点亮蓝灯
GPIOB_CRL |=((1)<<(4*1));//配置IO为输出
GPIOB_BRR |=(1<<(1));//PB1输出0
Delay(500);
GPIOB_BSRR |=(1<<(1));//PB1置一
//点亮红灯
GPIOB_CRL |=((1)<<(4*5));//配置IO为输出
GPIOB_BRR |=(1<<(5));//PB5输出0
Delay(500);
GPIOB_BSRR |=(1<<(5));//PB5置一
}
}
void SystemInit(void)
{
//骗过编译器
}
void Delay(unsigned int count)//延时函数
{
unsigned int i;
for(; count!=0; count--)
{
i = 5000;
while(i--);
}
}
上述代码利用BRR BSRR寄存器同样实现了绿蓝红闪烁灯