• 2022-10-1 ARM-LED灯实验(复习)


    本次作业是对之前的总结复习,实际内容差不过,自己再过一边记忆更加深刻一点,首先是led灯A7核实验头文件部分的代码包含(本次代码内容是进行过封装的,更规整一点)

    1. #ifndef __GPIO_H__
    2. #define __GPIO_H__
    3. //1.RCC寄存器封装,用宏定义进行封装
    4. #define RCC_AHB4ENSTER *(volatile unsigned int *)0x50000A28
    5. //2.GPIO寄存器进行封装,用结构体
    6. typedef struct
    7. {
    8. volatile unsigned int MODER;
    9. volatile unsigned int OTYPER;
    10. volatile unsigned int OSPEEDR;
    11. volatile unsigned int PUPDR;
    12. volatile unsigned int IDR;
    13. volatile unsigned int ODR;
    14. }gpio_t;
    15. #define GPIOE ((gpio_t *)0x50006000)
    16. #define GPIOF ((gpio_t *)0x50007000)
    17. /*typedef struct
    18. {
    19. LED1 =1;
    20. LED2 =1;
    21. LED3 =1;
    22. }led_t;*/
    23. //封装模式寄存器
    24. typedef enum
    25. {
    26. INPUT,
    27. OUTPUT,
    28. ALT,
    29. ANALOG,
    30. }gpio_mode_t;
    31. //封装输出类型寄存器
    32. typedef enum
    33. {
    34. PUSHPUT,
    35. OPENPUT,
    36. }gpio_otyper_t;
    37. //封装输出速度寄存器
    38. typedef enum
    39. {
    40. LOW, //00
    41. MEDIUM, //01
    42. HIGH, //10
    43. VERYHIGH, //11
    44. }gpio_ospeedr_t;
    45. //封装是否需要上下拉电阻
    46. typedef enum
    47. {
    48. NO, //00
    49. PULLUP, //01
    50. PULLDOWN, //10
    51. RESERVER, //11
    52. }gpio_pupdr_t;
    53. typedef enum
    54. {
    55. RESET, //清0
    56. SET, //置1
    57. }gpio_status_t;
    58. //结构体初始化
    59. typedef struct
    60. {
    61. gpio_mode_t moder;
    62. gpio_otyper_t otyper;
    63. gpio_ospeedr_t speedr;
    64. gpio_pupdr_t pupdr;
    65. }gpio_init_t;
    66. //引脚封装
    67. #define GPIO_PIN_0 0
    68. #define GPIO_PIN_1 1
    69. #define GPIO_PIN_2 2
    70. #define GPIO_PIN_3 3
    71. #define GPIO_PIN_4 4
    72. #define GPIO_PIN_5 5
    73. #define GPIO_PIN_6 6
    74. #define GPIO_PIN_7 7
    75. #define GPIO_PIN_8 8
    76. #define GPIO_PIN_9 9
    77. #define GPIO_PIN_10 10
    78. #define GPIO_PIN_11 11
    79. #define GPIO_PIN_12 12
    80. #define GPIO_PIN_13 13
    81. #define GPIO_PIN_14 14
    82. #define GPIO_PIN_15 15
    83. //初始化函数
    84. void hal_gpio_init(gpio_t* gpiox,gpio_init_t* init,unsigned int pin);
    85. //写操作函数
    86. void hal_gpio_write(gpio_t* gpiox, unsigned int pin, gpio_status_t state);
    87. #endif

    其实是功能函数的代码段,包括对灯的初始化已经灯亮和灯灭的操作,亮灭结合到一个函数内了

    1. #include"gpio2.h"
    2. void hal_gpio_init(gpio_t* gpiox,gpio_init_t* init,unsigned int pin)
    3. {
    4. //设置输出模式
    5. gpiox->MODER &=~(0x3 << (pin*2));
    6. gpiox->MODER |=(init->moder << (pin*2));
    7. //设置输出类型
    8. gpiox->OTYPER &=~(0x1 << pin);
    9. gpiox->OTYPER |= (init->speedr << (pin*2));
    10. //设置输出速度
    11. gpiox->OSPEEDR &=~(0X3 << (pin*2));
    12. gpiox->OSPEEDR |= (init->otyper << pin);
    13. //设置是否需要上下拉
    14. gpiox->PUPDR &=~(0x3 << (pin*2));
    15. gpiox->PUPDR |=(init->pupdr << (pin*2));
    16. }
    17. void hal_gpio_write(gpio_t* gpiox, unsigned int pin, gpio_status_t state)
    18. {
    19. if(state == RESET)
    20. {
    21. gpiox->ODR &= ~(0x1 << pin);
    22. }
    23. else
    24. {
    25. gpiox->ODR |=(0x1 <
    26. }
    27. }

    最后是main主函数的调用部分,调用初始化灯函数和亮灭函数,放进while循环内一直亮灭

    1. #include "gpio.h"
    2. extern void printf(const char *fmt, ...);
    3. void delay_ms(int ms)
    4. {
    5. int i,j;
    6. for(i = 0; i < ms;i++)
    7. for (j = 0; j < 1800; j++);
    8. }
    9. void led_init()
    10. {
    11. RCC_AHB4ENSTER |= (0x3 << 4);
    12. //led灯结构体初始化
    13. gpio_init_t init = {OUTPUT,PUSHPUT,LOW,NO};
    14. hal_gpio_init(GPIOE,&init,GPIO_PIN_10);
    15. hal_gpio_init(GPIOF,&init,GPIO_PIN_10);
    16. hal_gpio_init(GPIOE,&init,GPIO_PIN_8);
    17. }
    18. int main()
    19. {
    20. led_init();
    21. while(1)
    22. {
    23. hal_gpio_write(GPIOE,GPIO_PIN_10,SET);
    24. delay_ms(500);
    25. hal_gpio_write(GPIOE,GPIO_PIN_10,SET);
    26. // hal_gpio_write(GPIO,GPIO_PIN_10,RESET);
    27. }
    28. return 0;
    29. }

    本次实验将三个led灯结合在了一起写,最后调用的时候就选择了其中一个灯进行实验

    后面的是用M4核写的代码,需要用stm32CUBE软件编写,我把主要的代码写了一遍

    1. void HAL_GPIO_EXTI_Falling_Callback(uint16_t GPIO_Pin)
    2. {
    3. switch(GPIO_Pin)
    4. {
    5. case GPIO_PIN_7;
    6. HAL_GPIO_TogglePin(GPIOF,GPIO_PIN_10);
    7. break;
    8. case GPIO_PIN_8;
    9. HAL_GPIO_TogglePin(GPIOE,GPIO_PIN_10);
    10. break;
    11. case GPIO_PIN_9;
    12. HAL_GPIO_TogglePin(GPIOF,GPIO_PIN_8);
    13. break;
    14. }
    15. }

  • 相关阅读:
    信息抽取在旅游行业的应用:以景点信息抽取为例
    渲染路径RenderingPath
    HLS最全知识库
    Ubuntu20.04下vim的安装,配置及使用
    自定义实现hashmap-python
    0基础学习VR全景平台篇 第97篇:VR步进式漫游
    python 一次性删除列表(list)的空白元素(空内容) 或者 一次性删除列表(list)中的指定元素
    创建内核线程模拟 cpu 占用率 100% 以触发系统异常
    [2022-11-07]神经网络与深度学习第4章 - 卷积神经网络(part 5)
    git 修改远程地址
  • 原文地址:https://blog.csdn.net/m0_58344947/article/details/127137748