• 用C语言实现,点亮小灯,让其闪烁


    本实验采用的是华清远见的stm32mp157开发板

    首先差芯片手册,搞清楚LED123分别是什么引脚(LED1:PE10,LED2:PF10,LED3:PE8)

    然后再找到小灯所在的组,GPIOE和GPIOF的地址(地址=基地址+偏移地址)结论:0x50006000,偏移0x0 。

    分别查看需要的寄存器功能MODER、OTYPER、OSPEEDR、PUPDR、ODR

    在汇编语言中,0x50006000是地址,也可以是值,但是在C中,只是一个常量,不能修改。所以,要用强制类型转换,将它转换成指针类型。

    它们的地址分别偏移为00、04、08、0C、14,为了方便起见,用结构体定义它们,因为它们之间偏移刚刚好为4,与int相同。所以用无符号int类型进行定义,并用volatile修饰

    但是,ODR与PUPDR之间间隔为8,所以需要补上IDR

    1. typedef struct
    2. {
    3. volatile unsigned int MODER; //00
    4. volatile unsigned int OTYPER; //04
    5. volatile unsigned int OSPEEDR; //08
    6. volatile unsigned int PUPDR; //0c
    7. volatile unsigned int IDR; //10
    8. volatile unsigned int ODR; //14
    9. }gpio_t;

    还有RCC让

    1. //1.RCC寄存器封装,用宏定义进行封装
    2. #define RCC_AHB4_ENSETR (*(volatile unsigned int*)0x50000A28)

    然后是功能函数部分

    1. //1..LED1灯初始化
    2. void LED1_init()
    3. {
    4. //0.设置GPIOE时钟使能
    5. RCC_AHB4_ENSETR |= (1 << 4);
    6. //1.设置PE10引脚为输出模式
    7. GPIOE->MODER &= ~(1 << 21);
    8. GPIOE->MODER |= (1 << 20);
    9. //2.设置PE10引脚为推挽输出
    10. GPIOE->OTYPER &= ~(1 << 10);
    11. //3.设置PE10引脚为低速模式
    12. GPIOE->OSPEEDR &= ~(0x3 << 20);
    13. //4.设置PE10引脚禁止上下拉
    14. GPIOE->PUPDR &= ~(0x3 << 20);
    15. }

    LED2、3大同小异.

    LED2是PF10端口,设置GPIOF时钟使能为

    RCC_AHB4_ENSETR |= (1 << 5);
    

    LED3是PF8端口,差手册可知,引脚为17、16位,要将LED1里的21、20替换成16、17

    最后设置引脚

    输出高低电平

    1. void LED_ON()
    2. {
    3. //1.设置PE10引脚输出高电平
    4. GPIOE->ODR |= (1 << 10);
    5. GPIOF->ODR |= (1 << 10);
    6. GPIOE->ODR |= (1 << 8);
    7. }
    8. //3..LED1熄灭
    9. void LED_OFF()
    10. {
    11. //1.设置PE10引脚输出低电平
    12. GPIOE->ODR &= ~(1 << 10);
    13. GPIOF->ODR &= ~(1 << 10);
    14. GPIOE->ODR &= ~(1 << 8);
    15. }

    主函数内,写一个延时函数,输入单位为毫秒

    1. void delay_ms(int ms)
    2. {
    3. int i,j;
    4. for(i = 0; i < ms;i++)
    5. for (j = 0; j < 1800; j++);
    6. }

    然后主函数内使能后,就可随意使用led灯了,流水灯还是一起亮,悉听尊便。

    本人图个方便,采用的方法为一起亮

    以下是全部代码

    .h文件

    1. #ifndef __GPIO_H__
    2. #define __GPIO_H__
    3. //1.RCC寄存器封装,用宏定义进行封装
    4. #define RCC_AHB4_ENSETR (*(volatile unsigned int*)0x50000A28)
    5. //2.GPIO寄存器进行封装,用结构体
    6. typedef struct
    7. {
    8. volatile unsigned int MODER; //00
    9. volatile unsigned int OTYPER; //04
    10. volatile unsigned int OSPEEDR; //08
    11. volatile unsigned int PUPDR; //0c
    12. volatile unsigned int IDR; //10
    13. volatile unsigned int ODR; //14
    14. }gpio_t;
    15. #define GPIOE ((gpio_t*)0x50006000)
    16. #define GPIOF ((gpio_t*)0x50007000)
    17. //3.LED1灯初始化
    18. void LED1_init();
    19. void LED2_init();
    20. void LED3_init();
    21. //4.LED1灯点亮
    22. void LED_ON();
    23. //5.LED1灯熄灭
    24. void LED_OFF();
    25. #endif

    功能函数:

    1. #include "gpio.h"
    2. //1..LED1灯初始化
    3. void LED1_init()
    4. {
    5. //0.设置GPIOE时钟使能
    6. RCC_AHB4_ENSETR |= (1 << 4);
    7. //1.设置PE10引脚为输出模式
    8. GPIOE->MODER &= ~(1 << 21);
    9. GPIOE->MODER |= (1 << 20);
    10. //2.设置PE10引脚为推挽输出
    11. GPIOE->OTYPER &= ~(1 << 10);
    12. //3.设置PE10引脚为低速模式
    13. GPIOE->OSPEEDR &= ~(0x3 << 20);
    14. //4.设置PE10引脚禁止上下拉
    15. GPIOE->PUPDR &= ~(0x3 << 20);
    16. }
    17. void LED2_init() //PF10引脚
    18. {
    19. RCC_AHB4_ENSETR |= (1 << 5);
    20. GPIOF->MODER &= ~(1 << 21);
    21. GPIOF->MODER |= (1 << 20);
    22. GPIOF->OTYPER &= ~(1 << 10);
    23. GPIOF->OSPEEDR &= ~(0x3 << 20);
    24. GPIOF->PUPDR &= ~(0x3 << 20);
    25. }
    26. void LED3_init() //PE8引脚
    27. {
    28. //RCC_AHB4_ENSETR |= (1 << 4); //第一盏灯已经使能,不需要重复进行
    29. GPIOE->MODER &= ~(1 << 17);
    30. GPIOE->MODER |= (1 << 16);
    31. GPIOE->OTYPER &= ~(1 << 8);
    32. GPIOE->OSPEEDR &= ~(0x3 << 16);
    33. GPIOE->PUPDR &= ~(0x3 << 16);
    34. }
    35. //2..LED1点亮
    36. void LED_ON()
    37. {
    38. //1.设置PE10引脚输出高电平
    39. GPIOE->ODR |= (1 << 10);
    40. GPIOF->ODR |= (1 << 10);
    41. GPIOE->ODR |= (1 << 8);
    42. }
    43. //3..LED1熄灭
    44. void LED_OFF()
    45. {
    46. //1.设置PE10引脚输出低电平
    47. GPIOE->ODR &= ~(1 << 10);
    48. GPIOF->ODR &= ~(1 << 10);
    49. GPIOE->ODR &= ~(1 << 8);
    50. }

    主函数随意

    附上运行结果

    小灯

  • 相关阅读:
    1 什么是MyBatis?
    算法试题——每日一练
    Java内存模型基础(JMM)
    1封开发信收获7个客户订单,怎么做到21%回复率的?(内涵英文邮件模板)
    springboot校园失物招领网站系统在线视频点播系统毕业设计毕设作品开题报告开题答辩PPT
    2022赣政杯---Writeup
    义乌外贸新趋势:跨境电商引领“内外兼修”
    使用IDEA创建maven父子工程项目
    .NET实现解析字符串表达式
    ONLYOFFICE 桌面编辑器 v8.0 更新内容详细攻略
  • 原文地址:https://blog.csdn.net/laoKdx/article/details/126840656