目录

一、设计分析及代码思路

1.实现流水灯步骤

2.代码设计过程

二、创建项目

1.新建项目

2.编写代码

三、仿真运行

四、连接电路

1.器件连接

2.程序烧录

五、代码烧录及实现

1.烧录实现

2.流水灯实现

六、总结


一、设计分析及代码思路

1.实现流水灯步骤

  •  配置时钟使能寄存器
  • 配置端口寄存器
  • 设置输出模式
  • 实物连接及代码运行烧录
  • 实现流水灯

2.代码设计过程

  • 配置APB2外设时钟使能寄存器

该时钟的初始地址位0x40021000,偏移地址位0x18,所以寄存器的地址=0x40021018.

#define RCC_APB2ENR *((unsigned int*)0x40021018)//定义APB2时钟使能寄存器
//打开时钟

寄存器的位2、位3、位4分别对应A、B、C口,要开启GPIOA、GPIOB、GPIOC口的时钟,只需要将位2、位3、位4置1即可。

	RCC_APB2ENR |=1<<2;//开启GPIOA时钟
	RCC_APB2ENR |=1<<3;//开启GPIOB时钟
	RCC_APB2ENR |=1<<4;//开启GPIOC时钟
  • 配置端口寄存器

找到初始地址和偏移地址,进而配置对应引脚的寄存器。

//配置寄存器,GPIOC端口配置高寄存器,GPIOA和GPIOB端口配置低寄存器
#define GPIOA_CRL *((unsigned int*)0x40010800)//GPIOA   PA5
#define GPIOB_CRL *((unsigned int*)0x40010C00)//GPIOB   PB1
#define GPIOC_CRH *((unsigned int*)0x40011004)//GPIOC   PC14

  • 配置输出寄存器

找到初始地址和偏移地址,设置输出寄存器。

//配置输出寄存器
#define GPIOA_ODR *((unsigned int*)0x4001080C)
#define GPIOB_ODR *((unsigned int*)0x40010C0C)
#define GPIOC_ODR *((unsigned int*)0x4001100C)
  • 设置输出模式

    GPIOA_CRL |=(2<<(5*4));//PA5接口,偏移5*4 设置推免输出模式2MHz  0010
	GPIOB_CRL |=(2<<(1*4));//PB1接口,偏移1*4,设置推免输出模式2MHz  0010
	GPIOC_CRH |=(2<<(6*4));//PC14接口,偏移6*4,设置推免输出模式2MHz  0010
	
  • 设置灯的状态

初始状态下,先将所有的灯熄灭,需要对应的GPIO口输出高电平。

	GPIOA_ODR=0x1<<5;//GPIOA口输出高点平,灯灭
	GPIOB_ODR=0x1<<1;//GPIOB口输出高点平,灯灭
	GPIOC_ODR=0x1<<14;//GPIOC口输出高点平,灯灭
	

二、创建项目

1.新建项目

点击Project下的New uVision Project,选择项目路径,填写文件名,选择STM32F103C8芯片。

再点击Source Group 1文件夹,右击Add New Item to Group "Source Group 1"添加新文件,选择.c,命名为main。

将所需要的启动文件复制到项目目录下,f103c8t6启动文件为startup_stm32f10x_md.s

再右击文件夹,选择Add Existing Files to Group Source Group 1,选择All Files,选择刚才添加的启动文件,点击Add。

添加完成之后,点击魔法棒,点击Output,勾选Create HEX File。

在main.c中写入函数。

void SystemInit(void);

int main(){
	
}

void SystemInit(){
	
	
}

进行编译。

2.编写代码

加上循环,那么需要延时函数。

void Delay_ms( volatile  unsigned  int  t)
{
     unsigned  int  i;
     while(t--)
         for (i=0;i<800;i++);
}

#define RCC_APB2ENR *((unsigned int*)0x40021018)//定义APB2时钟使能寄存器
//配置寄存器,GPIOC端口配置高寄存器,GPIOA和GPIOB端口配置低寄存器
#define GPIOA_CRL *((unsigned int*)0x40010800)//GPIOA   PA5
#define GPIOB_CRL *((unsigned int*)0x40010C00)//GPIOB   PB1
#define GPIOC_CRH *((unsigned int*)0x40011004)//GPIOC   PC14
//配置输出寄存器
#define GPIOA_ODR *((unsigned int*)0x4001080C)
#define GPIOB_ODR *((unsigned int*)0x40010C0C)
#define GPIOC_ODR *((unsigned int*)0x4001100C)
void SystemInit(void);
void Delay_ms(volatile  unsigned  int);
void delayms(unsigned int ms)//定义延时函数
{
	unsigned int i;
	while(ms--)
	{
	 i=12000;
		while(i--);
	};//for(i=110;i>0;i--);
}//延时1s为delayms(1000)
int main()
{
	RCC_APB2ENR |=1<<2;//开启GPIOA时钟
	RCC_APB2ENR |=1<<3;//开启GPIOB时钟
	RCC_APB2ENR |=1<<4;//开启GPIOC时钟
	
	GPIOA_CRL |=(2<<(5*4));//PA5接口,偏移5*4 设置推免输出模式2MHz  0010
	GPIOB_CRL |=(2<<(1*4));//PB1接口,偏移1*4,设置推免输出模式2MHz  0010
	GPIOC_CRH |=(2<<(6*4));//PC14接口,偏移6*4,设置推免输出模式2MHz  0010
	
	GPIOA_ODR=0x1<<5;//GPIOA口输出高点平,灯灭
	GPIOB_ODR=0x1<<1;//GPIOB口输出高点平,灯灭
	GPIOC_ODR=0x1<<14;//GPIOC口输出高点平,灯灭
	while(1)
	{
		//GPIOA口输出低电平,GPIOB输出高电平,GPIOC输出高电平,只有红灯亮
		GPIOA_ODR=0x0<<5;
		GPIOB_ODR=0x1<<1;
		GPIOC_ODR=0x1<<14;
		delayms(1000);
    
		//GPIOB口输出低电平,GPIOA输出高电平,GPIOC输出高电平,只有绿灯亮
		GPIOB_ODR=0x0<<1;
		GPIOA_ODR=0x1<<5;
		GPIOC_ODR=0x1<<14;
		delayms(1000);
		
		//GPIOC口输出低电平,GPIOB输出高电平,GPIOA输出高电平,只有黄灯亮
		GPIOC_ODR=0x0<<14;
		GPIOA_ODR=0x1<<5;
		GPIOB_ODR=0x1<<1;
		delayms(1000);
		
	}
}
void SystemInit(){
	
}

三、仿真运行

四、连接电路

1.器件连接

STM32F103C8T6不能直接与电脑连接,需要用转换器,采用USB TO TTL,将其与最小核心板对应接口用杜邦线链接,其中3v3接核心板3v3,GND接GND,RXD接A9,TXD接A10,按照电路图进行连接,连接结果如下。

将板子上的BOOTO置1,才能进入工作模式。

2.程序烧录

五、代码烧录及实现

1.烧录实现

2.流水灯实现

六、总结

在此次实验中,我学会了如何利用STM32F103C8T6最小系统模板,并且运用寄存器的方式点亮并实现LED流水灯。本次实验让我对Keil和Proteus的使用更加熟练,在实验过程中也遇到许多问题,由于Proteus的版本问题导致无法使用STM系列的芯片、启动文件的添加、程序没有SystemInit函数编译一直报错、烧录时连接不上等等问题,好在通过查询资料都顺利解决,然而本次实验也只是STM32学习的入门,需要多加练习。

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐