stm 三二外部中断是一种常见的硬件触发的中断方式,可以用来响应外部事件,例如按键按下传感器触发等。在使用 stm 三二外部中断之前, 你需要了解一些基本的概念和步骤。以下是一个简单的 stm 三二外部中断入门指南。一、开发环境搭建 确保您已经安装了 stm 三二 q bam max 和相应的 id, 例如 kill ear 或者 stm 三二 q by dee。 二、启动 stm 三二 q bam x stm 三二 qbmx 是一个图形化工具,可以帮助你配置 stm 三二 v 控制器的引脚,始终外设等。三、选择微控 控制器型号在 s t m 三二 q 八 max 中选择你正在使用的 s t m 三二 v 控制器型号。四、配置银角配置用于外部中断的银角在 pad out configuration 选项卡中 找到你希望用作外部中断触发银角的银角,然后将其配置为 gpl xt。 五、配置外部中断 在 configuration 选项卡中找到 system, 然后启用 xty 设,选择外部中断触发的引脚,设置触发条件上升严,下降严,或者两者都有。 六、生成代码点击 st m 三二 q 八 max 界面上的 project 菜单,选择 你使用的 ide, 然后生成代码。七、在 ide 中打开项目,打开 ide, 导入生成的项目,根据你的 ide 可能需要进行一些额外的配置。八、编写中断服务程序 在你的代码中,你需要编写外部中段的处理函数。处理函数的名字通常以 white x, takes, third, candle or white 的形式命名,其中 x 是外部中段的编号。九、启用中段 在命令函数或初始化代码中启用外部中断,这通常涉及到调用 hl amike neighbor like aq 函数。十、编写主程序在主程序中执行一些初始化操作,并进入主循环。 十一、编译和烧路编译你的代码,并使用合适的工具将固件烧路到 stm 三二 v 控制器中。十二、调试。如果需要使用调试工具进行调试,以确保外部中断能够正常工作。 这只是一个简单的入门指南,实际情况可能会根据你的具体项目和使用的 id 有所不同。确保查阅相关的 stm 三二文档和参考手册以获取更详细的信息。
粉丝200获赞1352
中断,对于刚入门 stm 散热的朋友呢,可能对于这个中断呢概念是有点模糊的,那么这里呢,我们通过一个啊定义给大家看看一下, 打断 dpu, 执行正常程序,也就是打断正常程序,转而呢处理紧急程序嘛,然后呢,返回原暂停的程序继续运行,原暂停的程序继续运行,那么这样的一个过程呢,我们就称之为中断, 中国这样的一个文字呢,可能大家理解起来还有点困难,那么下面呢,通过一个实际的例子给大家说一下,比如说放学了,你回家做作业,或者说你家里的朋友回家做作业,是吧? 那么做作业完成的时间是这样子的,但是呢,做到一半的时候,突然老妈叫你去吃饭了, 那么怎么办?只能暂停下来,跑去吃饭,吃完饭之后呢,他完了,你要跑去这一个看电视,看完电视呢,要跑去洗澡,洗完澡呢就睡觉了,洗洗就睡了,如果你是这样干的话,那么你这一件事呢,就不叫中断了,你应该称之为这个中指啊,你是中指做这个作业了, 游子不可教也。那么既然是中断,我们要怎么办呢?做完饭继续回去,而吃饭的这一段时间呢,对于我们做作业来说呢,是空白的,因为没有做作业嘛,这段时间, 那么我为了完成作业呢,我们只能往后延迟一段时间了,而这一段时间呢,和我们吃饭的时间是一样的吗? 这才是中断,知道吧?可以看到呢,中断呢,其实会对我们正常的程序,也就是做作业,他得仔细,时间上 会有影响,会使得我们执行的时间呢?往后挪一段,这是从这个时间上概念来看的, 我们生活中还有很多关于中断的一个例子,比如说你现在在看我们的视频,突然来了个紧急电话,你点击一下这一个暂停键,跑去接电话了,接完电话回来继续看视频,那么这也是中断的一个例子。那么这里呢?我们就已经介绍完什么是中断了。
hello, 各位小伙伴们大家好,这里是 kiss king。 在上期视频中,我们一起了解了所谓中断,就是打断程序的正常执行流程,执行一些由突发状况引起的紧急任务, 并且通过一个案件的例子简单了解了如何使用外部中断,还挖了几个坑。 nyc efti 中断、向量中断优先级,他们到底是什么呢?那么本期视频我们就来一起好好聊聊。 先从我们已经接触过的 e x t i 入手,假设我们来到了按键 k 一对应的 g p l 口,也就是 p b 十二,它的 g p l 内部。此结构图我们已经在第五集视频做了详细的讲解。 外部的电瓶信号进入到 gpl 后来到了输入驱动器,首先是经过上拉下拉电阻,然后 经过施米特触发器转化,最后抵达了输入数据计算器或者片上外设。而其实再接下来,电瓶信号还会抵达这样一个结构。这张图在资料包中 stm 三二中文参考手册的第一百三十五页可以找到,我们称其为外部中断实践控制器。 像这样的结构,在我们使用的 s t m 三二 f 一系列芯片中共有十九个。这十九个外部中断控制器共用了一套计算器,但其中的连线都是独立的。 图中的这些连线其实有十九组,每个外部中断都对应着其中的一组线路,所以我们有时也称其为外部中断线。这十九个外部中断线的前十六个,也就是 e x t i 零到 e f t i 十五,分别对应着与其编号相同 的 g p l 口,就是说从 p a 零、 p b 零、 p c 零, p d 零进入的电瓶信号都可以进入 e x t a 零,然后 p a 一 p b e p c e p d e 都是对应着 e x t a 一,一直到 p a 十五, p b 十五, p c 十五, p d 十五也是对应着 e s t a 十五。 对于这张结构图,我们仅需要有大概印象即可,不必深究牢记,所以请抱着轻松愉快的心态观看接下来的知识。注意在接下来的语境中,高电平与一等效,低电平与零等效。 首先是这块区域,实际上这块区域与中断无关,而是与事件相关的结构。所谓事件其实是与中断类似的概念,只不过中断信号会抵达处理器中,调用代码进行处理, 而事件信号却是送达相应的外设,由外设自行处理。这不是我们本期视频的学习范畴,所以先不管他。然后是这一块结构, 电眼检测电路可以检测输入的电瓶信号中有没有发生高低电瓶的转换,也就是有没有出现上升眼或者下降眼,然后再根据上面这两个计算器的配置来决定是否向后输出一个高电瓶信号。 还记得我们上期视频在 q m x 中选择是上升沿触发中断还是下降沿触发中断吗?其实就是在配置这两个计算器, 就比如我们给 p p 十二配置了下降沿触发中断,那么上升沿触发选择计算器的第十二位关闭为零,下降沿触发选择计算器的第十二位开启为一。那么接下来, 当边沿检测电路检测到了下降岩石就会向后传递一个高点频信号,此信号经过一个货门后抵达请求挂起计算器 和我们的特性是两个输入端,只要有一个输入为一,则输出就是一。因而软件中断事件计算器的存在让我们可以通过程序模拟产生一个中断,不过这个功能我们一般也不需要,就先忽略掉。 注意了,请求挂起计算器是一个需要注意的点,其接收到高电瓶信号后会将对应的位置一,例如我们当前举例的是 exti 十二, 因而接收到从第十二根外部中断线来的高电瓶后,请求挂计算器的第十二位会被质疑,然后请求挂计算器又会将此位输出到 一个雨门。雨门的特性是当两个输入都为一时,输出才是一,否则便输出为零。因而此雨门的另一个输入中断屏蔽计算器就掌握了此中断的生杀大权, 只有他的对应位置上唯一输出高电频,请求挂起计算器的信号才能通过雨门进入到 nvic 而中断屏蔽计算器的开启。其实我们在将 pb 十二设置为 gpio exti 十二时, qbmx 就自动帮我们在生成的代码中完成了。 那么来自请求挂起计算器的高点屏信号继续向后就到达中断最高程。 nvicnvic 又称嵌套向量中断控制器,其主要作用便是掌管着这样一张中断向量表。所谓向量,那便是有方向 的量,中断项量的方向就是指向中断处理函数。在所有的外部中断线中,只有 exti 零到 exti 四拥有自己的中断项量,而 exti 五到 exti 九共享中断项量。 exti 九杠五 e x t i 十到 e x t i 十五更像中段向量 e x t i。 十五杠十。也就是说,当来自 e x t i。 十二中断线的信号抵达 n v i c 后, nyc 会找到中段向量 e x 十五杠十,然后按照其指向执行 e x 十五杠十 r q handler 函数。 这下我们就搞清楚了为何上期视频中,我们要将绿色小洞翻转代码写在 e x t i。 十五杠十 r q handler 函数中。不过还有一点需要注意的是, n y c 是在一直检测某个中断线是否处于激活状态的。当中断处理函数,也就是 e x t i。 十五杠十 r q handler 运行完成后, n y c。 倘若依旧检测到 e x t i。 十二中断处于激活状态,就会再次运行 e x t i。 十五杠十 r q handler。 因而,为了让中段处理函数只执行一遍,而不是无限重复,我们需要在中段处理函数中将请求挂旗行器的对应位清除为零。 不过回想一下我们上期视频在 exti 十五杠十 rq handle 中的代码,好像只写了关于绿色脚灯翻转亮面的代码,并没有写什么清除请求挂计算器, 那程序为何可以正常运行,并没有发生所谓的无限重复呢?其实仔细看我们会发现,在 exti 十五杠十 rq handler 中,还有一行 qbmx 自动帮我们生成的代码调用了一个叫做 hell gpio exti rq handler 的函数,并将 kepin 作为参数传了进去。 而 k e p 就是 g p i o p 十二,其对应的外部中断线也就是 e x t i。 十二。我们按住 ctrl 点击 hail g p i o e x t i r q handler 进入到其函数实现,这时我们就会发现它调用了一个名为 hail g p i o e x t i clear it 的函数, 并将我们传入的参数 g p i o p 也就是 k 一 p 或者说 e x t i 十二传给了此函数,而这个函数正是清除请求挂气计分器的函数。电用此函数后,请求挂气计分器的第十二位也就清除为零了,从 不会误导 nyc 再次执行 exti 十五杠十 rq handler。 如此看来,清除请求挂计分器的操作 qbmx 已经贴心的帮我们做好了,没有特殊情况下,我们也就不必再去关心清除请求挂机计分器的问题了。 q 版 max 真不愧是 s t m 三二开发必备神器,那么刚刚我们所描绘的只是发生一个中断的情况,如果两个甚至多个中断同时触发呢?如何安排这些中断的执行顺序呢? 看过上期视频的小伙伴一定想起了在上期视频中,我们是如何解决了黑奥迪丽依赖的 system take time 中断无法运行的问题。是的,中断优先级。在中断项量表中,中断项量不仅有中断处理函数,还有优先级信息。 在 s t m 三二中,中段向量的优先级分为两层,抢占优先级和响应优先级。优先级的数字越小则代表越优先。 有这样两种情况会需要判断争断优先级。第一种情况是,当两个中断几乎同时发生, 这时 nvic 会首先判断两中断的抢占优先级。假如 a 中段的抢占优先级更高,换句话说, a 中段的抢占优先级数字更小,则 a 中段先执行 a 中段执行完成后再执行 b 中段。 但假如 a 中段与 b 中段的抢占学籍相同,那便再比较二者的享用学籍,由享用学籍更高的中段先执行。例如, a、 b 中段抢占学籍相同,但 a 中段的享用学籍更高,则也是 a 中段先执行,然后才是 b 中段。 当然了,假如 a、 b 中断的响优先级也相同的话,那就是按照他们在中断项量表中的顺序决定,这在我们并不关心他们的执行顺序的情况下才会发生,否则我们应该给他们设定不同的优先级。 第二种情况是, a 中段已经在执行过程中, b 中段信号突然到达,那么这时 s、 t、 m 三二只会比较两中段的抢占优先级。 当 b 中段的抢占原籍优于 a 中段时, b 中段就会抢占执行,像打断正常执行流程那样打断 a 中段,等到 b 中段执行完成后,再恢复 a 中段的执行,当然最后会恢复正常流程的执行。 而倘若 b 中段强占先级弱于 a 中段,或者与 a 中段相同,便只能乖乖地 a 中断执行结束再执行了。上期视频中,我们设置了系统滴答的抢占原籍优于我们的 exti 十五杠十,就是为了让系统滴答可以在 exti 十五杠十执行过程中抢占执行,从而为还有的类提供时间基准。 从这几种情况中我们可以看出,响右先级仅在两中段同时发生时起到辅助作用,抢断右先级才是真正的老大哥。 s t m 三二为每个中断项量准备了四个二斤之位来储存中断优先级信息。在 q b m x 中,我们可以自由选择这四位中,几位用来设置抢占优先级,几位用来设置响应优先级。默认设置是四位都用来设置抢占优先级。这时 每个中段限量的抢占先集都可以设置为零到十五,但响应先集只能被迫做零。如果设置为两位为抢占先集,两位为响应先集,则二者都可以设置为零到三。 不过想预选集的用处不大,所以我们一般保持默认的思维都是抢占预选集即可, 我们从头梳理并查漏补缺。从引角进入的高低电瓶信号首先由输入驱动器处理, 此处插一个小知识点,如果中断信号下需要上拉或者下拉,也可以在 qbmx 中直接配置。经过输入驱动器处理过的高低电瓶信号会进入到边沿检测电路,当边沿检测电路捕获到我们设置的边沿信号后,就会像请求 求挂起计算器输出一个高电频信号,请求挂计算器对应的位会质疑。然后只要我们已经开启了此中断,请求挂计算器的信号就可以进入到 nycnyc 会找到此中断线对应的中断项量,并执行相应的中断处理函数。 并且在中断处理函数中需要清除请求挂计算器,以防止中断重复出发。当然,这一操作 qbmx 已经自动帮我们完成,我们仅需要了解有这回事即可。 针对多个中断同时发生的情况,我们可以使用中断优先级来规定执行的顺序。响应优先级用处较小,往往我们只需要设置抢占优先级即可,优先级的数字越小,则优先级越高。怎么样,是不是清晰明了了呢?不过刚刚说的 其实只是外部中断如何触发的情况,实际上串口、 usart、 定时记、 trm、 iphone c 等等外设也可以触发多种相关中断。不过不用担心,他们的中断触发与外部中断也大同小异, 虽然没有外部中断线这套结构,但也会有相应的请求挂计算器与中断屏蔽计算器。触发中断后依旧需要 nyc, 通过中断项量找到并执行中断处理函数,中断处理函数也是需要清除请求挂起计算器。 这些在我们后面的视频中都还会讲解并应用到实战项目当中,别忘了点击关注不迷路!好的,那么本期视频的内容就到这里了,制作不易,求大拇哥大钢镚五角星, 这是我在这条路上继续走下去的动力。下期视频我们将迎来串口通信的学习,我们下期再见!拜拜!
stm 三二定时器中断代码编写本期视频带大家一起编写一下 stm 三二定时器中断代码。我们打开之前视频新建的工程文件夹, 新建一个 app 文件夹之后,将所有的外设操作文件都放到这里。打开 app 文件夹,新建一个 timer 文件夹,用来放我们本期编写的实验代码。 在 timer 文件夹中新建一个 timer 店 c 文件和一个 timer dh 文件,然后打开我们的工程,把它们都添加进来。先添加一下文件路径, 然后新建一个 a p p 组,把刚才的两个 timer 文件添加进组里。 我们打开 timer, 点 a 全键,写一下防止重 负包含的红定义, 这样写就可以防止重复包含问题。再打开 timer, 点 c 文件,包含一下 stm 三二的头文件。 我们使用外设,首先就要先初始化,这里写一下初始化函数框架, 今天我就使用 t m 二来进行中断实验。第一步就是要打开总线时钟,我们看一下结构图,可以看到 t m 二是在 a p b e 总线上, 所以我们就使用 r c c a p b e paragraph crc m d 这个函数初始化时钟。我们可以右键转到定义,看看怎么填写参数,这里我们要开启 team 二十中,所以我们选择这个,把它复制一下。第二个参数是 enable 还是 disable? 回到我们编写代码这里,把刚才复制的参数粘贴到这里,第二个参数选择 enable。 经过之前视频的分析,我们知道 tm 二有很多失踪员可以选择刚才代码,只是开启总线时钟,我们还需要让控制器选择 rcc 时钟, 打开内部组,可以看到标准库中每个外设都有对应的库文件, e team 点 c 位后缀的就是定时器的库文件了。打开之后,我们在右键打开它的头文件,我们拉到最下面,就可以看到有很多函数,这些函数就是操作定时器这个外设的全部函数了, 你想怎么配置都可以在这里找到对应的功能函数。我们需要定时器的时钟,选择内部 rcc 时钟,也可以找到时钟配置函数。因为通用和高 定时器有很多试中员可以选择,所以这里有很多试中相关函数,我们要使用内部 r c c, 试中员就使用这个 team internal clock config 函数。选中,点击上方的小齐,将用到的函数做一个标记,方便以后查阅。 复制一下这个函数粘贴到这里,不会使用,也可以右键转到定义看下详细信息。这里只有一个参数,是选择哪个定时器,回到这里,我们选择 t m 二, 这样时钟元就配置好了。接下来就该初始化定时器的实际单元相关参数了,也就是配置于分频器,自动重装在职技术模式等。打开库文键,也有功能函数可以配置这些就是这个 team time basically 函数, 我们复制一下它粘贴到我们代码这里。同样的,我们右键转到定义,看一下他需要什么参数。这里是说需要填入哪个定时器和一个 team time bassinate tap deaf 结构体参数,我们复制一下这个结构体类型, 回到我们的代码定义这样一个结构题,参数名字可以随便起,为了见明之意,我命名为 tim time basinet structure, 将这个函数的参数填写完整,第一个参数是 tim 二,第二个参数是刚才定义的结构体取地址, 现在我们填写一下这个结构体的参数,加快一下。先把参数全部引出来,我们看一下 teamclock 的 vision 这个参数怎么写,可以转到定义,查看一下详细信息。这个参数是时钟分割,是时钟圆绿波,这里有 关,和我们本期实验关系不大,我们搜索看下参数,随便配置一个就好了,可以配置成这些参数,我们选择第一个吧,复制一下粘贴到我们的代码这里,我们转到定义,再看一下 cancontomo 的这个参数怎么配置, 这里是说配置技术器的模式,我们搜索一下这个 team count mode 红定义,看一下参数。参数可以配置成这几个,有向上对齐,向下对齐,中央对齐。技术模式我们一般都选择向上对齐,其他模式在别的地方有用,粘贴到这里就可以了。 下面这两个参数就是自动重装在和预分频值了,取值范围都是零到六万五千五百三十五,用来控制定时时间。内部来到预分频的时钟频率是七十二兆赫兹,我们可以把 频率降低七千两百倍,变成十 k 赫兹,这样计数器就是零点一毫秒加一个数,然后再把自动重装载值设为五千,就可以定时零点五秒了。如果你想定时,其他时间稍微计算一下就可以了, 我们就零点五秒定时器中断一次吧。因为设置的值比真实的多一,所以这里还要减一, 上面自动重装在也要减一,填五千减一,这样就配置了定时,时间是零点五秒,当然如果你不想这样组合,也可以自己配置其他数值组合。最后这个参数是高级定时器才用到,我们写零就可以了。 定时器初始化已经写完了,但是这样配置开中断之后就会立刻进入一次中断。如果不想这样,我们还需要清除一下中断标志位 倒库函数,这里找下清楚,中段标志位的函数就是这个函数,我们复制一下,复制到这里, 右键转到定义,看下参数,这里第一个参数是哪个定时器?第二个参数是哪个中段标志位定时器中段有很多,其他中段都是定时器其他功能用到的,我们选择 ten flag update 这个中段复制一下, 第一个参数写 t m 二,第二个参数写刚才复制的,这样初始化定时器才是真的完成了。接下来我们开启 t m 二的中段,我们找下库函数,这个 t m i t config 函数就是开启定时器中段函数了,我们把用到的函数做一下标记, 把这个函数复制到代码,转到定义,看下参数,第一个参数是哪个定时器,第二个参数可以选择 这些中段我们选择 team it update 回到我们的代码填写参数,第三个参数选择 enable 使能,这样定时器中段功能就开启了,但是现在只是将中段输入进内核了,因为内核内部中段都是由 n v i c 控制,所以还需要配置 n v i c。 我们找下库函数,可以看到库文件并没有 n v i c 结尾的,这是因为 n v i c 室内和外设 st m 三二把库函数放到了 mis c 文件内了,打开后我们打开它的头文件,拉到最后就能找到它的库函数了。 n v i c 配置需要先设置优先级分组,使用 envic priority group config 这个函数,然后再使用 n v i c in it 初始化 n v i c。 我们先设置一下右 六线级分组,复制到我们的代码,转到定义,看下参数,可以配置成这些参数。关于 nvic, 不懂的可以看我之前的视频,因为只有一个中段,这里随便选,我选择分组二吧。设计好分组,再来初始化一下 nvic, 复制一下函数, 转到定义看参数配置,这里参数只需要一个 nvic in it type define 结构体,我们在上方定义一下, 名字叫做 nvic in it structure。 将参数地址传进去,再把所有参数都引出来, 转到定义,看下参数怎么复制。第一个参数是中断通道选择,具体在 stm 三十二 fe 零 x dh 文件中,我们打开 stm 三十二 fe 零 x dh 文件 最上面这里就定义着很多中断通道,我们找到后缀为 m d 的红定义,关于后缀 m d 的意思可以暂停看下这里中断通道选择 t m 二 i r q n 复制过去就可以了。第二个参数是控制通道是否开启,我们填 neibo 第三个,第四个就是抢占优先级和响应优先级了,因为只有一个中段可以随意设置,我这里都写二。现在 nvic 就配置好了,我们现在就可以开启定时器了, 使用 t m c m d 函数可以开启定时器,第一个参数写 t m 二,第二个参数写 enable, 这样整个初始化就完成了。这里注意一下, n v i c 分组设置是对所有中短都有效的,也就是整个工程只能配置一次。 如果你有其他中断,这里就要注意一下了。现在我们来写一下中断入口函数。中断入口函数名在 startup 这个启动文件中有定义,不能随便写。这里有所有的中断入口函数,并且都是若定义,我们可以重写 这个 team 二 irq handler 就是 team 二中段入口函数了。复制到我们的代码,快速写一下函数框架。在中段函数中,我们需要手动清除一下中段挂起标志位,我们快速写一下 整体就是先用 team get it status 函数判断一下挂起标志位,然后再用 team clear it pending bit 函数清除一下标志位,中段函数就写好了。我们把初始化函数声明一下,这样整个定时器中段就写好了。现在 我们在主函数中调用一下,在上方包换一下 timer 头文件,这样定时器就每隔零点五秒执行一次中断函数了。我们把想执行的程序放进中断函数中就可以了。快速写一个 led 闪烁的程序,测试一下, 这样 led 灯就是每隔零点五秒亮灭。编一下,再看一下,这里有错误是因为有 c 九九的语法,我们点击魔术棒 c c 加加选项卡,勾选 c 九九 mode, 再次编译一下就没有错误了。现在我们看下现象吧。今天的视频就到这里了,欢迎留言评论,我们下期见。
stm 三的中断优先级的一个基本概念,到底有哪一些概念呢?先来看下第一个抢占优先级,那么这一个呢,在我们上一节课呢,有给大家提到过一下,这里呢,就来了解一下什么是抢占优先级。 简单来说,高的抢占优先级,那么是可以打断正在执行的低。抢占优先级的这个中断高的可以打断低的,那么可以通过这个关键字就可以知道了,点赞嘛,也就是抢夺我们的 cpu 的一个使用权, 那么这是抢占优先级。再来看一下,还有一个叫响应优先级的,那么也称为这一个子优先级,有的地方你可以看到,他称为这个子优先级, 就是当我们的这个抢占优先级相同的情况下啊,这一个相同,那么响应优先级高的先执行, 但是呢,响应优升级它是不能相互打断的,这个是重点,响应优升级是不能相互打断的,而这个抢占优升级呢,是可以相互打断的。 那么举一个例子吧,比如说我是 k 级干部,你也是 k 级干部,那么这时候呢,我们的这个抢占优先级呢,就相同了, 但是呢,你的年纪比我略大,是吧?你比较年长一点,那么你的这个响应又升级呢,就高了。那么这时候我们一起走到会场,因为你的年纪大一点,那么我让你先走,那么你就先执行吧, 但是呢,如果我已经走在前面了,你在我后面,你就不能把我拽到后面,让你先走,所以说呢,他就不能进行这个打断。同样呢,如果你在我前面,我也不能把你拽到我后面,让我先走,所以说呢,他就是 不能才会打断,知道了吧?不能才会打断,那么再来看一下我们下一个抢占优先级和响应优先级相同的情况下,那么这两个都相同, 自然优先级越高先执行。什么是自然优先级啊?自然优先级,那么又到我们这个自然优先级的概念了,自然优先级呢,他就是属于这个中段销量表里面的优先级了,待会再给大家看一下中段销量表里面的优先级, 这一个数值越小表示优先值越高,在我们 stm 三二里面数值越小代表他的优先值越高, 那比如说我们的优先级为零,那么就比优先级为一的高,优先级为一的要比优先级为二的高,就是这一个意思,给大家三 三秒钟来强行记忆一下。 话是这么说是吧?但是大家有没有记得住呢?我希望通过这一个方法,希望大家能记住。
今天分享一下 s t c r 中段的一个学习,然后可以看一下什么实际的效果,由于没有按键,我就用一个导线给他拉低,他是向前出发, 我这已经触地,然后再触地,然后由于抖动的原因,因为没有按键,然后没有电了,没法消抖。 让我们可以看一下代码,代码就和我们前面学习 led 一样,在这个文件中添加一个 exti, 点 c 和点 h 的一个文件,然后在这个点 c 文件中,点 h 文件中我们可以照样的 把这个防止重复的一个格式同样的给他写下来,然后第一个出手函数,然后进入到出手函数中,我们首先要使人我们的一个 gpl 和我们的 afio, 然后使人以后对我们这个 gpl 进行一个说实话,因为我们用的是 gpla 零这个口作为他的一个中断输入的一个一个一个输入口, 我们将 gpi o 初始化完成以后,我们就初始化我们的一个呃 exti 外设,然后同样是要定义这个结构体, 让我们可以在这个 yes t i, 我们可以找到我们的 yes t i t i 这个我们可以看一下它可以用哪些,然后明显这个音译的这个函数就是我们的输出函数,然后我们可以看到他需要的一个参数是一个集中体,可以看到他所需要的参数是一个集中体,然后我们就可以来找这个集中体的, 然后把这几个题定完成以后,我们就快速的写出他需要的函数,一个耐一个模式,一个这个石门,然后他的一个模式,然后这个模式的时候因为我们没有外部下拉电阻,所以说我们就要采用他内部下拉的一个模式, 然后初始化我们的这个 estn 外设,以后我们就来初始化我们的 nvic, 同样的 nvic 我们也可以进去找到,然后看看他需要哪些, 然后这是我已经找找到的位置, 我们可以看到一些参数,同样的处理完成,然后我们要注意的是这两个中断优先集合啊,巧妙,因为我没有其他,我可以是个二,你是神笔也是一样的。然后接下来就是我们的一个中断处理函数,在这个中断处理函数中,然后我们先判断有没有这个中断,然后有中断以后,然后我们再 清明这个中断的一个标志位,然后我们在中断处理两分钟,我们就直接来交替开关我们的一个这个 c 十三, c 十三用我们接着使用的就可以实现我们的一个效果。 然后我们在主函数中只需要将我们的文件引用出来,然后对它进行一个初始化,然后这个 led 初始化是我们前面分享过的,已经在这个初始化中,然后这就可以实现中大的一个功能。
stm 三二定时器结构以及定时器中断配置?本期分析一下定时器结构以及如何配置定时器中断。首先我们先来了解一下 stm 三二的定时器。 stm 三二的定时器分为三种,基本定时器、通用定时器和高级定时器。 stm 三二、 f 一系列定时器资源不包括 sistic 等,最多有八个定时器。 sistic 和看门狗定时器我们本期视频不涉及 八个定时器,编号分别为 tim 一到 tim 八。其中 tim 一和 tim 八是高级定时器, tim 二到 tim 五是通用定时器, tim 六、 tim 七是基本定时器。但在 c 八、 t 六芯片上,定时器资源只有 tim 一到 tim 四。由于 没有基本定时器,我们可以使用 t、 m 二等这些通用定时器来完成定时器中断功能。通用定时器包含着基本定时器的全部功能,所以我们先来看一下基本定时器框图。 本期的重点是配置定时器中断其他的定时器功能,比如输出、比较、输入、补货等,暂不介绍。这里这样的箭头就是中断的意思,向下的箭头就是事件的意思, 中段是触发后执行一段程序,而事件触发后可以不经过 cpu 指节操作其他硬件。上面这部分我们可以理解为定时器的时钟源。每个外设在初始化时,第一步也是最重要的,就是要配置时钟。 定时器的时钟来自总线,时钟由 r c c 控制。这里还有一个时钟控制器,是用来选择时钟源的 基本定时器时钟只能来自内部 rcc, 而通用和高级定时器就可以有很多种时钟来源,时钟源确定之后,就连接到了遇分频器这里。遇分频器是什么意思呢? 我们的定式器其实本质就是一个技术器,当技术到达我们的设定值时,就产生一些动作,比如中断或者事件。 技术就是由时钟驱动,每来一个时钟上升沿,技术就会加异。由于时钟源都是几十兆赫兹,如果直接输入到计数器这里,技术就会非常快。为了让技术慢一点,就需要把时钟给降低一下,这里的域分频器就是为了降低时钟源频率的, 那么他是怎么降低时钟频率的呢?其实他是用技术的方法降低频率的,比如我们设置预分频器为实,预分频器 内技术就会从零累加,这里的时钟员来到一个上升沿之后,技术就加一,直到加到我们设置的预分频之时,才会在这里输出一个上升沿,让技术其加一。因为预分频器从零开始累加零一、二、三等直到十, 是经过了十一个时钟周期,所以我们设置与分频值为十,其实这里出来的时钟频率是缩小了十一倍,也就是设置与分频值与真实与分频值有个一的偏差。我们写程序时要注意, 简单来说就是输入到计数器这里的时钟频率缩小了,预分频值加一倍。时钟频率确定了,计数器累加的快慢也就确定了。我们还需要给计数器确定一个累加目标值,到达目标后就会归零,然后重新累 累加,这个累加目标值就存放在自动重装在计存器中。我们设置好目标之后,计数器累加,直到目标值就会触发中断或事件,然后清零,重新开始累加。这个计数器累加也是从零开始,零一二三直到目标值, 所以也是比真实设置的值多了一个时钟周期。现在计数值确定了,技术快慢也确定了,所以整个定时时间也就确定了。 我们总结一下,所以定时时间就等于时钟原频率除以预分频加一,再除以自动重装再值加一。我们还看到这两个地方都有阴影,这是表明他没有缓冲寄存器。 比如我们设置好他们的值后之后,需要修改修改他们的值时,计数器还没有完成一个计 数周期就会导致一些小问题。可以看下这张图,我们修改值时,先写入寄存器,处理器会先保存起来,等到这里一个技术周期结束之后,再让这个新设置的值声效。 这一部分统称为时机单元,基本定时器就是这些内容了。我们再来看一下通用定时器。 通用定时器因为加入了其他功能就复杂了很多,本期只使用定时器中断功能,我们只需要看这一部分就可以了。 我们放大看一下,这一部分就是刚才基本定时器分析的实际单元了。上方时钟源选择也多了很多,我们主要是选择内部 rcc 时钟源,其他的先不看,只使用定时器中断。通用定时器和刚才的基本定时器使用方法是一样的。这里注意的是, 通用定时器技术模式有三种,向上技术模式、向下技术模式中央对其技术模式 区别就是,向上技术模式是从零累加到自动重装在值。向下技术模式是从自动重装在值递减到零,中央对齐,就是先从零加到自动重装在值,然后再递减到零。 现在我们来总结一下初始化流程吧。一、首先要配置 r c c 总线时钟。二、通用定时器有很多适中源可以选择,我们使用内部 r c c 时钟。三、 初始化时机单元,也就是配置自动重装在职遇分频器和技术器的技术模式。四、开启定时器中断。今天的视频就到这里了,欢迎留言评论,我们下期见!
stm 三二、外部中段标准库代码编写本期使用一个按键作为外部中段的输入控制。 led 灯的亮面电路图就是这样的,按键一端接到 pa 领口,另一端接地 并联的这个电容是为了消抖的,防止按键抖动多次触发中断。我们现在来写一下程序,打开新建的工程文件夹,新建一个 app 文件夹,在 app 文件夹内新建一个 exti 文件夹存储本期的程序, 在 e x t i 文件夹内新建一个 e x t i 点 c 文件和一个点 h 文件,现在打开工程,把这两个文件加入到工程,先添加一下文件路径,这里勾选上 c 九九 mode, 然后再新建一个 app 组,将刚才的文件加入到组里, 现在文件就添加进来了。我们在 e x t i 点 c 文件中包含一下头文件,在 e x t i 点 h 文件中添加一下防止重复包含的红定义,这样准备工作就做完了。我们编一下工程, 现在开始写程序,第一步都是需要写一个初始化函数,用来初始化外设。 e x t i in it 函数名与库函数重复了,我们函数明写成 e x t i config。 初始化的第一步就是打开时钟了,我们本期使用的是 pa 领口,需要打开 gpioa 和 fio 的时钟。 exti 虽然也是外设,但是它的时钟是一直开着的,我们不用管 g p i o a 和 a f i o 都在 a p b 二总线上,所以我们使用 r c c a p b 二、 paragraph cla cmd 函数,打开时钟,右键查看一下参数,复制一下 gpioa 和 afio 两个参数回到我们的程序,粘贴到这里, 因为两个都在同一条总线上,我们打开时钟时可以使用或操作把它们写到一起。后面这个参数选择 innable 时钟打开之后就是初始化 gpio 了, 使用 g p i o innate 函数初始化 g p i o。 右键看一下参数,需要 g p i o。 分组合一个结构体地址参数,我们复制定义一个结构体,结构体名字为 g p i o in it structure, 把结构体地址传入函数函数,第一个参数是 gpioa, 第二个参数是结构体地址,快速把结构体参数引出来。第一个参数是 gpio 模式, 我们电路外部没有上拉电阻,需要使用内部上拉,我们去定义,找一下参数, gpio 模式的参数在这个里面有定义,我们搜索一下,这里就是 gpio 的八种工作模式,我们选择内部上拉输入模式,复制到我们的程序。 第二个参数是 io 口选择,我们选择 gpio 片零。第三个参数是 gpio 速率我们选择最高就好了。按照刚才的方法搜索复制一下参数, g p i o。 已经初始画好了,我们需要配置一下 a f i o。 把 p a 零与 e x t i 零连接起来, a f i o。 的相关库函数也在 g p i o。 库文件中,我们打开 g p i o。 库文件的头文件,拉到最下面这个 g p i o e x t i i like config 函数就是配置 a f i o。 的函数了,我们复制一下它,粘贴到我们的程序,右键转到定义,看下它的参数。第一个参数是 g p i o port sauce g p i o x x, 范围是从 a 到 g, 我们填写到这里,把 x 改成 a, 再回去看下第二个参数,第二个参数是 g p i o 片 south x x 范围是从零到十五,我们复制填写到这里,把 x 改成零, 这样 g p i o。 就连接到了 e x t i 外设了。接下来开始初始化 e x t i 外设,我们打开 e x t i 外设的库文件,右键打开头文件拉到最下面,看下它的可使用的库函数,这里就是它的库函数了。我们使用 e x t i in it 函数初始化 e x t i。 复制到我们的程序,右键转到定义看下参数这里参数需要一个结构体,我们复制定义一下,它名字叫做 x t in it structure。 把结构题地址传入函数中,快速的把结构题参数引出来,我们转到定义,看一下参数怎么填写。 第一个参数是指定要启用或禁用的 e x t i 线,具体定义在 x t i s 这里我们可以搜索一下 e x t i lies, 这些就是 e x t i 零到十九,我们选择 e x t i 零 复制填写到这里。第二个参数是使能还是失能?填写 enable。 第三个参数是 e x t i 模式,我们转到定义搜索看下参数。参数 注,在 e x t i mode type define 这里,我们搜索看下参数可以选择是中断模式还是事件模式,我们选择 e x t i mode interrupt 复制粘贴到这里。 同样的方法看下第四个参数,这个参数是选择触发模式,这里注视有错误,应该是在 xt trigger type define 这里就是这个。我们的 i o 口是上拉输入按键,按下是低电瓶,所以按键按下的一瞬间是下降沿,这里选择下降沿, 把它复制到这里就可以了,这样 e x t i 就初始化好了。现在 e x t i。 已经连接好了内核。最后就是初始化 n v i c 开启中断了。在 m i s c 库文件内找到 n v i c 的初始化函数,打开 m i s c 头文件,拉 到最下面。配置 n v i c 的步骤就是先使用 n v i c priority group config 函数配置一下优先级分组,再使用 n v i c innate 函数初始化 n v i c。 这里加快一下,不理解的小伙伴可以看我之前的视频。 这里第一个参数是初始化的中断通道,可以在 s t m 三十二 f 一零 x d h 文件内找到。 这里就是全部的中段通道了,我们选择 e x t i 零,其他的中段通道可以在这里后缀为 m d 的红,下面找到。 需要注意的是, exti 五到九是共用一个通道,十到十五也是共用一个,如果你是用这其中的某一个通道就要注意一下了。复制 试一下 exti, 领到我们的程序。第二个参数是使能还是失能?填写 enable, 后面两个参数是抢占优先级和响应优先级。本次实验只有一个中断可以随意填写,我这里都写二, 这样整个外部中断初始化就结束了。接下来我们写一下中断入口函数,中断入口函数在 startup 启动文件内有定义,我们使用的是 e x t i 零。选择这里的 e x t i 零 i r q handler 复制一下。写到我们的程序。 在中段函数中还需要我们手动清除一下中段挂起标志位,在这里使用 x t get it status 函数,先判断一下中段是否置位,右键转到定义,看下参数,这里需要选择哪一条外部中段线? 参数是 e x t i line x x, 范围是零到十九。复制一下 e x t i line x 到我们的程序 x 改为零,然后使用 e x t i clear it pending bit 函数清除一下中段挂起标志位, 这样中段入口函数就写好了,我们编译一下。最后在中段函数中写一下测试代码,每次产生中段就将 pc 十三扣转换一下状态,这样测试代码就写好了。把初始化配置函数声明到头文件 转到 man 函数,包含一下头文件,在 man 函数中调用一下初始化配置函数,现在就可以编译稍露镜板子了,我们一起看下现象吧。 今天的视频就到这里了,欢迎留言评论,我们下期见!
stm 三二外部中断结构分析 stm 三二外部中断结构相比定时器等其他外设中断还是比较简单的,我们一起看一下它的结构吧。 这是外部中断 exti 控制器结构框图右下角输入线,这里就是 gpio 经过这样的结构输入进来的,这样的结构就是数据选择通道。 我们知道 stm 三十二的 gpio 分为 a 到几个组,每组 gpio 又有零到十五,总共十六个银角。 这里也有 e、 x、 t、 i。 零到十五,共十六个选择通道,对应着 g、 p、 i、 o 片。零到十五个影角,每个选择通道有 a 到 g 个,输入端,对应着 g、 p、 i、 o, a 到 g 个组,也就是说 g、 p、 i、 o。 每组相同的片接在了同一个选择通道上,所以影角的外部 中断相同的偏移在同一时间只能有一个触发中断。在我们使用多个外部中断时,要避免使用不同组相同的偏引角,比如 p a 零和 p b 零要避免同时使用。 这里其他通道也是同样的结构,这里总共 exti 零到十五,共十六个选择通道,其实还有十六到十九,总共二十个选择通道。这几个外设虽然不属于外部中段,还是接到了外部中段这里 因为外部中断可以低功耗唤醒,所以这里的几个外设都是来借助这个功能实现低功耗唤醒中断功能。 配置选择通道就是由 afio 控制了,这些配置好的选择通道就从输入线这里接到了外部中端控制器上方。这里有很多寄存器,我们可以通过总线来读写这些寄存器, 这两个寄存器可以控制这里的边沿检测电路,通过设置寄存器就可以实现上升沿下降沿双边沿触发中断,触发之后会产生一个高电瓶信号接到后门这里, 同时上方软件中断触发也接到了后门这里,所以外部中断也支持我们程序去触发中断后门出来之后,一路接到了请求挂起寄存器,另一路接到了一个雨门 上方这里通过请求挂起计存器控制相关中段标志位置。一,可供我们程序读写去判断中断类型。请求挂起计存器还会输出一个信号接到一个语门, 同时上方的中断屏蔽寄存器也有一个信号,相当于一个开关,如果没有屏蔽这个中断就输出一个,一两者共同作用,就会输入 不到 nvic 中断控制器了,这样整个中断通道就打通了。我们再来看下下面这一路,这一路就是事件通道了,这里有一个事件屏蔽寄存器, 和中断屏蔽寄存器一样,也相当于一个开关,如果没有屏蔽这个事件就会共同作用输入到脉冲发声器,然后产生一个脉冲接到其他外设,这就是整个外部中断的结构了,我们来总结一下怎么配置外部中断吧。 一、我们要初始化引脚时钟和 a f i o 时钟。二、初始化相应引脚为附用输入模式, a f i o 选择相应通道。 三、设置选择相应通道的中断触发模式,启用所选通道,这样就接通 gpio 与内核的 nvic 了。今天的视频就到这里了,下期写一下程序,欢迎留言评论,我们下期见。
stm 三二的中段机制不管是哪款单片机,中段是必不可少的功能,引入中段机制会让单片机处理复杂功能时更加快准稳。 我们可以做个类比,比如你就是 stm 三二单片机,今儿给你安排的一整天主要任务就是写文案,但是今天在某个时候,你还有一个重要人物要来拜访你, 如果不引入中断,那么就相当于你不能使用耳朵。你在写文案的时候,为了不错过这个重要人物,你需要不停的放下工作去开门查看, 而且间隔时间还不能太长,太长时间人等不及就走了。这种方式就是我们上期按键检测的查询模式,这种查询方式会极大的影响你的主要工作功能,简单感觉不到 想,一旦功能复杂了或者多几个这样的按键,这种方法就完全适应不了。而有了中断,我们就相当于有了耳朵,中断功能还约定这位重要人物来的时候会敲门,这样一来我们就可以专心工作,有人敲门的时候再去接待客人, 这样是不是效率高多了,体会到了吗?所谓中段,就是当某个条件出发时,中段条件满足,停下手头工作,主程序或低优先及中段 去处理完这个触发条件的事情,及中段服务程序处理完后再继续手头工作。而实际上每天我们要处理的事情可能很多,要见的人也很多,这时候就需要一个完整的管理方案,能过滤一些不必要的台下事情的优先级,才能更好的处理 更多的事情。 stm 三二当然也一样,为了能迅速响应各类外设信息,且尽量少占用主程序时间资源。 stm 三二几乎每个模块都具备中段功能。 stm 三二的中段人很多,以 stm 三二四零七为例,总共有八十六个可屏蔽中段, 共分配了八十六个中段号,这个中段号列表就是中段项链表。由于中段资源太多,每个都评级,一拥而来也会乱,所以又引入了中段优先级,抢占优先和可屏蔽中段的概念,也就是重要和不重要的人同时来,先见重要的人。 正在见一个普通人的时候,有个大人物来了,你得暂时把这普通人晾一会去见大人物,然后再回来把这普通人的事处理完,再回到你的工作岗位上。还有一些跟你无关的 人打扰,你就可以直接让门卫挡在外面,不必理会。输入阿友所使用的一类中段叫做外部中段。外部中段的来源可以是一百四十多个阿友的任意一个中段事件,可以是上升岩、 下降延,或者两者同时启用。上期的按键挨我为 pd 十三,我们就可以把 pd 十三配置为外部一比十三,中段条件为上升延和下降延,然后再设置一个定时器六定时一毫秒中段,并在定时中段服务程序内技术,当按下按键后, 第一次进入中段,我们设置一个标志,然后消抖。功能部分只需要判断定时中段技术是否到时间就行,不再需要延时。延时效果吗?跟上期视频一样,当程序里面加入更复杂的功能时,我们才能真正体会到起作用。 好了,按键输入中段模式只是提供给大家一个方案,没有贴出完整的代码,大家可以自己动手试试。
大家好,这里是一起学单面机这节视频,我们来看一下 stm 三二,在这个 stm 三二 q 八 id 变异环境下,外部中断的使用啊,其实配置起来非常简单, 我们在这个图形配置化界面的时候,我们配置一个呃 led, 就是 pc 十三这个音角作为一个输出显示,因为最小系统版上本身这个 led 啊,就外界的 led, 那么很方便的观察我们实验现象, 然后我们配置一个 pb 九银角作为按键输入啊,这个按键输入呢,我们来看一下,我们把它设置为外部中断九, gpio 就是外部中断九设置。那么在系统这边配置里头还是老规则啊,我们上来首先要系统实 中就 rcc 配置啊,那么包括我们的外部的 rtc 适中,我们用外部的三二七六八精振,包括系统的适中,我们用外部的 hse 八兆的精振。 然后配置完以后,在这个时钟数这边,你直接这边数七十二就可以了,系统会帮你自动识别一个最合理的方案,达到最高的时钟,那么它自动配置好就行了。 那么在 project manager 这里头,项目管理器这里头呢,一定要注意,在这个扣的 generator 这里,我们点击 把这个点 c 和点 h 文件呢是单独生成啊,不要都堆到命函数的底下,这样的话比较比较乱好,那么剩下的配置还有就是我们要烧录,如果你是使用这种四线值的串型烧 哇,就不是用创口啊那种线,再强调一遍,是用接接令可或者这个踢令可的四线指烧路,你这里头要点点击 serry y 啊,把这个点击,那么它会占用单片机的 pc 十四啊, pa 十四和 pa 十三这两个音角, 再加上电源的两个角四限制烧录就可以了。那么为了输出,我们看调试的效果, 我们要把这个创口一选中,我们把创口一这里设置为一部通信模式啊,我们点中他,那么 pa 九和 pa 十 一个作为 tx, 一个作为 rx, 其他的全部默认,包括波特率啊,停止位,还有教练位,还有我们的数据通讯是八位,不用开他的中断啊,其他全部默认就可以了。好,那我们来 来看一下,在主函数我们点击保存,那么或者点击你这个齿轮按键,他会自动的帮我们生成一个初始化的函数啊,这里在生成。 哦,对了对了,这个忘讲了,这个关键的我们是要实现外部中断是吧?那么在 gpio 银教里的注意,刚才我们 pb 九 我们设置了外部中断,是吧?然后在 pb 九这个端口里我们选择,那么我们把这个 pb 九内部的上拉给他打开,这样的话,当我们的 pb 九我做了接这个按键按下的时候,他接的 dd 电瓶, 那么我们就把这个 gpl 的模式呢?这里头看有六种模式,三种是中段一,三种是事件,我们一般用中段,对吧?那我们就显示选择下降沿中段 foreign a 值,对吧?当我们按一下下降压中断,第一个是上升炎,第二下降炎,第三个是上升炎和下降炎都能出发,我们选择下降炎,后面三个是世界啊,对吧?我们不用管它,我们用中断上拉,然后我们把这 k 雷宝加上 k u 字勒宝,这个说过了,非常方便,因为他在主循环的命点 h 文件中会帮我们做一个统一的这个叫地方红红定义,这样的话方便你以后移植啊,你就不用单独去改每一个银角了, 你只要把这同样的银角,你这个银角如果是换到了 pb 五,比如说,那么你的红电翼还同样用 k k, 那么在主函数,主函数中你不用做任何更改啊,他会自动的帮你配置好了,都好,那么这个配置就完了,对吧?然后 后在我们的中段函数,我们可以看一下 nvse, 这里头你也要把这个外部中段这个史能勾上啊, 这个外部中段的聘的第九角到第五角,他是用的同一个中段元啊,可能是当初的资源比较有限吧,他是用的同一个把这个勾勾上啊,同时你可以在这个 啊系统的 nvic 里去确认一下,就是在这里可以看出来,那么第九角和第五角是用的同一个中段元,包括他的抢占优先级和子优先级啊,我们都把它默认为初始为零就可以了,不用管他。 好,那么再重新生成一下我们的 code, 那我们在中断后就做了一些什么事情呢?就是你按键按一下中段时候,我们就在中段函数里打印一下一个状态啊,或者让 led 丁进行一个翻转,非常简单啊。好,那我们看一下 中断,那么中断的函数啊,所有的函数都在哪里呢?我们打开这个项目管理器啊,点 sous, 你点着这个,这个后缀名是 it 点 c 的,那么系统所有的中段都在这个 文件里啊,所有的中段,那我们就可以找到我们刚才生成的外部中段啊,看在这里啊,第二百零四行,我们的外部中段九到五,这个银角,他是个中段处理函数,那么他会掉用到什么呢?掉,掉用这个 黑窑库的外部中断,我们再双击他,然后点打开定义,那么他会跳到这边,他是在 gpio 点 c 这个文件底下有这个 中段处理函数,那么他会判断是否产生中段长段,中段的话会冲啊,清除中段标志位,然后就会来调用这个中段回调函数啊,我们再看这个中段回段回调函数呢,就在下面啊,可以看出来前面是个 wake, 是个弱定义啊。 落地,落地,你是什么意思?就是相当于一个系统的自动生成的一个备用函数啊,如果你没有自己写这个中断回调函数,那么他会调用这 wick, 如果你写了中调中段回调回调函数,就是你保持名字是一样的,那么他会优先使用你写的函数啊,也就是 说这个相当一个备胎哇,那么我们来看一下,我们点击, 那么他会找到有两个,对吧?因为有一个是我们自己写的,我们掉命函数里头, 那这就是我们自己写的在 u 字扣的比定啊,你随便找一个地方,一般我们放到中段,放到最后嘛,函数末尾的地方, 那么这边有个优则扣的比根斯和安德斯之间说过啊,一定要放到这里头,你才重新配置的时候,这函数才不会丢失,对吧?自己写的, 我们在这个中断回调函数里做什么呢?我们对这个银角进行判断,是不是我们的 k 银角,就是我们刚才的 pp 九银角产生中断,是的话,我们我这边做了个比较简单的应用啊,那么这个程序其实是不合理的啊,就是我们延时二十毫秒再判断,然后我们用未带的操作,对不对?前上一节 视频讲过了,判断这个银角是不是产生低电瓶,如果确实低电瓶了,我们让 pc 十三,这个银角就是 led 这个银角翻转一次啊, 然后我们同时用窗口打印,如果眼角为高,我们认为这个因为是低电瓶点亮吗?我们打印啊,因这个 led 电灯是 off 的状态,如果眼角为低,我们打印一个 led 这个昂的状态,同时你可以通过板子上观察到。好,那么就这么简单,我们把这程序下载进去, 然后我们来用创口来看一下实验的现象啊, 嗯,这个我建议还是说到原来这个话题了,创口中断呢啊,这个中断外部中断不建议作为按键检测,因为为什么我们用定时 器啊,可以很方便的做按键检测,而且它执行效率比较高,嗯,也更可靠。你用外部中断呢,是应该 你给留给系统,比如做这种中断唤醒啊,让系统修灭以后作为唤醒或者紧急事件,让他做一个呃,做一个响应,因为按键呢,不太适合,因为你按键判断必不可少,你要做祛痘的功功能啊,那么在这里头肯定要你要加延时判断,或者是 呃,或者是又多次采样,这样是不太合适的,我们用定时器,后面我会给大大家讲啊,我们来看一下主循环我们做了哪些事情啊, 一上来我们回到主循环开头吧,加载头文件,这些不说了,这 private 也给大家讲过,这头就是微带操作,包括一个岩石函数啊,我们写在这里头,那么上来就是初始画,系统十中的配 是 gpl 初始化,然后创口初始化,创始初始化了,头后面会加创口的话,我们就加载了一个什么呢?加载了这段大家可以从网上自己去找,有很多的方式来实现那个普润台 f 函数,我是靠的是这种啊, 有不同的方法都可以实现着普润台 f 函数,这个比较用的比较多,加载一个标准的输入输出库,然后加这段代码,你直接复制进去就行了,这样的话普润台 f 函数就可以用了,非常方便啊。 然后我额外就是做了一些判断,就是上电的时候,我们来判断是产生了这个上电复位,还是我这个外部银角产生的复位,就是我那个单片机的呃,复位银角按下了产生的复位, 然后继续呢,就是我们来产生,就是打印,我们的串口已经准备好了,然后系统正在运行,打印这两句代码,你可以看出来, 我们刚才呢,我重新按一下啊,我单边接一下复位,大家看一下啊,它会产生,因为我是按了复位引角,外部引角复位,对吧?然后串口准备好了,系统正在运行,对吧?那就是我们运行的状态, 这时候我们主循环里是没有任何程序的,可以看出主循环没有任何的语句,对吧?我们按一下外部中断,眼角就是我们按一下那个 k, 我们外接的这个按键 啊,可以看出来他就会打印,这时候你会观察你的 led 灯是关闭的,我们再按一下 ad 灯点亮,关闭点亮就如此啊,但是大家可以放下来,他不是很灵敏,是不是 就是百分之九十还是识别成功了?有,那么偶尔一两次还是识别有问题的啊,这并不是说他没有响应到,是因为他响应的太快了啊,这外部中断只要有电瓶的变化,包括这个抖动啊,他都会被识别出 出来啊,所以这个做识别的话你要加岩石,加了岩石的话判断可能是受会受到一些影响的,这个所以不太适合于做按键,可以看出来总体来说效果还是不错, 那他都可以实现出来这个 l 眼角的变化,但是我更倾向于这个外部中段眼角用来做紧急事件的响应,或者是把系统从比如说待机模式或者是停机模式把它唤醒啊, 做外部中断啊,外部中断好像,大家看一下,好像你做待机模式啊也不能唤醒啊,我们可以看一下待机模式只有 特立的唤醒眼角,就是我们的 pa 零眼角可以唤醒或者适中眼角,看门狗眼角,外部复位型号就这么几个眼角给唤醒了,那么停机模式唤醒的资源就 比较多了,那么这些省电模式的话是依次等级加高的,那么你关掉的功能越多,那么相对说你幻想的方式就会越少,这个很好理解,对吧?所以最功耗最低就是待机模式, 我们一般用呢,可能是用到停机模式比较多啊,睡眠模式的话用的比较少。睡眠模式因为你看只关了啊么内核其他的功能没有关啊,其实你感觉不到系统已经进入睡眠了,因为你系统中经常会运行一些中断判断,他是不停的在被唤醒的, 所以这个用的比较少,因为他的外设没有被关闭,包括他始终也没有被关闭啊。好,这个下节再讲,那么这节就给大家做了一下外部中断银,呃,银角作为外部中断啊,非常方便是不是?我们几乎没有做任何的操作,只是配置了一下代码都自动生成,我们直接 完成自己的回调函数就可以了,非常简单。像我们以前用这个标准库的话是怎么用呢?我们是要设置外部中断,要开呃,复位银角的时钟是吧?把复位银角时钟打开,然后要把外部银角和外部中段线做一个连接,是不是要写一些代码, 把它绑定在外部中段线上,然后再完成回调函数,再回调函数,呃,中段函数,中段函数中,我们要清中段标志位,是不是啊?然后再做判断,现在的话,你连中清中段标志位的话什么都不用啊,因为我们这个 q 白 d 这个环境下所有的 产生的中断,他会帮你自动的把中断标志为清除了啊,那么他会产生中断函数,在中段函数处理中,他会先判断中断,然后再清除中段标志位,这些全部都是系统帮你完成了,你只要 关心的就是中断函数的完成啊,而且中断函数大家可以可以看出来,系统都有一个备份啊,相当于一个备胎,那么你不写的话,备胎会帮你完成,但是备胎你就没有任何的语句啊,你就看不出中断效果,所以说我们要做的就是完成我们自己的中断回调函数啊。 好,那么这节视频实验现象非常简单,就是做一个银角的外部中断,我们做了个按键,对吧? 好,后面我们来给大家继续来演示,我们把这个中段的这个按键呢作为一个系统的这个停机或者是待机模式的唤醒音角。我们来看一下实验效果。这节视频到这里,欢迎大家对我的视频评论转发点赞,谢谢大家。
好,各位单边机小伙伴,你们好,我们接着上讲视频,继续啊,那么我们上讲呢,主要讲了这个中断线啊, 中断线以及中断初始化的一个配置,对吧?那么配置完毕以后啊,我们接下来需要进行一个什么配置呢?就是一个中断优先级的一个配置哈, 那么我们现在看第六十行啊,那么啊,关于这个 pa 零啊, vcap 按键,他的一个优先级的一个配置啊,我们学习一下啊,我们看第六十一行,对吧?那么首先呢,这是一个结构体变量,对吧?我们在这个 这个程序的开始啊,就是第二十六行,看到没,他定义了一个,呃,叫什么?结构体变量,对吧?中断优先级管理的一个结构 底变量, a v i c, 对吧? you need the structure, 那么通过这个结构底变量呢?对吧?好,通过结构底变量,我们对他的这个优先级啊进行一个设置啊,首先看一下第一个参数,就是你是哪一个对应的是哪一个外部中断啊? 那么 p a 零呢?是,呃,对应的是外部中端线零,对吧?外部中端线零的那么这么一个变量啊,我们该去哪里去找呢?哈,我们在这个地方啊,我们如果是在这个地方找的话,比如我们双击它,对吧? f 十二, 我们找这个外部中断线零的时候啊,我们是找不到的哈,你看第一个呢,是这一个 state 哈,还有它, 还有他,我们通过这个双击他,对吧?比如说双击他其实是找不到的啊,这是我们找不到这个外部中断线零对应的这么一个, 怎么呢?标识啊,标识对不对?那么他这个标识是在是在哪个文件去找呢?哈,是这样的,我们我们这个在这找啊, 我们双击这个变量以后呢,我们这个按这个 ctrl c 啊, ctrl c 复制一下啊,然后呢我们按这个 ctrl f, 我们查找一下哈,在这个 find 啊 infos 在文件中进行一个查找啊,好,我们这个嗯,他自己默认就粘过来了。 那我们点 final 啊,这里呢,我们看一下啊,是在这个 s t m 三二 f 幺零 x 点 h 文件的第一百八十六行哈,是有是有它的啊,我们双击一下, 看到没?一百八十六行,对吧?看到没?这啊,这个就是外部中断线零啊,对应的这么一个标识啊,是在这个文件里面啊。啊, 那么这里呢,我们看一下它的中端线,你看这叫 exti 零啊, interrupt 啊,叫外部中短线零啊,对应的一个中段是这么去,是这么去写的啊, 那么后面呢,还有一个外部中段线五,对吧?还有一个外部中段线十五,那该如何去写呢?对吧?你看这个地方是叫外部中段线五 啊,外部中断线十五,我为什么要这样去写呢?对不对?为啥要这样去写?我们一起来看一下啊,我们返回, 那么外部这个是呢?外部中断线零的,对吧?我们再往下啊,就没有了,对吧?没有了主要原因是什么啊?是因为这个,你看这是中断号啊,十七,对吧?中断号,然后十八啊十九,他是连起的啊, 这里呢是 ld, 对吧?这是小容量,对吧?我们的 stm 三二,呃,单片机呢?它是一个大容量产品啊,大容量产品,嗯,我们要找 hd 啊我们找我们要找 hd 啊, 这里怎么找啊?我们再和大家这个一起复习一下啊,怎么找呢?我们这个看 看下程序哈,我们先找到这个 m d 呢是中容量啊, h d 呢是大容量啊,我们双击它啊,复制啊,开发文档点开以后呢,我们点查找啊,关掉,我们点它啊,我们点查找, 这里有啊,你看这个,这个 mini 开发版呢,它采用的是这个幺零三 r c t 六呢,它属于大容量产品,所以在启动文件的时候呢,要选择它 h d, 要选 h d 啊,它这个结尾它哈 h d 就代表大容量,对吧?那么大容量呢,它对应的这个 flash 呢,是大于等于二百五十六 k 啊,大于等于二百五十六 k, 嗯嗯, 大于等于二百五十六 k 的话呢,那么它的这个 flash 哈,那我们这个 s t m 三二,我们这个 mini 开发版的 flash 有多大呢?我们也可以搜索一下,我们通过搜索找一下 plus 啊, plus 查找 s t s 二这个 flash 的一个简介,对吧?第四百九十一页啊,我们选择之后,您看 s t m 三二 f 幺零三 r c t 六,对吧?这是迷你开发版,选择的是 s t m 三二 f 幺零三 r c t 六,它的 flash 容量呢是二百五十六 k, 对吧?二百五十六 k 的话,那不就是 大容量了吗?对不对?二百五十六 k, 刚才也说了,对吧?刚才也说了,那么如果是这个, 那么我们复制一下,对吧?复制一下还是要通过查找啊,查找查找以后呢啊,这里就是定点,如果是大于等于二百五十六 k, 那就是大容量,对吧?大容量的话呢,就是 h d, 是吧? h d 结尾的,那所以在这个程序里呢,我们就选这个 h d 结尾的啊, 那么这里呢啊,他往下找,那么这是十八对不对?我他的中段中段号是十八对吧? 其实那么和这个是接起的啊,啊,中大号十七对吧?那么从零到十七呢,不管你是小容量,中容量还是大容量啊,都是 在这里面去找,对不对?如果中的号大于了十七以后呢,要根据你的产品进行一个寻找了啊,如果我们是大容量的,我们去找 hd 对吧? hd d h d 对吧?这是中段号十八十九啊,是连起的吧,和上面的十七都是连起的,那么我们找这个外部中端线零啊,我们从柱结里看啊,你看到没, 某外部中段线零十到十五的话呢,都要写它,对不对? 那么三百零三行啊,外部中端线五和到九啊,我们都要写他啊,他们是共用的啊,都要写他, 所以说啊,这么几个来源哈,他对不对?还有他,还有他这三个的来源哈,如何去写对不对?如何去进行一个查找,我们应该都知道了吧,他是在这个文件中啊,叫 st m 三二 f 幺零 x 点 h 啊,文件中进行一个啊查找的哈,啊, 好,我们这个第六十一行讲解完毕了哈,那么第六十二行对吧?那么这是这个配置,抢占优先级为二对吧?强占优先级为二,那么这里呢,我们之前也是讲过的啊,对吧?我们看这个闷函数, 那么第十五行对吧?中段优先级分组啊,设置为组二对吧?组二的话就意味着有两位, 有两位二斤之数呢,来控制抢占优先级啊,两位二斤之数呢,来响应优先级,那么两位二斤之数啊,强占优先级,有两位二斤之数来表示的话,那么他就可 可能是四种情况,对吧?零零零幺幺零和幺幺啊,那么对应的时禁制就是零一二三,对吧? 同样的哈,那么也就是说抢占优先级呢,他就是就是从零到三啊,你可以随便选,对吧?那么响应优先级呢,同样呢,也是从零到三随便选,对吧?那么在这个 这里呢,他选的是抢占优先几啊,他设置的是二啊,这个就无所谓了啊,你想设置成几就设置成几,只要是介于啊零到三啊, 啊零到三啊,你随便选一个都可以哈,这个口号呢,要用显着。英文模式下的括号啊,英文模式下的括号啊,零到三啊,随便 选都可以,对吧?保存一下,那么子优先级呢哈,他也是由两位二十斤之处来控制的,可选范围呢,也是啊, 零到三,对吧?零,这个零到三是我说的是十进制的零到三啊,那么如果是二进制的话,那就是零零啊,零幺幺零幺幺,对吧?那么他这里呢,这是十六进制啊,零 x 零二,对吧?那我们可以看一下十六进制, 我们把它调成这个什么程序员模式啊,程序员模式以后呢,这里呢,我们清零哈,十六禁制啊, h e x 十六禁制,对吧?他是零 x 零二,对吧?那就是零二,好看没?十六禁制啊, 他就是二啊,十进制啊,也是二八进制,也是二二进制呢,就是零零幺零啊, 好理解吧,对吧?好,关掉它啊,那么子优先级呢,设置成这个二,对吧?这个是随便的啊,不固定啊,只要是零到三啊,你随便选就可以,你不要选个五和六啊,那是,那就会给你报错的啊, 那么这个第六十四行呢,就是 in naple 了,叫死能外部中断通道啊,这个没什么好讲的, 那么第六十五行呢?哈,这个套路都是一样的哈,那么通过结构体变量啊,把这些这些成员变量设置完毕以后,那么就是 啊啊,通过这么一个函数,对吧,然后取地址运算符对吧,取地址运算符啊,然后再加上这么一个节油体变量,好,那么整个这个中短优先机啊,那么 pa 零啊, vcap 按键的这个优先机就 通通啊,设置完毕了啊,就这么简单,好,对吧,那么你像 这个啊, pc 五的一个设置,对吧,那我们就我们就不再追述了啊,这一模一模一样的啊,那么 p a 幺五啊,对 k e y e 他的一个优先级设置,那也是一模一样的啊,我们也不在啊,也不在这个详细展开讲了,那么通过这么一个设置呢,我们来复习一下啊,那么首先你看啊, v cup 按键的这个强占优先机是二,对吧,那么这个呢, k e y 零呢,强占优先机呢,也是二, 嗯,这个 k e y 一啊的按键的抢占优先机呢,也是二,对吧,那么这三个按键谁的优先 最高呢?哈,那我们只有通过子优先级来进行一个判断了啊,那么 vcap 子优先级是二,对吧? k e y 零呢,子优先级是一, k e y 一呢,指优先机是零啊,我们之前学过的这个数字越小,你的优先机越高啊,所以呢, k e y 一啊的优先机啊,是最高的啊,也就是说当三个按键啊同时按下的时候,那么单片机呢?啊,只会执行我们 k e y 一啊 的一个功能哈,也就是说单片机呢,只会执行这个函数哈, p a 十五对应的这个函数哈,那么这两个函数是不执行的,为什么呢?因为 k e y e 的 什么优先级是最高的啊,是这么一回事啊,好,那么我们本讲视频内容先分享到这啊,感谢各位的一个观看。