STM32 控制LED灯

待我称王封你为后i 2022-04-22 15:38 429阅读 0赞

STM32 控制LED灯

一、简述

记—直接通过设置寄存器来控制LED灯、通过使用STM库函数来控制LED灯实现流水灯。

例子1:链接: https://pan.baidu.com/s/13KAa6U0HVik47MSZ0wMuvQ 提取码: ejq8

例子2:链接: https://pan.baidu.com/s/115aMtD6nhYanusHsfmM9HQ 提取码: bys4

例子1 通过设置寄存器来控制LED灯

二、效果

LED0闪烁

20190115140454572.gif

三、工程结构

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L25hbmZlaWJ1eWk_size_16_color_FFFFFF_t_70

四、源文件

main.c文件

  1. #include "stm32f4xx.h"
  2. #include "led.h"
  3. //粗延时
  4. void delay_ms(int ms)
  5. {
  6. int i,j;
  7. for(i=0; i<ms; i++)
  8. for(j=0; j<10000;j++);
  9. }
  10. //主函数
  11. int main(void)
  12. {
  13. LED_Init();//初始化LED
  14. while(1)
  15. {
  16. delay_ms(1000);//延时1秒
  17. GPIOF_BSRR |= (1<<9); //对位置1 关闭LED
  18. delay_ms(1000);
  19. GPIOF_BSRR |= (1<<25); //对位清0 点亮LED
  20. }
  21. return 0;
  22. }

led.h文件

  1. #ifndef __LED_H
  2. #define __LED_H
  3. #include "stm32f4xx.h"
  4. //定义宏为寄存器地址的解引用,到时候直接操作宏就是操作寄存器,方便编程。
  5. //加上volatile关键字是为了防止编译器进行优化,导致操作寄存器地址失败。(提醒编译器,这个值是容易变化的。)
  6. #define RCC_AHB1ENR *(volatile unsigned int *)(0x40023800+0x30) //外设时钟使能寄存器
  7. #define GPIOF_MODER *(volatile unsigned int *)(0x40021400+0x00) //GPIO端口模式寄存器
  8. #define GPIOF_OTYPER *(volatile unsigned int *)(0x40021400+0x04) //GPIO端口输出类型寄存器
  9. #define GPIOF_OSPEEDR *(volatile unsigned int *)(0x40021400+0x08) //GPIO端口速度寄存器
  10. #define GPIOF_PUPDR *(volatile unsigned int *)(0x40021400+0x0C) //GPIO端口上拉/下拉寄存器
  11. #define GPIOF_BSRR *(volatile unsigned int *)(0x40021400+0x18) //GPIO端口置位/ 复位寄存器
  12. void LED_Init(void);
  13. #endif

led.c文件

  1. #include "led.h"
  2. void LED_Init(void)
  3. {
  4. //使能GPIOF组时钟
  5. RCC_AHB1ENR |= (1<<5); //对位置1
  6. //设置GPIO口的模式
  7. GPIOF_MODER &= ~(1<<19); //对位清0
  8. GPIOF_MODER |= (1<<18); //对位置1
  9. //设置输出模式为推挽模式
  10. GPIOF_OTYPER &= ~(1<<9); //对位清0
  11. //设置速度50MHZ
  12. GPIOF_OSPEEDR |= (1<<19);
  13. GPIOF_OSPEEDR &= ~(1<<18);
  14. //设置为上拉模式
  15. GPIOF_PUPDR &= ~(1<<19); //对位清0
  16. GPIOF_PUPDR |= (1<<18); //对位置1
  17. }

五、总结

5.1 LED灯的硬件视图

  1. (在开发板上找到LED的位置)

20190114122640521.png

5.2 LED灯的原理图

  1. 查看GEC-M4原理图2016-07-29.pdf原理图文件
  2. ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L25hbmZlaWJ1eWk_size_16_color_FFFFFF_t_70 1][]
  3. 找到LED灯对应的芯片引脚之后,我们可以通过控制该引脚的电平输出来控制LED灯的两灭。

5.3 点亮LED0

  1. 相关文档:STM32F4xx中文参考手册.pdf
  2. 寄存器映射(基址信息)![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L25hbmZlaWJ1eWk_size_16_color_FFFFFF_t_70 2][]
  3. 相关寄存器物理地址=基址+偏移地址
  4. //定义宏为寄存器地址的解引用,到时候直接操作宏就是操作寄存器,方便编程。
  5. //加上volatile关键字是为了防止编译器进行优化,导致操作寄存器地址失败。(提醒编译器,这个值是容易变化的。)
  6. #define RCC_AHB1ENR *(volatile unsigned int *)(0x40023800+0x30) //外设时钟使能寄存器 AHB1总线
  7. #define GPIOF_MODER *(volatile unsigned int *)(0x40021400+0x00) //GPIO端口模式寄存器 F组
  8. #define GPIOF_OTYPER *(volatile unsigned int *)(0x40021400+0x04) //GPIO端口输出类型寄存器 F组
  9. #define GPIOF_OSPEEDR *(volatile unsigned int *)(0x40021400+0x08) //GPIO端口速度寄存器 F组
  10. #define GPIOF_PUPDR *(volatile unsigned int *)(0x40021400+0x0C) //GPIO端口上拉/下拉寄存器 F组
  11. #define GPIOF_BSRR *(volatile unsigned int *)(0x40021400+0x18) //GPIO端口置位/ 复位寄存器 F组
  12. 步骤1 使能GPIOF组时钟 LED0对应PF9引脚,GPIOF外设寄存器接在AHB1总线上)
  13. 设置外设时钟使能寄存器RCC AHB1 (RCC\_AHB1ENR)
  14. 外设时钟使能寄存器物理地址=基址+偏移地址 ==》0x40023800+0x30=0x40023830![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L25hbmZlaWJ1eWk_size_16_color_FFFFFF_t_70 3][]

步骤2:设置GPIO口的模式

  1. GPIO 端口模式寄存器的地址:0x40021400+0x00=0x40021400

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L25hbmZlaWJ1eWk_size_16_color_FFFFFF_t_70 4

步骤3: 设置输出模式为推挽模式

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L25hbmZlaWJ1eWk_size_16_color_FFFFFF_t_70 5

GPIO端口输出类型寄存器地址: 0x40021400+0x04

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L25hbmZlaWJ1eWk_size_16_color_FFFFFF_t_70 6

步骤4:设置GPIO端口速度寄存器

  1. GPIO端口速度寄存器 地址:0x40021400+0x08

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L25hbmZlaWJ1eWk_size_16_color_FFFFFF_t_70 7

步骤5:设置GPIO端口上拉/下拉寄存器

  1. GPIO端口上拉/下拉寄存器地址:0x40021400+0x0C

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L25hbmZlaWJ1eWk_size_16_color_FFFFFF_t_70 8

步骤6:设置GPIO 端口置位/ 复位寄存器 (设置引脚电平)

  1. GPIO 端口置位/ 复位寄存器地址:0x40021400+0x18

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L25hbmZlaWJ1eWk_size_16_color_FFFFFF_t_70 9

例子2 通过使用STM32库函数来控制LED灯—流水灯

二、效果

从LED1到LED4轮流亮灭

20190115185204737.gif

三、工程结构

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L25hbmZlaWJ1eWk_size_16_color_FFFFFF_t_70 10

四、源文件

main.c文件

  1. #include "stm32f4xx.h"
  2. #include "led.h"
  3. //粗延时(不精确延时)
  4. void delay_ms(int ms)
  5. {
  6. int i,j;
  7. for(i=0; i<ms; i++)
  8. for(j=0; j<10000;j++);
  9. }
  10. //主函数
  11. int main(void)
  12. {
  13. LED_Init();//初始化LED
  14. //开始让4个LED灯都灭掉
  15. GPIO_SetBits(GPIOF, GPIO_Pin_9|GPIO_Pin_10);//LED1 LED2灭
  16. GPIO_SetBits(GPIOE, GPIO_Pin_13|GPIO_Pin_14);//LED3 LED4灭
  17. while(1)
  18. {
  19. GPIO_SetBits(GPIOE, GPIO_Pin_14);//LED4 灭
  20. GPIO_ResetBits(GPIOF, GPIO_Pin_9);//复位 低电平 LED1亮
  21. delay_ms(1000);//延时
  22. GPIO_SetBits(GPIOF, GPIO_Pin_9);//置1 高电平 LED1灭
  23. GPIO_ResetBits(GPIOF, GPIO_Pin_10);//LED2 亮
  24. delay_ms(1000);
  25. GPIO_SetBits(GPIOF, GPIO_Pin_10);//LED2灭
  26. GPIO_ResetBits(GPIOE, GPIO_Pin_13);//LED3 亮
  27. delay_ms(1000);
  28. GPIO_SetBits(GPIOE, GPIO_Pin_13);//LED3灭
  29. GPIO_ResetBits(GPIOE, GPIO_Pin_14);//LED4 亮
  30. delay_ms(1000);
  31. }
  32. return 0;
  33. }

led.h文件

  1. #ifndef __LED_H
  2. #define __LED_H
  3. #include "stm32f4xx.h"
  4. void LED_Init(void);
  5. #endif

led.c文件

  1. #include "led.h"
  2. void LED_Init(void)
  3. {
  4. GPIO_InitTypeDef GPIO_InitStruct;
  5. //初始化GPIOF组时钟
  6. RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);//LED1 LED2 引脚9、引脚10
  7. //初始化GPIOE组时钟
  8. RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);//LED3 LED4 引脚13、引脚14
  9. //设置引脚为输出模式、速度为50MHZ,输出类型为推挽,上拉方式
  10. GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9|GPIO_Pin_10; //引脚9、引脚10
  11. GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT; //输出
  12. GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; //速度
  13. GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; //推挽
  14. GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP; //上拉
  15. //初始化GPIOF组引脚
  16. GPIO_Init(GPIOF,&GPIO_InitStruct);
  17. //设置引脚为输出模式、速度为50MHZ,输出类型为推挽,上拉方式
  18. GPIO_InitStruct.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_14; //引脚13、引脚14
  19. GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT; //输出
  20. GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; //速度
  21. GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; //推挽
  22. GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP; //上拉
  23. //初始化GPIOE组引脚
  24. GPIO_Init(GPIOE,&GPIO_InitStruct);
  25. }

五、总结

5.1 相关函数

void RCC_AHB1PeriphClockCmd(uint32_t RCC_AHB1Periph, FunctionalState NewState);//初始化外设时钟函数watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L25hbmZlaWJ1eWk_size_16_color_FFFFFF_t_70 11

  1. void GPIO\_Init(GPIO\_TypeDef\* GPIOx, GPIO\_InitTypeDef\* GPIO\_InitStruct);//初始化引脚

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L25hbmZlaWJ1eWk_size_16_color_FFFFFF_t_70 12

设置引脚电平:

void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);//置位,例子中为高电平

void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);复位,例子中是低电平

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L25hbmZlaWJ1eWk_size_16_color_FFFFFF_t_70 13

发表评论

表情:
评论列表 (有 0 条评论,429人围观)

还没有评论,来说两句吧...

相关阅读