使用STM32F103点亮流水灯的教程

目录

一、设计分析及代码思路

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学习的入门,需要多加练习。

    作者:m0_70632584

    物联沃分享整理
    物联沃-IOTWORD物联网 » 使用STM32F103点亮流水灯的教程

    发表评论