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

news2025/1/23 16:57:42
如何点亮一颗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  可以实现对每个中断 /
    件线进行单独配置,可以单独配置为中断或者事件,以及触发事件的属性。
    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打开串口

 1.2打开外部时钟晶振

1.3 设置总线

2. 配置 GPIO
2.1LED灯         并拉高电平初始为灯灭

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

3. 使能中断
4. 配置工程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/632508.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

chatgpt赋能python:Python如何创建新项目

Python如何创建新项目 Python已经成为了全球最受欢迎的编程语言之一。如果您是一个有经验的Python工程师&#xff0c;您可能已经知道如何在命令行上创建新项目。但是&#xff0c;如果您是一个新手或初学者&#xff0c;您可能需要一些指导来开始创建新的项目。在本篇文章中&…

Vue中如何进行样式绑定?

Vue中如何进行样式绑定&#xff1f; 在Vue中&#xff0c;我们可以很方便地进行样式绑定。样式绑定是将CSS样式与Vue组件中的数据进行关联的一种技术。通过样式绑定&#xff0c;我们可以根据组件的状态动态地修改其外观。本文将介绍Vue中的样式绑定&#xff0c;包括类绑定、内联…

chatgpt赋能python:Python如何进行升序排列?

Python如何进行升序排列&#xff1f; Python是一门广泛应用于Web开发、数据科学、人工智能、机器学习等领域的编程语言。在这个快速发展的世界中&#xff0c;如何高效地排序数据是非常重要的。本文将介绍Python中如何进行升序排序。 基本排序方法 Python提供了一个内置函数s…

Vue 中的列表渲染

Vue 中的列表渲染 在 Vue 中&#xff0c;列表渲染是非常常见的操作。它允许我们将一个数组中的数据渲染为一个列表&#xff0c;从而实现数据的展示和交互。在本文中&#xff0c;我们将探讨 Vue 中的列表渲染的基本原理和用法&#xff0c;并给出一些实例代码来帮助读者更好地理…

【模块三:职业成长】38|能力维度三:如何提升解决跨领域冲突的能力?

你好&#xff0c;我是郭东白。今天我们来讨论架构师核心能力的第三个层次——解决跨领域冲突。 上节课我们讲了从程序员到兼职架构师的跨越&#xff0c;也就是如何搭建解决横向问题的能力。 不过&#xff0c;在兼职架构师这个角色中&#xff0c;架构能力是一个加分项&#xff…

chatgpt赋能python:如何使用Python升序排列一个列表?

如何使用Python升序排列一个列表&#xff1f; 在Python编程中&#xff0c;我们经常需要对列表进行排序。列表排序是一种常见的操作&#xff0c;可以帮助我们对数据进行分析和管理。在这篇文章中&#xff0c;我们将学习如何使用Python对一个列表进行升序排列。 什么是升序排列…

时间同步/集群时间同步/在线/离线

目录 一、能够连接外网 二、集群不能连接外网--同步其它服务器时间 一、能够连接外网 1.介绍ntp时间协议 NTP&#xff08;Network Time Protocol&#xff09;网络时间协议&#xff0c;是用来使计算机时间同步的一种协议&#xff0c;它可以使计算机对其服务器或时钟源做同步…

【python】【Word】用正则表达式匹配正文中的标题(未使用样式)并通过win32com指定相应样式

标题的格式 二级标题&#xff1a; 数字.数字. 文字 三级标题&#xff1a;数字.数字.数字 文字 python代码 使用方法 只保留一个需要应用的WORD文档运行程序&#xff0c;逐行匹配 使用效果 代码 import win32com.client import redef compile_change_Word_titlestyle():#…

shell脚本语句控制命令(exit、break、continue)

一、exit exit用于直接退出shell脚本程序并返回状态码&#xff08;状态码可在执行命令执行后用$&#xff1f;查看&#xff09; 如果不在exit后添加状态码&#xff0c;会默认返回最后一条命令执行后的状态码 exit 加状态码&#xff0c;代表退出程序并向系统指定状态码 状态码…

基于zinx的go tcp通信案例

基于zinx的go tcp通信示例 一、zinx简介:(https://gitee.com/Aceld/zinx/) Zinx是一个基于Golang的轻量级tcp服务框架&#xff0c;根据官方的定位&#xff0c;zinx是在游戏领域或者其他长链接的领域的轻量级企业框架&#xff0c;其使用简单&#xff0c;性能高效&#xff0c;能…

Baumer工业相机堡盟工业相机如何使用BGAPISDK的相机图像时间戳计算运行时间以及时间差(C#)

Baumer工业相机堡盟工业相机如何使用BGAPISDK的相机图像时间戳计算运行时间以及时间差&#xff08;C#&#xff09; Baumer工业相机Baumer工业相机BGAPI SDK和图像时间戳的技术背景Baumer工业相机使用BGAPISDK控制相机数据流的方式1.引用合适的类文件2.使用BGAPISDK获取时间戳的…

Vue中如何进行条件渲染

Vue中如何进行条件渲染 Vue是一款流行的前端框架&#xff0c;它提供了许多方便的功能来处理数据和视图。其中一个非常有用的功能是条件渲染。条件渲染可以根据条件来控制视图的显示和隐藏。在本文中&#xff0c;我们将介绍Vue中如何进行条件渲染&#xff0c;并提供一些示例代码…

异常数据检测 | Python实现k-means时间序列异常数据检测

文章目录 文章概述模型描述源码分享学习小结文章概述 异常数据检测 | Python实现k-means时间序列异常数据检测 模型描述 k-means是一种广泛使用的聚类算法。它创建了k个具有相似特性的数据组。不属于这些组的数据实例可能会被标记为异常。在我们开始k-means聚类之前,我们使用e…

spring.expression 随笔0 概述

0. 我只是个普通码农&#xff0c;不值得挽留 Spring SpEL表达式的使用 常见的应用场景:分布式锁的切面借助SpEL来构建key 比较另类的的应用场景:动态校验 个人感觉可以用作控制程序的走向&#xff0c;除此之外&#xff0c;spring的一些模块的自动配置类&#xff0c;也会在Cond…

chatgpt赋能python:Python如何判断输入数据类型

Python如何判断输入数据类型 Python是一种动态类型语言&#xff0c;它可以在运行时自动识别数据的类型。但是&#xff0c;有时候我们需要在代码中判断输入数据的类型&#xff0c;以便进行相应的操作。 判断数据类型的内置函数 Python有一些内置函数可以用于判断数据类型&…

仿滴滴打车百度地图定位查找附近出租车或门店信息

前端vue仿滴滴打车百度地图定位查找附近出租车或门店信息, 下载完整代码请访问uni-app插件市场地址:https://ext.dcloud.net.cn/plugin?id12982 效果图如下: # #### 使用方法 使用方法 #安装vue-baidu-map插件 npm install vue-baidu-map --save <!-- center: 地图中…

蓝牙耳机可以戴着游泳吗?推荐四款可以游泳的游泳耳机

今年的夏天格外炎热&#xff0c;热衷于户外运动的人们也开始转换健身方式&#xff0c;游泳作为一项锻炼全身又祛暑清凉的运动&#xff0c;自然成为了最佳选择&#xff0c;相信大多数人跟我一样在运动时都离不开耳机&#xff0c;而游泳需要和水接触&#xff0c;这也导致了我所有…

SpringBoot+Mybatis+Thymeleaf实现的物资管理系统

本系统具体使用的技术是&#xff1a;后端使用SpringBootMybatis&#xff0c;前端使用了Thymeleaf框架&#xff0c;数据库使用的是MySql 8.0。开发工具使用的是IDEA。 本系统前端是使用了前辈的管理系统模板&#xff0c;具体的系统模块功能如下图所示&#xff1a; 一、系统首页…

chatgpt赋能python:Python如何删除之前的内容

Python如何删除之前的内容 在Python编程中&#xff0c;删除之前输入或者生成的内容是一个常见的需求。本文将介绍如何在Python中删除之前的内容以及相关的技巧和方法。 为什么需要删除之前的内容&#xff1f; 在Python编程中&#xff0c;我们有时需要重新输入命令或代码段&a…

OpenGl光照之材质

文章目录 设置材质光的属性完整代码 在现实世界里&#xff0c;每个物体会对光产生不同的反应。比如&#xff0c;钢制物体看起来通常会比陶土花瓶更闪闪发光&#xff0c;一个木头箱子也不会与一个钢制箱子反射同样程度的光。有些物体反射光的时候不会有太多的散射(Scatter)&…