• 10.1 LED灯实验(A7核和M4核)


    LED灯实验

    分析

    原理图

    LED灯的丝印为LD1,LD2,LD3
    通关原理图,可知三盏灯的引脚为LED1,LED2,LED3
    引脚写高电平,灯点亮;引脚写低电平,灯熄灭

    通过资源扩展板原理图,可知三盏灯的引脚为PE10,PF10,PE8

    在这里插入图片描述

    芯片手册

    RCC章节

    设置GPIOE,GPIOF控制器使能工作

    在这里插入图片描述

    GPIO章节

    GPIOx_MODER:GPIO模式寄存器----->设置为输出模式
    GPIOx_OTYPER:GPIO输出类型寄存器----->设置为推挽/开漏输出
    GPIOx_OSPEEDR:GPIO输出速度寄存器----->设置为输出速率
    GPIOx_PUPDR:GPIO是否需要上下拉电阻
    GPIOx_ODR:GPIO输出数据寄存器------>输出高低电平,实现LED灯点亮核熄灭

    下面以PE10为例
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述

    实现代码

    A7核

    gpio.h
    #ifndef __GPIO_H__
    #define __GPIO_H__
    
    typedef struct{
        volatile unsigned int MODER; //00
        volatile unsigned int OTYPER; //04
        volatile unsigned int OSPEEDR; //08
        volatile unsigned int PUPDR; //0C
        volatile unsigned int IDR; //10
        volatile unsigned int ODR; //14
    }gpio_t;
    
    #define GPIOE ((gpio_t*)0x50006000)
    #define GPIOF ((gpio_t*)0x50007000)
    
    #define RCC_AHB4_ENSETR  (*(volatile unsigned int*)0x50000A28)
    
    void LED1_INIT();
    
    void LED2_INIT();
    
    void LED3_INIT();
    
    void LED1_ON();
    
    void LED2_ON();
    
    void LED3_ON();
    
    void LED1_OFF();
    
    void LED2_OFF();
    
    void LED3_OFF();
    
    #endif
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    gpio.c
    #include "gpio.h"
    void LED1_INIT()
    {
    	RCC_AHB4_ENSETR |= (0x1 << 4);
    	GPIOE->MODER &=(~(0x3<<20));	
    	GPIOE->MODER |=(0x1<<20);	
    	GPIOE->OTYPER &=(~(0x1<<10));
    	GPIOE->OSPEEDR &=(~(0x3<<20));
    	GPIOE->PUPDR &=(~(0x3<<20));
    }
    
    void LED2_INIT()
    {
    	RCC_AHB4_ENSETR |= (0x1 << 5);
    	GPIOF->MODER &=(~(0x3<<20));	
    	GPIOF->MODER |=(0x1<<20);	
    	GPIOF->OTYPER &=(~(0x1<<10));
    	GPIOF->OSPEEDR &=(~(0x3<<20));
    	GPIOF->PUPDR &=(~(0x3<<20));
    
    }
    
    void LED3_INIT()
    {
    	RCC_AHB4_ENSETR |= (0x1 << 4);
    	GPIOE->MODER &=(~(0x3<<16));	
    	GPIOE->MODER |=(0x1<<16);	
    	GPIOE->OTYPER &=(~(0x1<<8));
    	GPIOE->OSPEEDR &=(~(0x3<<16));
    	GPIOE->PUPDR &=(~(0x3<<16));
    }
    
    void LED1_ON()
    {
    	GPIOE->ODR |=(0x1<<10);
    }
            
    void LED2_ON()
    {
    	GPIOF->ODR |=(0x1<<10);
    }
                        
    void LED3_ON()
    {
    	GPIOE->ODR |=(0x1<<8);
    }  
                        
    void LED1_OFF()
    {
    	GPIOE->ODR &=(~(0x1<<10));
    }
                        
    void LED2_OFF()
    {
    	GPIOF->ODR &=(~(0x1<<10));
    }  
                        
    void LED3_OFF()
    {
    	GPIOE->ODR &=(~(0x1<<8));
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    main.c
    #include "gpio.h"
    extern void printf(const char *fmt, ...);
    void delay_ms(int ms)
    {
    	int i,j;
    	for(i = 0; i < ms;i++)
    		for (j = 0; j < 1800; j++);
    }
    
    int main()
    {
    	LED1_INIT();
    	LED2_INIT();
    	LED3_INIT();
    	while(1)
    	{
    		LED1_ON();
    		delay_ms(500);
    		LED1_OFF();
    		LED2_ON();
    		delay_ms(500);
    		LED2_OFF();
    		LED3_ON();
    		delay_ms(500);
    		LED3_OFF();
    	}
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    M4核

    使用CubMX创建工程
    并完成上述分析过程中的寄存器相应位的修改
    生成代码,并在main.c中加入自己的功能代码

    while (1)
      {
        /* USER CODE END WHILE */
    		HAL_GPIO_WritePin(GPIOF, GPIO_PIN_10, GPIO_PIN_SET);
    		HAL_Delay(500);
    		HAL_GPIO_WritePin(GPIOF, GPIO_PIN_10, GPIO_PIN_RESET);
    		
    		HAL_GPIO_WritePin(GPIOE, GPIO_PIN_10, GPIO_PIN_SET);
    		HAL_Delay(500);
    		HAL_GPIO_WritePin(GPIOE, GPIO_PIN_10, GPIO_PIN_RESET);
    		
    		HAL_GPIO_WritePin(GPIOE, GPIO_PIN_8, GPIO_PIN_SET);
    		HAL_Delay(500);
    		HAL_GPIO_WritePin(GPIOE, GPIO_PIN_8, GPIO_PIN_RESET);
    
        /* USER CODE BEGIN 3 */
      }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    实验现象

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  • 相关阅读:
    自学黑客【网络安全】,一般人我劝你还是算了吧
    nodejs 启动第三方exe
    YOLO免费数据集网站收集
    哪些岗位需要考CDMP/CDGA/CDGP证书?
    CSP-J 2023 T3 一元二次方程 解题报告
    android--TextView在刷新时宽度变大的问题排查记录
    Kafka消费者重平衡
    springBoot复杂对象表示和lombok的使用
    Java日期时间处理详解
    【UE】富文本块(RichTextBlock) 增加超链接支持
  • 原文地址:https://blog.csdn.net/wjm_ACGN/article/details/127137294