• Day01 嵌入式 -----流水灯


    一、简单介绍

          嵌入式系统中的流水灯是一种常见的示例项目,通常用于演示嵌入式系统的基本功能和控制能力。流水灯由多个发光二极管(LED)组成,这些LED按照一定的顺序依次点亮和熄灭,形成一种像水流一样的流动效果。

    二、查看功能手册

    这里我们使用STM32F40xxx这个板子来实现流水灯这个小项目

    2.1 查看硬件引脚号码

     由上图可知,LED0这个灯所在引脚 PF9,LED1这个灯所在引脚 PF10

    可知 PF9:"PF"表示端口F,"9"表示该端口上的第9号引脚

            PF10:"PF"表示端口F,"10"表示该端口上的第10号引脚

    2.2查看硬件引脚号码对应的时钟型号

     

    根据硬件引脚号码,LED0和LED1都是PF,那么控制他俩的时钟型号都是GPIOF,而根据上图可知,GPIOF在AHB1总线上,根据这个逻辑就能找到GPIOF时钟型号,并打开时钟信号。

    AHB1ENR 寄存器用于配置 AHB1 总线上各个模块的时钟使能位。通过将 0x00000020 写入 AHB1ENR 寄存器的相应位置,启用了 GPIOF 的时钟

    所以打开控制LED0,LED1的时钟信号就是使用一下

    RCC->AHB1ENR=0x00000020;//时钟使能

    2.3、确定输出模式

    GPIOF->MODER=0x00040000;//配置引脚为输出模式

    2.4、确定输出类型

    GPIOF->OTYPER=0x00000000;//设置输出模式为推挽输出

    2.5、确定输出速度

    GPIOF->OSPEEDR=0x000C0000;//

    2.6、确定端口输出数据

    2.6.1 开灯

    原理:开灯需要一个低电平,注意不是高电平

    //GPIOF->ODR=0x00000000;

    2.6.2 关灯

    原理:关灯需要一个高电平,注意不是低电平

     

    找到引脚9 然后将值改成1,后续通过非门输出就为0,即关灯

    //GPIOF->ODR=0x0200;

    三、使用现成函数来实现

    注意这里我们的逻辑还是和二一样,首先重重之重的就是时钟信号,必须先打开时钟信号,然后创建一个结构体,这个结构体当中有输入输出模型,速度,引脚等,用于初始化灯。

     3.1 Pin引脚

    3.2 输入/输出模式

    3.3输出类型

    3.4 速度

    3.5 设置引脚的上下拉电阻

    3.6 开关灯

    1. void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);//关灯
    2. void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);//开灯

    注意:开灯是低电平有效,关灯是高电平有效。

    GPIO_SetBits函数用于将某位引脚置1,使其输出高电平。

    GPIO_ResetBits函数用于将某位引脚置0,使其输出低电平。

    四、代码实现

    1. #ifndef _LED_H_
    2. #define _LED_H_
    3. void LED_Init(void);
    4. void LED1_ON(void);
    5. void LED1_OFF(void);
    6. void LED2_ON(void);
    7. void LED2_OFF(void);
    8. #endif // GPIO_CONFIG_H
    9. #include "LED.h"
    10. #include "stm32f4xx.h"
    11. void LED1_ON(void)//开灯
    12. {
    13. GPIO_ResetBits(GPIOF,GPIO_Pin_9);
    14. }
    15. void LED1_OFF(void)//关灯
    16. {
    17. GPIO_SetBits(GPIOF,GPIO_Pin_9);
    18. }
    19. void LED2_ON(void)
    20. {
    21. GPIO_ResetBits(GPIOF,GPIO_Pin_10);
    22. }
    23. void LED2_OFF(void)
    24. {
    25. GPIO_SetBits(GPIOF,GPIO_Pin_10);
    26. }
    27. void LED_Init(void)
    28. {
    29. RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);//使能
    30. GPIO_InitTypeDef GPIO_InitTypeDefStruct1;
    31. GPIO_InitTypeDefStruct1.GPIO_Mode=GPIO_Mode_OUT;//输出
    32. GPIO_InitTypeDefStruct1.GPIO_OType=GPIO_OType_PP;//推挽输出
    33. GPIO_InitTypeDefStruct1.GPIO_Pin=GPIO_Pin_9|GPIO_Pin_10;//引脚
    34. GPIO_InitTypeDefStruct1.GPIO_Speed= GPIO_High_Speed ;//速度
    35. GPIO_Init(GPIOF,&GPIO_InitTypeDefStruct1);
    36. }
    37. int main()
    38. {
    39. LED_Init();
    40. LED1_OFF();
    41. LED2_OFF();
    42. /*
    43. int n=500000;
    44. while(1)
    45. {
    46. while(n--)
    47. {
    48. };
    49. n=5000000;//延时
    50. LED1_ON();
    51. while(n--)
    52. {
    53. };
    54. n=5000000;
    55. LED1_OFF();
    56. while(n--)
    57. {
    58. };
    59. n=5000000;
    60. LED2_ON();
    61. while(n--)
    62. {
    63. };
    64. n=5000000;
    65. LED2_OFF();
    66. }
    67. */
    68. }

  • 相关阅读:
    AJAX的奇妙之旅(1)基础知识
    (Ljava/lang/String;)Ljava/lang/Integer; @65: areturn
    openGauss常用的客户端连接工具
    JAVA经典百题之按位与运算符 `&`的使用
    预约挂号系统技术点详解(一)
    利用STM32CubeMX和Keil模拟器,3天入门FreeRTOS(5.4) —— 事件组
    MySql 数据库【连接查询】
    InfluxDB时序数据库安装和使用
    Kafka服务端高性能技术细节原理:基于零拷贝的mmap和sendfile
    0基础学习VR全景平台篇 第104篇:720全景后期软件安装
  • 原文地址:https://blog.csdn.net/hello_world_juns/article/details/134525267