STM32F103的流水灯点亮版本1(寄存器地址操作)

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

一、STM32F103C8T6是一款由意法半导体公司(ST)推出的基于Cortex-M3内核的32位微控制器,硬件采用LQFP48封装,属于ST公司微控制器中的STM32系列。除了被我们熟知的STM32,ST公司还有SPC5X系列、STM8系列等,具体参数如下:
在这里插入图片描述
二、最小系统板
或许大家有经常听起过最小系统板这个词儿,那么什么是最小系统板呢?其实最小系统板就是一个最精简的电路,精简到只能维持MCU的最基本的正常工作。最小系统一般由外部复位电路、外部时钟电路以及MCU本体构成,除此之外没有其他诸如蓝牙、外置EEPROM、时钟芯片DS1302、SPI接口显示屏等外接设备。跟STC89C52RC单片机不一样的是,STM32F103C8T6的GPIO有8种模式,其中包含上拉、下拉输入模式,所以外接按钮时可不设计上下拉电阻。根据他的原理图显示:按键KEY0一端接到3.3V的VCC,一端接到PA0引脚。发光二极管LED0一端也同样经1KΩ电阻接到3.3V的VCC,另一端则接到PC13上。因此,想要让二极管发光的话需要让PC13输出低电平。STM32最大工作电压3.6V,使用了LDO(低压差线性稳压器)将输入电压VIN降到3.3v给微控制器供电。3.3V和GND之间的4个0.1uf的旁路电容(去除高频交流信号)接到了芯片的4个VDD和4个VSS上。最小开发板引脚图如下:
在这里插入图片描述

三、用Proteus 设计一个STM32最小系统板+LED流水灯实验原理图,仿真运行。
1.keil编写
点击project,选择new μvision project,创建工程名为lsd,点击保存,点击保存然后弹出的芯片选择,我们选择芯片STM32F103RB,然后点击ok。
在这里插入图片描述
我们再进行选择,对相应选项进行勾选,之后点击“OK"
在这里插入图片描述
工程创建完毕,开始创建源文件,点击file,选择new,写入代码,代码如下:
#include “stm32f10x.h”

GPIO_InitTypeDef GPIO_InitStructure;
void delay_ms(uint32_t ms)
{
uint32_t i_cnt,j_cnt;
for(i_cnt=0;i_cnt<3000;i_cnt++);
for(j_cnt=0;j_cnt<ms;j_cnt++);
}
uint32_t i;
int main(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIOC->BSRR=0xff;
while (1)
{
for(i=0;i<8;i++)
{
delay_ms(99000);
GPIOC->BRR=(1<<i);
delay_ms(99000);
GPIOC->BSRR=(1<<i);
}
for(i=0;i<8;i++)
{
delay_ms(99000);
GPIOC->BRR=0x000000ff;
delay_ms(99000);
GPIOC->BSRR=0x000000ff;
}
}
}
点击保存,这里的名称后缀必须是是.c。右键点击左侧project窗口的source Group1,选择相应的选项把.c文件添加到工程里。
在这里插入图片描述
添加成功
在这里插入图片描述
右键中选择Option for Target,然后勾选Create HEX file,编译生成hex文件。
在这里插入图片描述
2.Proteus仿真
点击创建新工程,输入工程名、安装路径,选择从选中的模板中创建原理图(DEFAULT),选择不创建PCB布版设计,选择创建固件项目,其中:系列选择Cortex-M3,Controller选择STM32F103R6,点击下一步。
在这里插入图片描述
点击完成,即可创建成功。

添加实验所需元件灯,点击左上角“P”字图标,输入LED-GREEN,并点击确认选中;添加实验所需电阻,点击左边P,然后进入下图,在关键字中输入RES,并点击确认选中。将灯和电阻分别添加到原理图,然后右键电阻,编辑电阻,设置其阻值为50。原理图如下:
在这里插入图片描述
二. 以 STM32最小系统核心板(STM32F103C8T6)+面板板+3只_(或更多)红绿蓝LED 搭建电路,使用GPIOA、GPIOB、GPIOC这3个端口控制LED灯,轮流闪烁,间隔时长1秒。
1)写出程序设计思路,包括GPIOx端口的各寄存器地址和详细参数;

两个32位的配置寄存器:GPIOx_CRL、GPIOx_CRH
两个32位数据寄存器:GPIOx_IDR、GPIOx_ODR
一个32位的置位/复位寄存器:GPIOx_BSRR
一个16位复位寄存器:GPIOx_BRR
一个32位锁定寄存器:GPIOx_LCKR

GPIO (General Purpose Input/Output) 端口的寄存器地址和详细参数通常是特定于微控制器或处理器的。

GPIOx寄存器组:
在STM32中,每个GPIO端口都有一个对应的寄存器组,用于控制该端口的各种功能。GPIOA、GPIOB、GPIOC 等代表不同的端口。

GPIOx_CRH 和 GPIOx_CRL 寄存器:配置端口的通用配置,如输入/输出模式、输出速度、上拉/下拉等。
GPIOx_ODR 寄存器:输出数据寄存器,用于设置或读取端口的输出状态。
GPIOx_IDR 寄存器:输入数据寄存器,用于读取端口的输入状态。
GPIOx_BSRR 寄存器:位设置/复位寄存器,用于设置或清除特定的端口位。
GPIOx_BRR 寄存器:位重置寄存器,用于清除特定的端口位。
GPIOx_LCKR 寄存器:锁定寄存器,用于配置端口的锁定状态以及配置事件触发。
寄存器参数和位说明:
下面是一些常见的寄存器参数和位说明,以 GPIOx_CRH 和 GPIOx_CRL 为例:

MODEy[1:0]:每个引脚的模式位,用于配置引脚的工作模式,例如输入、输出、复用功能等。
CNFy[1:0]:每个引脚的配置位,用于配置引脚的输入/输出类型(推挽、开漏)、上拉/下拉等。
OTy:输出类型位,用于配置引脚的输出类型(开漏或推挽)。
OSPEEDRy[1:0]:输出速度位,用于配置引脚的输出速度。
PUPDRy[1:0]:上拉/下拉配置位,用于配置引脚的上拉/下拉电阻状态。

2)用C语言寄存器方式编程实现,代码须有详细注解。

//--------------APB2使能时钟寄存器------------------------
#define RCC_AP2BENR ((unsigned volatile int)0x40021018)
//----------------GPIOA配置寄存器 ------------------------
#define GPIOA_CRL ((unsigned volatile int)0x40010800)
#define GPIOA_ODR ((unsigned volatile int)0x4001080C)
//----------------GPIOB配置寄存器 ------------------------
#define GPIOB_CRH ((unsigned volatile int)0x40010C04)
#define GPIOB_ODR ((unsigned volatile int)0x40010C0C)
//----------------GPIOC配置寄存器 ------------------------
#define GPIOC_CRH ((unsigned volatile int)0x40011004)
#define GPIOC_ODR ((unsigned volatile int)0x4001100C)
//-------------------简单的延时函数-----------------------
void SystemInit(void);
void Delay_ms(volatile unsigned int);
void A_LED_LIGHT(void);
void B_LED_LIGHT(void);
void C_LED_LIGHT(void);
void Delay_ms( volatile unsigned int t)
{
unsigned int i;
while(t–)
for (i=0;i<800;i++);
}
void A_LED_LIGHT(){
GPIOA_ODR=0x0<<5; //PA5低电平
GPIOB_ODR=0x1<<9; //PB9高电平
GPIOC_ODR=0x1<<14; //PC14高电平
}
void B_LED_LIGHT(){
GPIOA_ODR=0x1<<5; //PA5高电平
GPIOB_ODR=0x0<<9; //PB9低电平
GPIOC_ODR=0x1<<14; //PC14高电平
}
void C_LED_LIGHT(){
GPIOA_ODR=0x1<<5; //PA5高电平
GPIOB_ODR=0x1<<9; //PB9高电平
GPIOC_ODR=0x0<<14; //PC14低电平
}
//------------------------主函数--------------------------
int main()
{
int j=100;
RCC_APB2ENR|=1<<2; //APB2-GPIOA外设时钟使能
RCC_APB2ENR|=1<<3; //APB2-GPIOB外设时钟使能
RCC_APB2ENR|=1<<4; //APB2-GPIOC外设时钟使能
//这两行代码可以合为 RCC_APB2ENR|=1<<3|1<<4;
GPIOA_CRL&=0xFF0FFFFF; //设置位 清零
GPIOA_CRL|=0X00200000; //PA5推挽输出
GPIOA_ODR|=1<<5; //设置PA5初始灯为灭

GPIOB_CRH&=0xFFFFFF0F;		//设置位 清零	
GPIOB_CRH|=0x00000020;		//PB9推挽输出
GPIOB_ODR|=0x1<<9;			//设置初始灯为灭

GPIOC_CRH&=0xF0FFFFFF;		//设置位 清零
GPIOC_CRH|=0x02000000;   	//PC14推挽输出
GPIOC_ODR|=0x1<<14;			//设置初始灯为灭	
while(j)
{	
	A_LED_LIGHT();	
	Delay_ms(1000000);
	B_LED_LIGHT();
	Delay_ms(1000000);
	C_LED_LIGHT();
	Delay_ms(1000000);
}

}
void SystemInit(){

}

3)STM32最小系统核心板子出厂时已经焊接好了1个led灯(标注了PC13处),一般可通过此灯的点亮让编程者验证自己烧录的代码是否正常运行了。请查阅最小版电路原理图和相关资料,将这个灯也用在流水灯中,重编新程序。

最小版电路原理图
在这里插入图片描述
代码如下:、

在这里插入代//--------------APB2使能时钟寄存器------------------------
#define RCC_AP2BENR	*((unsigned volatile int*)0x40021018)
	//----------------GPIOA配置寄存器 ------------------------
#define GPIOA_CRL	*((unsigned volatile int*)0x40010800)
#define	GPIOA_ODR	*((unsigned volatile int*)0x4001080C)
//----------------GPIOB配置寄存器 ------------------------
#define GPIOB_CRH	*((unsigned volatile int*)0x40010C04)
#define	GPIOB_ODR	*((unsigned volatile int*)0x40010C0C)
//----------------GPIOC配置寄存器 ------------------------
#define GPIOC_CRH	*((unsigned volatile int*)0x40011004)
#define	GPIOC_ODR	*((unsigned volatile int*)0x4001100C)
//-------------------简单的延时函数-----------------------
void SystemInit(void);
void Delay_ms(volatile  unsigned  int);
void A_LED_LIGHT(void);
void B_LED_LIGHT(void);
void C_LED_LIGHT(void);
void  Delay_ms( volatile  unsigned  int  t)
{
     unsigned  int  i;
     while(t--)
         for (i=0;i<800;i++);
}
void A_LED_LIGHT(){
	GPIOA_ODR=0x0<<5;		//PA5低电平
	GPIOB_ODR=0x1<<9;		//PB9高电平
	GPIOC_ODR=0x1<<14;		//PC14高电平
}
void B_LED_LIGHT(){
	GPIOA_ODR=0x1<<5;		//PA5高电平
	GPIOB_ODR=0x0<<9;		//PB9低电平
	GPIOC_ODR=0x1<<14;		//PC14高电平
}
void C_LED_LIGHT(){
	GPIOA_ODR=0x1<<5;		//PA5高电平
	GPIOB_ODR=0x1<<9;		//PB9高电平
	GPIOC_ODR=0x0<<14;		//PC14低电平	
}
//------------------------主函数--------------------------
int main()
{
	int j=100;
	RCC_APB2ENR|=1<<2;			//APB2-GPIOA外设时钟使能
	RCC_APB2ENR|=1<<3;			//APB2-GPIOB外设时钟使能	
	RCC_APB2ENR|=1<<4;			//APB2-GPIOC外设时钟使能
	//这两行代码可以合为 RCC_APB2ENR|=1<<3|1<<4;
	GPIOA_CRL&=0xFF0FFFFF;		//设置位 清零	
	GPIOA_CRL|=0X00200000;		//PA5推挽输出
	GPIOA_ODR|=1<<5;			//设置PA5初始灯为灭
	
	GPIOB_CRH&=0xFFFFFF0F;		//设置位 清零	
	GPIOB_CRH|=0x00000020;		//PB9推挽输出
	GPIOB_ODR|=0x1<<9;			//设置初始灯为灭
	
	GPIOC_CRH&=0xF0FFFFFF;		//设置位 清零
	GPIOC_CRH|=0x02000000;   	//PC14推挽输出
	GPIOC_ODR|=0x1<<14;			//设置初始灯为灭	
	while(j)
	{	
		A_LED_LIGHT();	
		Delay_ms(1000000);
		B_LED_LIGHT();
		Delay_ms(1000000);
		C_LED_LIGHT();
		Delay_ms(1000000);
	}
}
void SystemInit(){
	
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值