【STM32】STM32F103 LED亮灭教程(版本1:寄存器地址控制)

目录

  • 一、实验要求
  • 二、STM32介绍
  • 1、STM32F103C8T6
  • 2、GPIOx端口的各寄存器地址
  • 三、实践
  • 实验代码
  • 仿真图
  • 仿真结果
  • 实践结果
  • 四、总结
  • 一、实验要求

    1、了解stm32f103c8t6最小核心板的主要引脚接口;

    2、掌握Keil 开发stm32程序的环境搭建和设置;

    3、使用GPIO引脚,外接LED灯,编写程序让LED灯周期性亮灭。

    二、STM32介绍

    1、STM32F103C8T6


    核心板原理图

    2、GPIOx端口的各寄存器地址

    端口配置低寄存器(GPIOx_CRL)(x=A…E)

    端口配置高寄存器(GPIOx_CRH)(x=A…E)

    端口输入数据寄存器(GPIOx_IDR)(x=A…E)

    端口输出数据寄存器(GPIOx_ODR)(x=A…E)

    端口位设置/复位寄存器(GPIOx_BSRR)(x=A…E)

    端口位复位寄存器(GPIOx_BRR)(x=A…E)

    端口配置锁定寄存器(GPIOx_LCKR)(x=A…E)

    三、实践

    实验代码

     
    #define GPIOB_BASE 0x40010C00
    #define GPIOC_BASE 0x40011000
    #define GPIOA_BASE 0x40010800
     
    #define RCC_APB2ENR (*(unsigned int *)0x40021018)
     
    #define GPIOB_CRH (*(unsigned int *)0x40010C04)
    #define GPIOC_CRH (*(unsigned int *)0x40011004)
    #define GPIOA_CRL (*(unsigned int *)0x40010800)
     
    #define GPIOB_ODR (*(unsigned int *)0x40010C0C)
    #define GPIOC_ODR (*(unsigned int *)0x4001100C)
    #define GPIOA_ODR (*(unsigned int *)0x4001080C)
    	
     
     
    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<<4;		//PA4低电平
    	GPIOB_ODR=0x1<<9;		//PB9高电平
    	GPIOC_ODR=0x1<<13;		//PC13高电平
    }
    void B_LED_LIGHT(){
    	GPIOA_ODR=0x1<<4;		//PA4高电平
    	GPIOB_ODR=0x0<<9;		//PB9低电平
    	GPIOC_ODR=0x1<<13;		//PC13高电平
    }
    void C_LED_LIGHT(){
    	GPIOA_ODR=0x1<<4;		//PA4高电平
    	GPIOB_ODR=0x1<<9;		//PB9高电平
    	GPIOC_ODR=0x0<<13;		//PC13低电平	
    }
     
    int main(){
    	int j=100;
    	// 开启时钟
    	RCC_APB2ENR |= (1<<3); // 开启 GPIOB 时钟
    	RCC_APB2ENR |= (1<<4); // 开启 GPIOC 时钟
    	RCC_APB2ENR |= (1<<2); // 开启 GPIOA 时钟
    	
    	
    	// 设置 GPIO 为推挽输出
    	GPIOB_CRH&= 0xffffff0f;	//设置位 清零		
    	GPIOB_CRH|=0x00000020;  //PB9推挽输出
     
    	GPIOC_CRH &= 0xff0fffff; //设置位 清零		
    	GPIOC_CRH|=0x00300000;  //PC15推挽输出
     
     
    	GPIOA_CRL &= 0xfff0ffff; //设置位 清零		
    	GPIOA_CRL|=0x00010000; //PA4推挽输出
     
    	// 3个LED初始化为不亮(即高点位)
    	GPIOB_ODR |= (1<<9); 
    	GPIOC_ODR |= (1<<13); 
    	GPIOA_ODR |= (1<<4);  
    	
    	while(j){
    		
    		B_LED_LIGHT();
    		Delay_ms(2000);//单片机上2000    100
     
    		C_LED_LIGHT();
    		Delay_ms(3000);//单片机上3000    200
     
    		A_LED_LIGHT();
    		Delay_ms(3000);//单片机上3000    200
    	}
    	
    }
     
     
    void SystemInit(){
    	
    }
    

    仿真图

    仿真结果

    实践结果

    四、总结

    本次在STM32F103核心板控制器下,通过电路搭建实现LED灯轮流闪烁的实验是嵌入式系统开发中较为基础的东西。
    以上为此次学习成果,若有问题,烦请指正。

    作者:normog

    物联沃分享整理
    物联沃-IOTWORD物联网 » 【STM32】STM32F103 LED亮灭教程(版本1:寄存器地址控制)

    发表回复