26.3.22 ZD-EP63 [中断] 通过中断来控制LED

1 中断的使用 1.1 中断流程 我们先来看看我们最开始讲中断时的一个中断流程图: 我们是从后往前讲的也就是线讲的NVIC再到EXTI,现在我们在正式配置中断时就要从前往后: 其中外设中断不在我们本章讲解范围,后续使用到时会说。 可以看到事实上和我们的外部中断简图是一致的,也就是先设置GPIO的输入模式,再设置EXTI和IO的映射关系将信号传导到EXTI,再经由EXTI传导到NVIC设置中断分组及优先级,并使能中断,最后在CPU处理中断。 关于为什么要经由这么多寄存器层层传导,刷到一个视频说的是对于一个抽象系统,每一层只用负责处理本层接受到的信号并输出对应信号,尽管这里是硬件的具象系统,我认为道理还是一样的,每个寄存器只负责处理自己收到的信号并输出自己相应的信号就行,省去了单个寄存器的过多配置,提高传导效率。 1.2 中断配置 那么我们就能理清我们最终要配置的东西: 首先因为我们这里配置的EXTI线是连接在GPIO上的,所以我们首先还是使能GPIO的时钟并配置GPIO的输入模式,之后使能AFIO/SYSCFG的时钟并设置EXTI与IO的对应关系,再在EXTI设置屏

17 min read

More issues

26.3.20 ZD-EP61 [EXTI] EXTI介绍及其工作原理

1 EXTI简介 1.1 EXTI介绍 EXTI,External(Extended) interrupt/event Controller,外部(拓展)中断事件控制器。包含23(F4系列)个产生事件/中断请求的边沿检测器,即23条EXYI线。 中断和事件的对比: * 中断:进入NVIC、有中断服务函数、需CPU处理 * 事件:不进入NVIC、仅用于内部硬件自动控制、无需CPU,如TIM,DMA,ADC 之前误认为中断事件是一个完整的词,所以在之前的文章有出现类似描述一般指中断而非事件。 1.2 EXTI支持的外部中断/事件请求 如图,展示了各个系列支持的外部中断/事件请求,其中H7系列因其功率较高,因此提供了更多的中断选择来提高程序效率降低功耗。 1.3 EXTI的主要特性 对于F1/F4/F7系列,其每条EXTI线都可以单独进行配置:选择类型(
8 min read

26.3.16 ZD-EP56 [中断/NVIC] 什么是中断?

我也想知道什么是中断。 1 什么是中断 简单来说,打断CPU执行正常的程序,转而处理紧急程序,然后返回原暂停的程序继续运行,就叫中断。 中断具有以下作用: * 实时控制:在特定时间内对相应事件做出响应,如温度监控。 * 故障处理:检测到故障第一时间处理。 * 数据传输:不确定数据接收时间,在接收到数据时中断等待执行后续语句。 中断的意义是高效处理紧急程序,不会一直占用CPU资源。 STM32 GPIO外部中断的示意图如下: 首先外部中断通过GPIO传递到SYSCFG(System Configuration)进而将信息写入EXTI进行初步处理,最后通过NVIC使能/除能相应中断并控制其优先级再交由CPU处理中断。 这里我们先对NVIC进行介绍: 2 NVIC介绍及其工作原理 NVIC,Nested Vectored Interrupt Controller嵌套向量中断控制器,属于内核部分。 NVIC支持256个中断(16个内核+240个外部)和256个优先级且允许裁切,但实际情况用不到这么多的中断和优先级,于是ST公司将NVIC的中断与优先级进行了裁切,
15 min read

26.3.15 ZD-EP52 [LED/KEY] 点天灯!!!!

终于开始点灯了,,。。 1 点亮一个LED灯 在点亮一个LED灯之前肯定要创建一个项目工程,具体流程参见26.3.7 ZD-EP27 [Keil新建工程-HAL库版本] 新建HAL库版本工程流程*基于寄存器版本的增删,这里直接给出HAL库工程框架: Project_HALProject_HAL.zip10 MBdownload-circle 在新建完工程框架后,开始进行后续步骤: 1.1 添加板级驱动文件 在工程文件夹的Drivers文件夹下添加一个BSP(Board Support Package)文件夹用于存放相关外设的配置文件,再在BSP文件夹下新建一个LED文件夹。 回到Keil,我们打开工程文件,新建两个文件,分别命名为lcd.c lcd.h,并保存在LED文件夹下,至此我们开始正式配置LED外设。 1.2 配置LED灯 我们首先在.h头文件中做出基本的头文件定义: #ifndef __LED_H #define __LED_H #include "
18 min read

26.3.14 ZD-EP49 [GPIO寄存器] GPIO寄存器介绍及其配置流程

关于GPIO的寄存器,主要就是了解相关寄存器种类及其作用。先看看寄存器的定义:寄存器(Register),是中央处理器内部用于暂存指令、数据和地址的高速存储部件,通常由触发器或锁存器构成。运用在GPIO(通用输入输出端口)主要用于确定GPIO的工作模式和储存输入输出信号。下面以F407xx系列为例介绍GPIO相关的寄存器。 1 GPIO寄存器介绍 STM32F4每组(即A~I)通用GPIO口各有10个32位寄存器,包括: 4 个 32 位配置寄存器(MODER、OTYPER、OSPEEDR 和 PUPDR) 2 个 32 位数据寄存器(IDR 和 ODR) 1 个 32 位置位/复位寄存器 (BSRR) 1 个 32 位锁定寄存器 (LCKR) 2 个 32 位复用功能选择寄存器(
14 min read

UPDATE 26.3.18已成功优化 [Fixed] 博客加载速度优化,Webp图片格式折中实现方案

要不是我不想再推倒重来重新折腾一个博客,要不是这个ghost已经被美化的有点姿色,我真的想把这个杀千刀的弄死,真的就是个毛呸房,要更拓展的东西都要自己弄。。。。。。。。。。 因为在使用博客的过程中时常出现加载缓慢的情况,向AI三顾茅庐后总结出一下几点: * 服务器带宽太小(5M):我也就是个平民老百姓拿不出这么多钱,这点PASS * 通过CDN使用的插件过多:要算的话,其实也就prism代码块优化及其衍生插件(很多罢了)和Katex(数学公式实现),不过因为他们都是通过CDN线上加载的,如果CDN服务器抽风博客也跟着抽风,所以现在把插件下载到了服务器本地,这方面的问题应该会有所解决。但是好看是真好看了,你ghost也就这样了总不能一无是处吧。此外还修改了插件加载机制,仅在文章界面有相关调用才会加载插件,这样起码能保证主页的加载速度(应该)。 * 部分博客图片过多:这点我真的想骂死这个ghost,恕我以前无知,网上下过来webp的图片还在说怎么有这么奇怪的格式,现在我知道了webp是真香啊,我的服务器是真弱啊,webp的高压缩高保真形式真的太适合做网站图片了,但是这个ghost
2 min read

26.3.11 ZD-EP47 [GPIO] GPIO简介及其工作模式

GPIO,Genaral Purpose Input Output,通用输入输出端口,下面我们将从GPIO特点特性和GPIO的工作模式对GPIO展开介绍。 1 GPIO特点特性 关于特点特性这一块我们就直接照搬一下正点原子的介绍吧,这篇文章主要介绍STM32上GPIO的工作模式。 1.1 GPIO的特点 1,不同型号,IO口数量可能不一样,可通过选型手册快速查询; 2,快速翻转,每次翻转最快只需要两个时钟周期(F1最高速度可以到50Mhz); 3,每个IO口都可以做中断; 4,支持8种工作模式; 1.2 GPIO的电气特性 1,STM32工作电压范围? $$2V≤VDD≤3.6V$$ 2,GPIO识别电压范围? $$COMS端口: -0.3V \le V_{IL} \le 1.164V $$ $$ \hspace{4.5em} 1.
10 min read

26.3.10 ZD-EP39 [系统时钟] F4系列系统时钟初始化函数简介

1 系统时钟初始化函数介绍 正点原子提供的系统时钟初始化函数存放在Drivers/STSTEM/sys.c文件下,具体通过sys_stm32_clock_init()函数实现,该函数下的调用的两个主要函数为HAL_RCC_OscConfig()和HAL_RCC_ClockConfig(),这两个函数的主要作用如下: * HAL_RCC_OscConfig():即振荡器(Oscillator)配置函数,核心作用是启用 / 禁用 STM32 的内部 / 外部振荡器(HSI/HSE/LSI/LSE),配置锁相环(PLL)的倍频 / 分频参数,生成稳定的原始时钟源。 * HAL_RCC_ClockConfig():即系统时钟配置函数,核心作用是将HAL_RCC_OscConfig()配置好的时钟源(如 PLL 输出)选为系统时钟(
8 min read

26.3.8 ZD-EP37 [CubeMX/时钟树] CubeMX新建工程流程及F407时钟树的介绍

1 时钟树简介 我们先简单介绍一下时钟树(基于STM32F407),先看简图(高速部分): 可以看到外部晶振(探索者系列HSE频率为8MHz,F4系列HSI为16MHz)经分频和锁相环的倍频分频后为SYSCLK提供了一个稳定的高速频率,并(经分频后-可选)传递到总线部分,再经一系列分频操作传递给外设。 F1系列HSI默认直接进行二分频,目的是:满足 PLL 硬件输入规格、兼容频率上限、提升时钟稳定性而设计的强制逻辑,是底层硬件与时钟规划的最优解(由豆包生成) AHB分频操作的目的:向下满足不同外设的硬件频率上限,向上匹配系统性能与功耗的平衡,同时兼顾总线协议兼容性和特殊外设(如定时器)的功能需求。(由豆包生成) 内部振荡器为RC振荡器,稳定性较差,使用外部振荡器可以得到更稳定的频率 下面再看低速部分: IWDG(Independent Watchdog)主要用于超时复位,在程序卡死时复位单片机 这里主要看RTC,RTC用于为系统提供精确的时间,因此在有外部振荡器的情况下优先选择外部振荡器(频率更稳定),若实在没有外部振荡器也可以使用内部振荡器替代。 看完简图我们最后
7 min read

UPDATE 主题统一性更新测试

为确保日后可能会用到的功能的形式统一性,在此做一个测试帖子 测试已完成,最终主题文件如下: Journal-chaolan2017n-futureJournal-chaolan2017n-future.zip539 KBdownload-circle这是一个按钮测试26.3.7 ZD-EP27 [Keil新建工程-HAL库版本] 新建HAL库版本工程流程*基于寄存器版本的增删HAL库版本的工程框架和寄存器版本整体大差不差,区别主要是在部分文件夹引入了HAL库相关文件 寄存器版本新建工程流程见下: 26.2.28 ZD-EP22 [Keil新建工程-寄存器版本] 新建寄存器版本工程流程新建工程好复杂,但是养成习惯应该会很好 1 新建工程文件夹 首先在新建的工程文件夹的根目录下创建五个文件夹,分别是Drivers,Middlewares,Output,Projects,User。其用处如下: 文件夹名称 作用 Drivers 存放与硬件相关的驱动层文件 Middlewares 存放正点原子提供的中间层组件文件和第三方中间层文件 Output 存放工程编译输出文件 Projects 存放
4 min read

欢迎订阅 Subscribe to 沿江路右转Turn Right at Yanjiang Rd.

期待您的精彩评论 Looking forward to your wonderful comments.
[email protected]
订阅 Subscribe
赣ICP备2026002696号