STM32F103流水灯(寄存器地址操作)

一. 了解STM32最小系统核心板(STM32F103C8T6)的电路原理图,用Proteus 设计一个STM32最小系统板+LED流水灯实验原理图,仿真运行。

proteus新建工程,完成如图的连线
在这里插入图片描述
给芯片烧进.hex文件后仿真如下:

二、程序原理

1.先找出GPIOA、GPIOB、GPIOC寄存器地址

在这里插入图片描述
APB2外设时钟使能寄存器
在这里插入图片描述
stm32 想要端口正常工作需要打开外设使能时,例如0x400210100表示寄存器RCC_APB2ENR的地址,加上偏移地址0x400210118,|= (1<<2)表示使能GPIOA(同理|= (1<<3)表示使能GPIOB)
在这里插入图片描述

2、端口配置低寄存器

在这里插入图片描述
如图:我们将CNFy设置为通用推挽模式,MODEy设置为最大速度为2Mhz的输出模式:即0010,换算成16进制为2。
例如我们6号口为输出口,则编码为:0200 0000

在这里插入图片描述

3、代码(附详细解释)

#include "stm32f10x.h"
//----------------APB2使能时钟寄存器 ---------------------
#define RCC_APB2ENR *((unsigned volatile int*)0x40021018)
//----------------GPIOA配置寄存器 -----------------------
#define GPIOA_CRL *((unsigned volatile int*)0x40010800)
#define GPIOA_ODR *((unsigned volatile int*)0x4001080C)
//----------------GPIOB配置寄存器 -----------------------
#define GPIOB_CRL *((unsigned volatile int*)0x40010C00)
#define GPIOB_ODR *((unsigned volatile int*)0x40010C0C)
//----------------GPIOC配置寄存器 -----------------------
#define GPIOC_CRH *((unsigned volatile int*)0x40011004)
#define GPIOC_ODR *((unsigned volatile int*)0x4001100C)
//延时函数
 void Delay()
 {
   u32 i=0;
   for(;i<5000000;i++);
 }
 int main(void)
 { 
 RCC_APB2ENR|=1<<2|1<<3|1<<4; //APB2-GPIOA、GPIOB、GPIOC外设时钟使能 
 GPIOA_CRL&=0xFFF0FFFF; //设置位 清零 
 GPIOA_CRL|=0x00000002; //PA0推挽输出
 GPIOA_ODR&=~(1<<5); //设置初始灯为灭
 GPIOB_CRL&=0xFF0FFFFF; //设置位 清零 
 GPIOB_CRL|=0x00000002; //PB0推挽输出
 GPIOB_ODR&=~(1<<9); //设置初始灯为灭
 GPIOC_CRH&=0xF0FFFFFF; //设置位 清零 
 GPIOC_CRH|=0x02000000; //PC14推挽输出
 GPIOC_ODR&=~(1<<14); //设置初始灯为灭  
 while(1){
  //A灯
  GPIOA_ODR|=1<<0; //PA0高电平
   Delay();
  GPIOA_ODR&=~(1<<0); //PA0低电平,因为是置0,所以用按位与
  //B灯
  GPIOB_ODR|=1<<0; //PB0高电平
   Delay();
  GPIOB_ODR&=~(1<<0); //PB0低电平,因为是置0,所以用按位与
  //C灯
  GPIOC_ODR|=1<<14; //PC14高电平
   Delay();
  GPIOC_ODR&=~(1<<14); //PC14低电平,因为是置0,所以用按位与
  }

}

硬件效果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Dylan_hs

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值