资讯详情

嵌入式系统 实验一 GPIO口控制LED实验

实验一 GPIO口控制LED实验

1 实验目的

  1. 了解和掌握如何控制 STM32 的 GPIO;
  2. 掌握控制 LED 电路原理及程序代码;

2 实验环境

  1. 硬件:1 空气温湿度传感器模块1 个 ST-Link 调试器、1 根 USB2.0 方口线、1 根 USB3.0 数据线、1 台 PC 机;
  2. 软件:Windows 7/XP、MDK 综合开发环境。

3 实验功能

实现Status、 RS485-R、 RS485-T、 User1 四个指示灯轮流闪烁。 1)硬件原理 :温湿度传感器模块分别有四个指示灯 Status、 RS485-R、 RS485-T 和 User1。 在以下实验中, 不考虑这些名称,它们是根据模块和物联网魔盒系列中其他模块的功能定义的,只需要掌握本课程中的控制原理。模块上四个指示灯的控制原理如下图所示: 在这里插入图片描述

下表列出了四个指示灯的引脚配置信息。请注意原理图号、信号名称和MCU控制引脚之间的对应性

2)软件原理 由图 2.1.1 分析, 要让 LED 点亮, 使 MCU 的 PB4、 PB5、 PB6、 PB7 引脚输 出低电平。感知执行模块 MCU 型号为 STM32F103C8T在芯片上, I/O 引脚 软件可以设置为输入或输出等各种功能,因此也称为 GPIO(General Purpose I/O)。 而 GPIO 引脚又分了 GPIOA、 GPIOB、 GPIOC、 GPIOD 除了 GPIOD 分为 3 除了个引脚,其他组分为 0~15 共 16 不同的引脚。 因此, LED 控制逻辑如下:

  1. GPIO 端口引脚多——需要控制的特定引脚。
  2. GPIO 配置所需的特定功能如此丰富。
  3. 控制 LED 亮与灭-设置 GPIO 输出电压。 根据硬件原理图分析程序代码,见下图。

4. 实验步骤

1.将USB3.0数据线的一端连接感知执行模块USB3.0调试烧写口,另一端连接ST-Link调试器的“Debug”接口。 2.将USB2.0方口线的一端连接PC机的USB口,另一端连接ST-Link调试器“USB-Debug”接口。 3.编程。 4.点击工具栏中的按钮,编译工程成功后,0出现在信息框中 Error(s),0 Warning(s)信息。如果编译失败,检查相关选项是否配置正确。 5.确认与硬件调试相关的选项已正确设置。 6.点击“LOAD按钮将程序下载到温湿度传感器模块中。下载成功后,信息框显示下图所示的信息,表示程序下载成功并自动运行。 7.观察模块上四个指示灯的变化。

5 实验程序

#include "stm32f10x.h" void gpio_init(void) // GPIO 初始配置 { 
         GPIO_InitTypeDef GPIO_InitStructure; // 定义一个 GPIO_InitTypeDef 结构类型 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO , ENABLE);  // 开启 AFIO 时钟和 GPIOB 的外设时钟 GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); // 禁用 JTAG 功能 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 |GPIO_Pin_5 |GPIO_Pin_6|GPIO_Pin_7; // 选择要控制的 GPIOB 引脚 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 引脚速率为 50MHz GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 引脚模式设置为通用推拉输出 GPIO_Init(GPIOB, &GPIO_InitStructure); // 调用库函数,初始化 GPIOB } void Delay
       
        (
        unsigned 
        int i
        ) 
        { 
          
        unsigned 
        int j
        ,k
        ; 
        for
        (j 
        = 
        0 
        ; j 
        < i 
        ; j
        ++
        ) 
        for
        (k 
        = 
        0 
        ; k 
        < 
        10000
        ; k
        ++
        )
        ; 
        } 
        void 
        led_set
        (
        int num
        ,
        int sta
        ) 
        { 
          
        if
        (num
        ==
        1
        ) 
        { 
          
        if
        (sta
        ==
        0
        )
        { 
          
        GPIO_WriteBit
        (GPIOB
        ,GPIO_Pin_4
        ,
        (BitAction
        )
        0x00
        )
        ;
        } 
        if
        (sta
        ==
        1
        )
        { 
          
        GPIO_WriteBit
        (GPIOB
        ,GPIO_Pin_4
        ,
        (BitAction
        )
        0x01
        )
        ;
        } 
        } 
        if
        (num
        ==
        2
        ) 
        { 
          
        if
        (sta
        ==
        0
        )
        { 
          
        GPIO_WriteBit
        (GPIOB
        ,GPIO_Pin_5
        ,
        (BitAction
        )
        0x00
        )
        ;
        } 
        if
        (sta
        ==
        1
        )
        { 
          
        GPIO_WriteBit
        (GPIOB
        ,GPIO_Pin_5
        ,
        (BitAction
        )
        0x01
        )
        ;
        } 
        } 
        if
        (num
        ==
        3
        ) 
        { 
          
        if
        (sta
        ==
        0
        )
        { 
          
        GPIO_WriteBit
        (GPIOB
        ,GPIO_Pin_6
        ,
        (BitAction
        )
        0x00
        )
        ;
        } 
        if
        (sta
        ==
        1
        )
        { 
          
        GPIO_WriteBit
        (GPIOB
        ,GPIO_Pin_6
        ,
        (BitAction
        )
        0x01
        )
        ;
        } 
        } 
        if
        (num
        ==
        4
        ) 
        { 
          
        if
        (sta
        ==
        0
        )
        { 
          
        GPIO_WriteBit
        (GPIOB
        ,GPIO_Pin_7
        ,
        (BitAction
        )
        0x00
        )
        ;
        } 
        if
        (sta
        ==
        1
        )
        { 
          
        GPIO_WriteBit
        (GPIOB
        ,GPIO_Pin_7
        ,
        (BitAction
        )
        0x01
        )
        ;
        } 
        } 
        } 
        void 
        led_init
        (
        void
        ) 
        { 
          
        int i
        ; 
        for
        (i
        =
        1
        ;i
        <
        5
        ;i
        ++
        ) 
        { 
          
        led_set
        (i
        ,
        1
        )
        ; 
        // 关闭四个 LED 
        } 
        } 
        int 
        main
        (
        void
        ) 
        // 主函数 
        { 
          
        gpio_init
        (
        )
        ; 
        // GPIO 初始化 
        led_init
        (
        )
        ; 
        // LED 初始化 
        while
        (
        1
        ) 
        // 周期性控制 status 指示灯点亮与熄灭 
        { 
          
        led_set
        (
        1
        ,
        0
        )
        ; 
        // 点亮 Status 指示灯 
        Delay
        (
        500
        )
        ; 
        // 延时子程序 
        led_set
        (
        1
        ,
        1
        )
        ; 
        // 熄灭 Status 指示灯 
        Delay
        (
        500
        )
        ; 
        led_set
        (
        2
        ,
        0
        )
        ; 
        // 点亮 RS485-R 指示灯 
        Delay
        (
        500
        )
        ; 
        led_set
        (
        2
        ,
        1
        )
        ; 
        // 熄灭 RS485-R 指示灯 
        Delay
        (
        500
        )
        ; 
        led_set
        (
        3
        ,
        0
        )
        ; 
        // 点亮 RS485-T 指示灯 
        Delay
        (
        500
        )
        ; 
        led_set
        (
        3
        ,
        1
        )
        ; 
        // 熄灭 RS485-T 指示灯 
        Delay
        (
        500
        )
        ; 
        led_set
        (
        4
        ,
        0
        )
        ; 
        // 点亮 User1 指示灯 
        Delay
        (
        500
        )
        ; 
        led_set
        (
        4
        ,
        1
        )
        ; 
        // 熄灭 User1 指示灯 
        Delay
        (
        500
        )
        ; 
        } 
        } 
       

6 实验结果

程序成功运行后,将可以看到 Status、 RS485-R、 RS485-T、 User1 四个指示灯逐个点亮。

实验心得

实验中,开始环境配置不成功,后面发现设备出现问题,更换设备之后可以完成实验。 实验中建立工程的过程中一定要正确的完成相关配置,否则实验结果会不正确。通过编写部分程序代码,知道了如何初始化配置STM32的GPIO引脚,掌握了控制 LED的程序代码。

标签: 集成电路更换led灯

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台