STM32学习笔记——寄存器点灯

指南者 stm32f103VET6
GPIO输出初始化
1.选定具体的GPIO
2.配置GPIO的工作模式
3.控制GPIO输出高低电平(ODR,BRR,BSRR)

一. 查看原理图

在这里插入图片描述
确定点亮 绿灯PB0
即GPIOB0

二.查看相应寄存器

在这里插入图片描述
GPIOB 基地址为0X4001 0C00
复位时钟总线为0X40021000

三.寄存器配置

1.时钟使能

在这里插入图片描述
区别于51单片机,32要自行打开时钟控制,否则无法进行数据传输

//打开APB2的时钟使能
	//时钟 0X4002 1000
	//GPIOB在位3 置1
	*(unsigned int *)0X40021018 |= (1<<3); //(1<<3)等同0X08
	

2.端口配置


首先继续端口配置低寄存器(GPIO(7-0)属于低寄存器;GPIO(15-8)属于高寄存器;)
选择推挽输出模式 ; 输出模式,最大速度10Mhz;即0001
因为低寄存器偏移地址为0x00 ,所以0x40010C00+0x00=0x40010C00
因为GPIOB0 ,所以置位偏移0(如果点亮红灯PB5,则需要偏移(1<<(5*4))CNF加MODE为4位)

//GPIOB0 0X40010C00
	//端口配置低寄存器  偏移0 推挽输出 10M   0001
	*(unsigned int*)0X40010C00 |= (1<<0);  //(1<<0)等同0X01

3.端口输出数据配置

要使灯点亮,根据原理图可知要输出低电平

	//端口输出数据寄存器 (输出低电平)
	*(unsigned int*)0X40010C0C &= ~(1<<0);
	

三.demo.红灯绿灯交替闪烁

??效果正确,端口配置低寄存器,先配置绿灯,后配置红灯,并没有把配置的绿灯口覆盖,表示疑问,有待解决

#include "stm32f10x.h"

// &= ~   置0
// |=    置1
void soft_delay(unsigned int count)
{
	for(;count != 0;count--);
}
int main(void)
{
	//打开APB2的时钟使能
	//时钟 0X4002 1000
	//GPIOB在位3 置1
	*(unsigned int *)0X40021018 |= (1<<3); //(1<<3)等同0X08
	
	//GPIOB0 0X40010C00 绿灯
	//端口配置低寄存器  偏移0 推挽输出 10M   0001
	*(unsigned int*)0X40010C00 |= (1<<0);  //(1<<0)等同0X01
	
	//GPIOB5 0X40010C00 红灯
	//端口配置低寄存器  偏移5*4 推挽输出 10M   0001
	*(unsigned int*)0X40010C00 |= (1<<(5*4));  //(1<<0)等同0X01
	
	
	while(1){
		//端口输出数据寄存器 (输出低电平)绿灯开
		*(unsigned int*)0X40010C0C &= ~(1<<0);
		soft_delay(0Xfffff);
		//端口输出数据寄存器 (输出低电平)绿灯灭
		*(unsigned int*)0X40010C0C |= (1<<0);
		soft_delay(0Xfffff);
		
		//端口输出数据寄存器 (输出低电平)红灯开
		*(unsigned int*)0X40010C0C &= ~(1<<5);
		soft_delay(0Xfffff);
		//端口输出数据寄存器 (输出低电平)红灯灭
		*(unsigned int*)0X40010C0C |= (1<<5);
		soft_delay(0Xfffff);						
	}

}
void SystemInit(void)  //此函数为固件库初始化函数 外部晶振为8M,
	                     //通过此函数调内部锁相环倍频成72M
{
/* 函数体为空,目的不报错 */
}

三.直接操作寄存器控制IO---------------------------------

(为结合按键,翻转状态)
带参宏 ^ 异或
在这里插入图片描述
在这里插入图片描述


版权声明:本文为qq_44370382原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。