【stm32】stm32实验一寄存器点亮小灯泡


前言

学习使用stm32寄存器点亮led流水灯。
熟练使用手册


一、搭建protues仿真

示例:
打开proteus创建工程
在这里插入图片描述
默认
在这里插入图片描述
选择Cortex-M3系列
选择自己的芯片
在这里插入图片描述
选择stm32f1038t6
在这里插入图片描述
将代码拷贝进去,代码将在后面呈现
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

二、使用寄存器点亮小灯泡

利用GPIOA,GPIOAB,GPIOC实现流水灯
在这里插入图片描述
根据stm32f103使用手册可以看出GOIOABC的总线时AHB,查看寄存器的起始地址可以找出AHB的时钟寄存器起始地址为0x4002 1000-0x4002 13FF
在这里插入图片描述
查看地址可以开起时钟
在这里插入图片描述
因为GPIOABC的外设为APB2偏移地址为0x18
在这里插入图片描述

*(volatile unsinged int*0x40021018//AHB外设+APB2偏移地址:(0x4002 1000)+1018
GPIOA |=(1<<2)//因为A口在位2所以向左移2位到A口

再查看手册查找外设基地址
在这里插入图片描述
GPIOA为例
配置GPIOA的输出
在这里插入图片描述

#define GPIOA_CRL *(volatile unsigned int *)40010800//GPIOA口的基地址40010800+端口配置低寄存器0x00
GPIOA_CRL|=1<<(4*3)//配置MODE3就是AP3口 

再查找手册输出数据寄存器
在这里插入图片描述

#define GPIOA_ODR *(volatile unsigned int *)40010800+0x0C//GPIOA的地址+端口输出寄存器
GPIOA_ODR  &= ~(1<<3);

总代码

#include "stm32f10x.h"                
#include "Delay.h"   
#define GPIOA_CLK (*(volatile unsigned int *)(0x40021000 + 0x18))//开启外设存储器地址0x4002+APB2偏移地址0x18
#define GPIOB_CLK (*(volatile unsigned int *)(0x40021000 + 0x18))
#define GPIOC_CLK (*(volatile unsigned int *)(0x40021000 + 0x18))
#define GPIOA_CRH (*(volatile unsigned int *)(0x40010800 + 0x00)//设置GPIOA地址+端口低位寄存器0x00	
#define GPIOA_ODR (*(volatile unsigned int *)(0x40010800 + 0x0C))//设置GPIOA地址+端口输出数据寄存器地址0x0c
#define GPIOB_CRH (*(volatile unsigned int *)(0x40010C00 + 0x00))//设置GPIOB地址+端口低位	寄存器0x00
#define GPIOB_ODR (*(volatile unsigned int *)(0x40010C00 + 0x0C))//设置GPIOB地址+端口输出数据寄存器地址0x0c
#define GPIOC_CRH (*(volatile unsigned int *)(0x40011000 + 0x04))//设置 GPIOC地址+端口高位输出寄存器地址0x0c
#define GPIOC_ODR (*(volatile unsigned int *)(0x40011000 + 0x0C))//设置GPIOC地址+端口输出数据寄存器地址0x0c
int main(void)
{
	GPIOA_CLK |= (1<<2); //向左移2位开启A端口时钟
	GPIOA_CRH |= (1<<(4*3));//配置AP3端口	
	
	GPIOB_CLK |= (1<<3); //向左移3位开启B时钟
	GPIOB_CRH |= (1<<(4*7));//配置PB7端口
	
	GPIOC_CLK |= (1<<4); //向左移4位开启时钟c
	GPIOC_CRH |= (1<<(4*5));//设置高位13端口
	GPIOA_ODR |=  (1<<3);//初始化ABC端口为低
	GPIOB_ODR |=  (1<<7);
	GPIOC_ODR |=  (1<<13);
	  while(1)
		{	
		  GPIOA_ODR &= ~(1<<3);Delay_ms(500);
			GPIOA_ODR |=  (1<<3);Delay_ms(500);
			
			GPIOB_ODR &= ~(1<<7); 
			Delay_ms(500);
			GPIOB_ODR |=  (1<<7);
			Delay_ms(500);
			
			GPIOC_ODR &= ~(1<<13); 
			Delay_ms(500);
			GPIOC_ODR |=  (1<<13);
			Delay_ms(500);
		}
}
 

实物效果

QQ视频20230924115534

总结

通过这次对stm32寄存器的学习,了解了一些基本stm32寄存器的语法使用规则,也了解了如何查阅手册对应的寄存器用法。在搭建电路时遇见了一个问题就是stm32芯片俩边的gnd和3.3V都要接在面包板上的正负极,还有搭建电路时要注意灯泡的正负极。在仿真时尽量使用最新版的Proteus。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值