STM32——05-按键、时钟控制、中断复位 点亮LED灯

这篇具有很好参考价值的文章主要介绍了STM32——05-按键、时钟控制、中断复位 点亮LED灯。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

如何点亮一颗LED灯 STM32——05-按键、时钟控制、中断复位 点亮LED灯

STM32——05-按键、时钟控制、中断复位 点亮LED灯 

编程实现点灯

常用的 GPIO HAL 库函数:

void HAL_GPIO_Init ( GPIO_TypeDef * GPIOx , GPIO_InitTypeDef * GPIO_Init );
void HAL_GPIO_WritePin ( GPIO_TypeDef * GPIOx , uint16_t GPIO_Pin , GPIO_PinState
PinState );
void HAL_GPIO_TogglePin ( GPIO_TypeDef * GPIOx , uint16_t GPIO_Pin );

 结构体 GPIO_InitTypeDef 定义:

typedef struct
{
uint32_t Pin ;
uint32_t Mode ;
uint32_t Pull ;
uint32_t Speed ;
} GPIO_InitTypeDef ;    

按键点亮LED灯(轮询法) 

输入(按键):

  • KEY1:PA0
  • KEY2:PA1

输出( LED 灯):

  • LED1:PB8
  • LED2:PB9
    #define KEY_ON 0
    #define KEY_OFF 1
    //自己编写的检测按键返回值的函数
    uint8_t Key_Scan(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin)
    {
        if( HAL_GPIO_ReadPin(GPIOx,GPIO_Pin) == GPIO_PIN_RESET)
    {
    /* 按键按下 */
        return KEY_ON;
    }
    else
    {
    /* 按键松开 */
        while(HAL_GPIO_ReadPin(GPIOx, GPIO_Pin) == GPIO_PIN_RESET);
        return KEY_OFF;
    }
    }
    
    while (1)
    {
        /* USER CODE END WHILE */
        if(Key_Scan(GPIOA,GPIO_PIN_0) == KEY_ON)
            HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_8);
        if(Key_Scan(GPIOA,GPIO_PIN_1) == KEY_ON)
            HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_9);
        /* USER CODE BEGIN 3 */
    }
    四、复位和时钟控制( RCC
  • 复位
    系统复位
    当发生以下任一事件时,产生一个系统复位:
    1. NRST 引脚上的低电平 ( 外部复位 )
    2. 窗口看门狗计数终止 (WWDG 复位 )
    3. 独立看门狗计数终止 (IWDG 复位 )
    4. 软件复位 (SW 复位)
    5. 低功耗管理复位
    电源复位
    当以下事件中之一发生时,产生电源复位:
    1. 上电 / 掉电复位 (POR/PDR 复位 )
    2. 从待机模式中返回
    备份区复位
    备份区域拥有两个专门的复位,它们只影响备份区域。
    当以下事件中之一发生时,产生备份区域复位。
    1. 软件复位,备份区域复位可由设置备份域控制寄存器 (RCC_BDCR)( 6.3.9 ) 中的
    BDRST 位产生。
    2. VDD VBAT 两者掉电的前提下, VDD VBAT 上电将引发备份区域复位。
    时钟控制
    什么是时钟?
    时钟打开,对应的设备才会工作。
    时钟来源
    三种不同的时钟源可被用来驱动系统时钟 (SYSCLK)
    HSI 振荡器时钟(高速内部时钟)
    HSE 振荡器时钟(高速外部时钟)
    PLL 时钟(锁相环倍频时钟)
    二级时钟源 :
    40kHz 低速内部 RC LSIRC )振荡器
    32.768kHz 低速外部晶体( LSE 晶体)
    如何使用 CubeMX 配置时钟
    五、中断和事件
    中断概述
    什么是中断?
             中断是指计算机运行过程中,出现某些意外情况需主机干预时,机器能自动停止正在运行的
    程序并转入处理新情况的程序,处理完毕后又返回原被暂停的程序继续运行。
    什么是 EXTI
             外部中断 / 事件控制器 (EXTI) 管理了控制器的  23  个中断 / 事件线。每个中断 / 事件线都对应有一
    个边沿检测器,可以实现输入信号的上升沿检测和下降沿的检测。  EXTI  可以实现对每个中断 /
    件线进行单独配置,可以单独配置为中断或者事件,以及触发事件的属性。 STM32——05-按键、时钟控制、中断复位 点亮LED灯
    EXTI  可分为两大部分功能,一个是产生中断,另一个是产生事件,这两个功能从硬件上就有所不
    同。
    产生中断线路目的是把输入信号输入到  NVIC ,进一步会运行中断服务函数,实现功能,这样是软
    件级的。而产生事件线路目的就是传输一个脉冲信号给其他外设使用,并且是电路级别的信号传
    输,属于硬件级的。 EXTI 初始化结构体:
    typedef struct
    {
    // 中断 / 事件线
    uint32_t EXTI_Line ; /*!< Specifies the EXTI lines to be enabled or
    disabled.
    This parameter can be any combination value
    of @ref EXTI_Lines */
    //EXTI 模式
    EXTIMode_TypeDef EXTI_Mode ; /*!< Specifies the mode for the EXTI lines.
    This parameter can be a value of @ref
    EXTIMode_TypeDef */
    // 触发类型
    EXTITrigger_TypeDef EXTI_Trigger ; /*!< Specifies the trigger signal active edge for
    the EXTI lines.
    This parameter can be a value of @ref
    EXTITrigger_TypeDef */
    //EXTI 控制
    FunctionalState EXTI_LineCmd ; /*!< Specifies the new state of the selected EXTI
    lines.
    This parameter can be set either to ENABLE or
    DISABLE */
    } EXTI_InitTypeDef ;

     

    中断 / 事件线:
    # define EXTI_Line0 (( uint32_t ) 0x00001 ) /*!< External interrupt line 0 */
    # define EXTI_Line1 (( uint32_t ) 0x00002 ) /*!< External interrupt line 1 */
    # define EXTI_Line2 (( uint32_t ) 0x00004 ) /*!< External interrupt line 2 */
    # define EXTI_Line3 (( uint32_t ) 0x00008 ) /*!< External interrupt line 3 */
    # define EXTI_Line4 (( uint32_t ) 0x00010 ) /*!< External interrupt line 4 */
    # define EXTI_Line5 (( uint32_t ) 0x00020 ) /*!< External interrupt line 5 */
    # define EXTI_Line6 (( uint32_t ) 0x00040 ) /*!< External interrupt line 6 */
    # define EXTI_Line7 (( uint32_t ) 0x00080 ) /*!< External interrupt line 7 */
    # define EXTI_Line8 (( uint32_t ) 0x00100 ) /*!< External interrupt line 8 */
    # define EXTI_Line9 (( uint32_t ) 0x00200 ) /*!< External interrupt line 9 */
    # define EXTI_Line10 (( uint32_t ) 0x00400 ) /*!< External interrupt line 10 */
    # define EXTI_Line11 (( uint32_t ) 0x00800 ) /*!< External interrupt line 11 */
    # define EXTI_Line12 (( uint32_t ) 0x01000 ) /*!< External interrupt line 12 */
    # define EXTI_Line13 (( uint32_t ) 0x02000 ) /*!< External interrupt line 13 */
    # define EXTI_Line14 (( uint32_t ) 0x04000 ) /*!< External interrupt line 14 */
    # define EXTI_Line15 (( uint32_t ) 0x08000 ) /*!< External interrupt line 15 */
    # define EXTI_Line16 (( uint32_t ) 0x10000 ) /*!< External interrupt line 16
    Connected to the PVD Output */
    # define EXTI_Line17 (( uint32_t ) 0x20000 ) /*!< External interrupt line 17
    Connected to the RTC Alarm event */
    # define EXTI_Line18 (( uint32_t ) 0x40000 ) /*!< External interrupt line 18
    Connected to the USB OTG FS Wakeup from suspend event */
    # define EXTI_Line19 (( uint32_t ) 0x80000 ) /*!< External interrupt line 19
    Connected to the Ethernet Wakeup event */
    # define EXTI_Line20 (( uint32_t ) 0x00100000 ) /*!< External interrupt line 20
    Connected to the USB OTG HS (configured in FS) Wakeup event */
    # define EXTI_Line21 (( uint32_t ) 0x00200000 ) /*!< External interrupt line 21
    Connected to the RTC Tamper and Time Stamp events */
    # define EXTI_Line22 (( uint32_t ) 0x00400000 ) /*!< External interrupt line 22
    Connected to the RTC Wakeup event */

 EXTI模式:

typedef enum
{
EXTI_Mode_Interrupt = 0x00 , // 产生中断
EXTI_Mode_Event = 0x04 // 产生事件
} EXTIMode_TypeDef ;

触发类型:

typedef enum
{
EXTI_Trigger_Rising = 0x08 , // 上升沿
EXTI_Trigger_Falling = 0x0C , // 下降沿
EXTI_Trigger_Rising_Falling = 0x10 // 上升沿和下降沿都触发
} EXTITrigger_TypeDef ;
EXTI 控制:
使能 EXTI ,一般都是使能, ENABLE
什么是优先级?
         抢占优先级和响应优先级的区别:
高优先级的抢占优先级是可以打断正在进行的低抢占优先级中断的。
抢占优先级相同的中断,高响应优先级不可以打断低响应优先级的中断。
抢占优先级相同的中断,当两个中断同时发生的情况下,哪个响应优先级高,哪个先执行。
如果两个中断的抢占优先级和响应优先级都是一样的话,则看哪个中断先发生就先执行
什么是优先级分组?
        Cortex-M3 允许具有较少中断源时使用较少的寄存器位指定中断源的优先级,因此 STM32
指定中断优先级的寄存器位减少到 4 位,这 4 个寄存器位的分组方式如下:
0 组:所有 4 位用于指定响应优先级
1 组:最高 1 位用于指定抢占式优先级,最低 3 位用于指定响应优先级
2 组:最高 2 位用于指定抢占式优先级,最低 2 位用于指定响应优先级
3 组:最高 3 位用于指定抢占式优先级,最低 1 位用于指定响应优先级
4 组:所有 4 位用于指定抢占式优先级
什么是 NVIC
        STM32 通过中断控制器 NVIC Nested Vectored Interrupt Controller )进行中断的管理 。
NVIC 是属于 Cortex 内核的器件,不可屏蔽中断( NMI )和外部中断都由它来处理,但是 SYSTICK
不是由 NVIC 控制的。
typedef struct
{
uint8_t NVIC_IRQChannel ;
uint8_t NVIC_IRQChannelPreemptionPriority ; // 抢断优先级
uint8_t NVIC_IRQChannelSubPriority ; // 响应优先级
FunctionalState NVIC_IRQChannelCmd ;
} NVIC_InitTypeDef ;
什么是中断向量表?
         每个中断源都有对应的处理程序,这个处理程序称为中断服务程序,其入口地址称为中断向
量。所有中断的中断服务程序入口地址构成一个表,称为中断向量表;也有的机器把中断服务程
序入口的跳转指令构成一张表,称为中断向量跳转表。
按键点亮 LED 灯(中断法)
1. 配置时钟
1.1打开串口
STM32——05-按键、时钟控制、中断复位 点亮LED灯

 1.2打开外部时钟晶振STM32——05-按键、时钟控制、中断复位 点亮LED灯

1.3 设置总线STM32——05-按键、时钟控制、中断复位 点亮LED灯

2. 配置 GPIO
2.1LED灯         并拉高电平初始为灯灭
STM32——05-按键、时钟控制、中断复位 点亮LED灯
STM32——05-按键、时钟控制、中断复位 点亮LED灯

 2.2按键(配置按键为外部中断模式) 

STM32——05-按键、时钟控制、中断复位 点亮LED灯

STM32——05-按键、时钟控制、中断复位 点亮LED灯文章来源地址https://www.toymoban.com/news/detail-482973.html

3. 使能中断
STM32——05-按键、时钟控制、中断复位 点亮LED灯
4. 配置工程

到了这里,关于STM32——05-按键、时钟控制、中断复位 点亮LED灯的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • GPIO(STM32)点亮LED灯、按键KEY

    GPIO(general porpose intputoutput):通用输入输出端口的简称。可以通过软件控制其输出和输入。stm32芯片的GPIO引脚与外部设备连接起来,从而实现与外部通信,控制以及数据采集的功能。 在STM32F4xx芯片上的GPIO口被分成各个组,一共有7组IO口,以A、B、C、D、E、F、G等命名(不同

    2024年04月14日
    浏览(40)
  • 手把手教你使用--常用模块--HC05蓝牙模块,无线蓝牙串口透传模块,(实例:手机蓝牙控制STM32单片机点亮LED灯)

    最近在学STM32,基本的学完了,想学几个模块来巩固一下知识,就想到了蓝牙模块。玩啥好难过有很多博客教怎么连的,但自己看起来还是有点糊涂。模块的原理和知识点我就不讲解了,这里我主要 手把手 记录一下我是如何对蓝牙模块进行学习和使用的。 所使用的资料和工

    2024年02月02日
    浏览(79)
  • 5 STM32复位和时钟控制

    STM32的复位功能 系统复位: 系统复位将复位除时钟控制寄存器CSR中的复位标志和备份区域中的寄存器以外的所有寄存器为它们的复位数值。(按键复位和软件复位属于系统复位) 电源复位: 电源复位将复位除了备份区域外的所有寄存器。 后备域复位: 备份区域拥有两个专

    2024年02月11日
    浏览(38)
  • STM32按键控制LED

    1.利用模块化编程对LED 2.设置LED的几种状态(亮,灭,和利用按键反转电平) 3.按键 (1)按键初始化 (2)如果按键按下做什么(这里是控制LED) 4,主函数

    2024年02月12日
    浏览(40)
  • STM-32:按键控制LED灯 程序详解

    左边是STM322里电路每一个端口均可以配置的电路部分,右边部分是外接设备 电路图。 配置为 上拉输入模式的意思就是,VDD开关闭合,VSS开关断开。 浮空输入模式的意思就是,VDD开关断开,VSS开关断开。 下拉输入模式的意思就是,VDD开关断开,VSS开关闭合。 在 按键控制LE

    2024年02月12日
    浏览(42)
  • STM32之通过按键控制LED灯亮灭

    之前我们已经实现了LED灯的亮灭,我们对LED灯的结构应该有一个大致的了解。接下来我们对按键控制led进行学习。 首先我们要了解一下按键的结构。按键结构如图。  由此可知,此处我们有两种按键,一种是普通的按键KEY0, KEY1(KEY2),他们连接的串口分别是PE4, PE3(PE2),对应

    2024年02月08日
    浏览(50)
  • 【STM32】STM32学习笔记-按键控制LED 光敏传感器控制蜂鸣器(08)

    led.h led.c key.h key.c main.c 电路图: 实物图: buzzer.h buzzere.c lightsensor.h lightsensor.cpp main.c 04-Key控制LED.rar 05-光敏传感器控制蜂鸣器.rar 参考: 【STM32】江科大STM32学习笔记汇总

    2024年04月23日
    浏览(50)
  • 单片机-控制按键点亮LED灯

    定义四个按键引脚  1、按键按下 为 输入为低电平 2、按键不按下 IO有上拉电阻,为高电平 // 定义 按键的 管教 sbit KEY1 = P3^1; sbit KEY2 = P3^0; sbit KEY3 = P3^2; sbit KEY4 = P3^3; LED 输出高电平为亮 // 定义LED灯 管教 sbit LED1 = P2^0; sbit LED2 = P2^1; sbit LED3 = P2^2; sbit LED4 = P2^3; 1、定义按键管教

    2024年02月10日
    浏览(42)
  • STM32矩形(矩阵)按键(键盘)输入控制LED灯 ——4*4矩阵按键源码解析

    本文基于标准函数库的工程实现stm32F103C8T6使用4*4的矩阵按键控制LED灯的亮灭及闪烁等功能。 程序源码:链接:https://pan.baidu.com/s/1_MPhvMduKCTP0MPG-Gtw3A?pwd=2syk  提取码:2syk 文章目录 一、矩形键盘介绍 1、硬件电路基本原理 2、两种识别方法介绍 3、硬件接线即使用 二、程序源码

    2024年02月04日
    浏览(45)
  • 【STM32】按键控制LED亮灭实验——GPIO、LED、KEY、SYS

    无锁存时:当按下独立按钮时LED亮,松开LED灭。 锁存时:当按下独立按钮时LED亮,松开LED仍亮,再按下独立按钮时LED熄灭。 硬件部分 软件部分 1、引入头文件 2、主函数 首先时钟、led、按键初始化 锁存时:当按下独立按钮时LED亮,松开LED仍亮,再按下独立按钮时LED熄灭。常

    2024年02月08日
    浏览(94)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包