本次作业是对之前的总结复习,实际内容差不过,自己再过一边记忆更加深刻一点,首先是led灯A7核实验头文件部分的代码包含(本次代码内容是进行过封装的,更规整一点)
- #ifndef __GPIO_H__
- #define __GPIO_H__
-
- //1.RCC寄存器封装,用宏定义进行封装
-
- #define RCC_AHB4ENSTER *(volatile unsigned int *)0x50000A28
- //2.GPIO寄存器进行封装,用结构体
-
- typedef struct
- {
- volatile unsigned int MODER;
- volatile unsigned int OTYPER;
- volatile unsigned int OSPEEDR;
- volatile unsigned int PUPDR;
- volatile unsigned int IDR;
- volatile unsigned int ODR;
-
- }gpio_t;
- #define GPIOE ((gpio_t *)0x50006000)
- #define GPIOF ((gpio_t *)0x50007000)
-
- /*typedef struct
- {
- LED1 =1;
- LED2 =1;
- LED3 =1;
- }led_t;*/
-
- //封装模式寄存器
- typedef enum
- {
- INPUT,
- OUTPUT,
- ALT,
- ANALOG,
- }gpio_mode_t;
-
- //封装输出类型寄存器
- typedef enum
- {
- PUSHPUT,
- OPENPUT,
- }gpio_otyper_t;
-
- //封装输出速度寄存器
- typedef enum
- {
- LOW, //00
- MEDIUM, //01
- HIGH, //10
- VERYHIGH, //11
- }gpio_ospeedr_t;
-
- //封装是否需要上下拉电阻
- typedef enum
- {
- NO, //00
- PULLUP, //01
- PULLDOWN, //10
- RESERVER, //11
-
- }gpio_pupdr_t;
-
- typedef enum
- {
- RESET, //清0
- SET, //置1
-
- }gpio_status_t;
-
-
-
- //结构体初始化
- typedef struct
- {
- gpio_mode_t moder;
- gpio_otyper_t otyper;
- gpio_ospeedr_t speedr;
- gpio_pupdr_t pupdr;
-
- }gpio_init_t;
-
-
- //引脚封装
- #define GPIO_PIN_0 0
- #define GPIO_PIN_1 1
- #define GPIO_PIN_2 2
- #define GPIO_PIN_3 3
- #define GPIO_PIN_4 4
- #define GPIO_PIN_5 5
- #define GPIO_PIN_6 6
- #define GPIO_PIN_7 7
- #define GPIO_PIN_8 8
- #define GPIO_PIN_9 9
- #define GPIO_PIN_10 10
- #define GPIO_PIN_11 11
- #define GPIO_PIN_12 12
- #define GPIO_PIN_13 13
- #define GPIO_PIN_14 14
- #define GPIO_PIN_15 15
-
-
-
- //初始化函数
- void hal_gpio_init(gpio_t* gpiox,gpio_init_t* init,unsigned int pin);
-
- //写操作函数
- void hal_gpio_write(gpio_t* gpiox, unsigned int pin, gpio_status_t state);
-
- #endif
其实是功能函数的代码段,包括对灯的初始化已经灯亮和灯灭的操作,亮灭结合到一个函数内了
- #include"gpio2.h"
-
-
- void hal_gpio_init(gpio_t* gpiox,gpio_init_t* init,unsigned int pin)
- {
- //设置输出模式
- gpiox->MODER &=~(0x3 << (pin*2));
- gpiox->MODER |=(init->moder << (pin*2));
-
- //设置输出类型
- gpiox->OTYPER &=~(0x1 << pin);
- gpiox->OTYPER |= (init->speedr << (pin*2));
- //设置输出速度
- gpiox->OSPEEDR &=~(0X3 << (pin*2));
- gpiox->OSPEEDR |= (init->otyper << pin);
- //设置是否需要上下拉
- gpiox->PUPDR &=~(0x3 << (pin*2));
- gpiox->PUPDR |=(init->pupdr << (pin*2));
-
-
- }
-
- void hal_gpio_write(gpio_t* gpiox, unsigned int pin, gpio_status_t state)
- {
- if(state == RESET)
- {
- gpiox->ODR &= ~(0x1 << pin);
-
- }
- else
- {
- gpiox->ODR |=(0x1 <
-
- }
-
- }
最后是main主函数的调用部分,调用初始化灯函数和亮灭函数,放进while循环内一直亮灭
- #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++);
-
- }
-
-
-
-
-
- void led_init()
-
- {
-
- RCC_AHB4ENSTER |= (0x3 << 4);
-
- //led灯结构体初始化
-
- gpio_init_t init = {OUTPUT,PUSHPUT,LOW,NO};
-
-
-
- hal_gpio_init(GPIOE,&init,GPIO_PIN_10);
-
- hal_gpio_init(GPIOF,&init,GPIO_PIN_10);
-
- hal_gpio_init(GPIOE,&init,GPIO_PIN_8);
-
-
-
- }
-
-
-
-
-
- int main()
-
- {
-
- led_init();
-
- while(1)
-
- {
-
- hal_gpio_write(GPIOE,GPIO_PIN_10,SET);
-
- delay_ms(500);
-
- hal_gpio_write(GPIOE,GPIO_PIN_10,SET);
-
- // hal_gpio_write(GPIO,GPIO_PIN_10,RESET);
-
- }
-
- return 0;
-
- }
本次实验将三个led灯结合在了一起写,最后调用的时候就选择了其中一个灯进行实验
后面的是用M4核写的代码,需要用stm32CUBE软件编写,我把主要的代码写了一遍
- void HAL_GPIO_EXTI_Falling_Callback(uint16_t GPIO_Pin)
- {
- switch(GPIO_Pin)
- {
- case GPIO_PIN_7;
- HAL_GPIO_TogglePin(GPIOF,GPIO_PIN_10);
- break;
-
- case GPIO_PIN_8;
- HAL_GPIO_TogglePin(GPIOE,GPIO_PIN_10);
- break;
-
- case GPIO_PIN_9;
- HAL_GPIO_TogglePin(GPIOF,GPIO_PIN_8);
- break;
-
-
-
- }
-
-
- }