粉丝1.7万获赞8.8万

做 i m 三二开发的时候,到底是用耗油库还是标准库?我今天以 adc 的 外设开发为例,给大家分析清楚耗油库和标准库到底有什么区别。板子上插的是一个光敏传感器,随着光照强度的变化,它会输出一个连续的电压值,光的强度越大,电压值越小。 对 adc 开发来说,它基本流程就是这五步,时钟配置外设出水化、启动 ad 转换、等待转换完成、读取转换结果。我不管你是后库还是标准库,流程不变, 大家先懂原理,我提前用后库把代码给大家写完了,实验现象也非常到位,随着光的强度的变化,这个小灯会亮和灭。把关键代码给大家分析一下。配置时钟出水化、 adc 启动转换、等待转换完成,读取转换的结果, 你会发现都有一个函数可以调用,这是我们使用还有库的时候一个方便之处,而且这里面很多代码是我们通过图形化配置之后自动生成的,比如说以 mx 开头的 这两句,这是 qmax 的 配置界面。所以使用还有库开发的时候,你会觉得开发效率非常的高,但是如果你不懂原理,你可能都不知道你在做什么。那同样一个功能,我用标准库也给大家实现了。 把核心代码截出来,我们去对一下,有 adc 的 触式化,有启动 ad 转换、等待转换完成,读取转换结果, 基本思路跟 hellokit 是 一模一样的,但是这里面有很多的代码的细节是需要你自己实现的,像这个红框的地方,没有图形界面,是我们自己封装的函数,这些触式化函数都是我们自己一点一点的写代码做出来的, 所以标准库它的开发的这个复杂度和 help 库相比一定是要大一点的。我们用户自己写的代码,如果展开的话,大家看代码量还是比较多的,核心调的是 g p l e n t 和 ad c e n t, 所以 你会看到 help 库当中那些函数和标准库相比,它封装的层次更高, 然后标准库更接近于底层开发。你要懂原理,否则标准库代码你写不出来。懂什么原理呢?我举一个例子,这个传感器的电压输出的引角 a o, 它是连到单片机上的,连到了 adc 这个模块的某一个通道, 到底对应了单片机上的哪个眼角呢?用到了一个非常基础的知识,单片机的 i o 眼角,那我们 cpu 可以 直接的通过零一这样的数据的发送控制一个 i o 眼角,也可以通过一个外设模块 间接的控制这个眼角。在这个例子当中很明显,这个眼角要配置成 a、 d、 c 的 功能,用它的附用的模式,我们得自己查数据手册,找到对应的眼角。大家看这我们用的是 a、 d、 c 一 通道零, 它对应的是 pa 零,而你还有酷的时候,点一个图像界面,那自动就出来了,你不用去翻手册的,知道这个原理了,这根线你就才能连对,所以这个蓝色的线我连到的是 pa 零上的。将来我写代码的时候,如何做这个 l 引角的抽象化呢? gpl 有 八种工作模式,那这个 p 引角是什么模式?这个数据是从传感器流入单片机内部的,所以它是输入模式,而且光敏传感器我们读到的是模拟信号,因此这里选择的是模拟输入。 现在让你再去写这样的代码,是不是就很简单了?那我总结一下,如果大家在选择还有库的时候效率高,但是因为还有库,含入封装的层次比较高,很多原理是看不清楚的,那换一款开发版你可能就不会了。但是如果用标准库开发,因为它更接近底层计算器的模式,所以使用标准库写出来的同学, 它的单片机的基本功是更扎实的,换一款开发版它能快速的上手。那不管你是用还有库还是标准库,都应该把这个原理梳理清楚,从库环数一步一步怎么调的计算器,这样才能够不变硬,万变。寒假快到了,给大家准备了单片机自学学习包。第一,完整的单片机自学路线。 第二,必备基础课, c 语言 i m 三二,还有一个经典核心课程 bug iphone c s p i r s 二三二 s 八五这样一个总线协议的内容。 第三,单面机的经典书籍常见问题,四大硬核项目实战,不管你是做必设还是找实习找工作,都是用得上的。高新模板,两百九十道经典面试题都在这里,有需要的小伙伴可以自取。

用 q 五新建一个 stm 三二工程,目前 stm 三二开发方式主要有三种,一、直接操作寄存器方式二,使用标准库方式 三、使用 hoco 方式。直接操作寄存器方式是我们直接配置寄存器程序,执行效率最高,但是由于 stm 三二结构复杂,这种开发方式不推荐 使用。标准库就是使用 st 官方封装的一些操作寄存器的库函数,让我们提高开发效率。 本期内容就是使用标准库创建工程。最后一种 hel 库方式就是可以使用图形化界面配置,可以快速入门,但是他隐藏了底层逻辑,不利于我们深入学习,可以学习标准库之后再去学习这种开发方式。 我们现在开始创建工程,这个是今天要用到的标准库,如果有需要可以留言我之后可以发出来。这个是已经解压出来的文件,我们打开看一下, 这个内部文件夹就是今天所需要的文件。由于工程文件比较多,所以我们开始创建工程前需要先创建一个文件夹,我们命名为 stm 三十二 project, 现在打开 q 五开始创建工程, 点击 project, 点击第一个,这里我们选择刚才创建的文件夹, 给我们的工程起一个名字,然后点击保存,这时候就会跳出选择芯片型号的页面,我今天 使用的是 stm 三二 f 幺零三 c 八 t 六,大家可以按自己的芯片选择相应的型号,选择之后点击确定这个页面,我们可以直接关闭。现在我们这个工程还无法使用,还缺少启动文件,我们现在去内部库中复制一下, 打开我们的工程文件夹和 lab 文件夹,启动文件都在 com sis 文件夹中,这里文件目录比较深,跟着我的操作找到启动文件, 这个 startup 就是全部启动文件所在,这里有很多编译器版本,我们选择 on, 将里面的文件全部复制下来。 在我们的工程目录中创建一个 start 文件夹,我们打开它,将刚才的文件 复制进来,回到刚才的 startup 所在位置,我们还需要复制这几个文件,也复制到 startup 文件夹中,我们还需要内核文件在列补文件夹, comes this 文件夹, cm 三文件夹, call support 文件夹中,将这两个文件也复制到 startup 文件夹里。 接下来回到工程,将刚才复制文件都加载到工程中,点击这个文件夹,我们改个名字,改成 start, 点击上方三个小方格,我们在这里添加文件,点击 add files, 选择 start 文件夹,点击文件类型,选择全部文件类型, 选择前面两个文件,点击 at 添加文件,这些 startup 文件选择后缀为 m d 点 s 的文件,点击添加 下方这些文件全部添加,最后点击关闭就可以了,然后退出就完成了。添加这里就可以看到添加的文件了, 然后我们需要把 start 文件加的路径也添加进来,点击上方的魔术棒,选择 c c 加加选项卡,点击这里。再点这里,我们选择 start, 点击确定, 然后点击 ok, 这样文件目录就添加好了。我们再添加一个妹函数,先在工程文件夹中新建一个 user 文件夹, 回到工程,我们添加一个 user 组,点击这里添加组,名字改成 user, 然后我们右键添加一个 man 函数文件,选择 c 文件 键,名字是 main 路径,选择我们刚才创建的 user 文件夹,点击确定。我们右键添加一个头文件,点击这里添加,然后我们快速写一下 main 函数, 我们点击这里编译一下,可以看到有很多错误,这是因为我们的编译器是版本六,切换到五就可以了,点击这里选择版本五,我们再次编译一下, 可以看到已经没有错误了,这时候已经可以使用寄存器方式开发程序了,我们是需要用标准库开发,我们还需要再复制一些文件进来。打开 lab 库文件键 家和我们的工程文件夹,我们先在工程文件夹中新建一个列布文件夹,然后在列布库文件夹中选择第二个文件夹, 点击打开。我们要把 src 和 ink 两个文件夹中的文件全部复制到我们刚才创建的文件夹中,然后回到我们的工程,把它们添加进工程,点击上方三个小方格,在这里新建一个名为 leave 的组, 按照刚才添加 start 文件的方法在这里添加我们刚才复制的文件,现在已经添加好 lab 文件了,这是已经添加好的文件,我们可以在这里把 lab 组向上挪一下位置, 现在我们再复制一下库参考历程里面的配置文件和中断入口文件,打开库文件夹和工程文件夹,找到 历程,这里就是历程了,我们打开选择第二个文件夹,在这里复制下面这三个文件到我们的 user 文件夹就可以了。然后打开我们的工程,把它们添加到我们的 user 组里面,按照刚才的方法添加进来, 现在整个工程文件已经复制好了,我们添加一下内部文件路径, 我们最后配置一下红定义,右键打开头文件,将文件拉到最下面,找到这个红定义, 将这个红定义复制下来。接着我们点击魔术棒,选择 c c 加加选项卡,将刚才复制的红粘贴到这里,这样就可以了,点击 ok, 关闭,回到我们的魅函数,现在工程已经基本完成了,我们编译一下 可以看到很多错误,看这些错误的意思是找不到文件,说明我们还有文件路径没有添加,我们按照刚才的方法添加一下路径,这里是没有添加 uso 文件加路径,我们添加一下, 我们再次编译一下,可以看到已经没有错误了。工程到这里已经创建好了,喜欢的小伙伴记得点赞关注哦,我们下期见。

聊个争议问题, stm 三二学集成器、标准库还是 hell 库?十几年前只有集成器和标准库,当时选哪个争议就很大,现在多一个争议更大了。官方主推 hell 库,对标准库已经不维护了。拿汽车来举例,它们相当于手动挡, 自动挡自驾有明显的歧视链,看不起他,他看不起他,他们两个一起看不起他。关键是面试官是这个人群,你学这个找不到工作的,如果一定要学一个, 学集成器好找工作。实际项目开发有标准库,用标准库资料大部分是标准库,所以两个可以一起学。为什么官方要主推这个?每个芯片系列都有一个标准库, 学另一个芯片系列要重学库,为了降低学习成本,多卖芯片,一个库支持所有芯片系列,这是趋势,你可以了解比较新的芯片,建议学这个。 其他芯片厂商其实也在做这种事,早期各个芯片系列都有自己的库,现在 ncs 一 套库支持所有芯片系列,新功能都在新的 sdk, 所以 必须学这个, 到公司里很少会给你用 stm 三二的机会。其他国产芯片是没有还要库的,但是有继承期,开发和标准库。总结下,必学,建议学选学。


stm 三二选标准酷还是 aj 要酷,百分之九十切入!世人都纠结过,新手怕学错,老手嫌麻烦,今天一分钟讲透,看完再也不踩坑。其实选标准酷还是 aj 受酷,核心就是看项目需求、团队情况,再结合市场招聘导向和长期维护便利性来定。 先说说标准库,他就是项目守门人,底层硬通货。在招聘市场中,他绝非新项目刚需,更多是资深工程师维护代码的加分项,而非入门敲门砖。标准库更适合小型裸机项目、 资源紧张的单片机这类场景,追求极致精简代码和运行效率。他没有封装溶于层,代码量小、执行速度快,能把硬件性能炸到极致, 且诞生早就生态资源丰富,老工程师用起来顺手。但它的短板也很明显,兼容性差。不同系列的 s t 硬三二芯片,标准库不通用,已知项目时得大量改代码。更关键的是, s d 官方已经停止维护了,遇到新问题或漏洞没法找官方要支持。 再看 h a 售库,它是职场敲门砖,新项目标配。当下百分之七十以上嵌入式岗位招聘都将其列为核心要求,尤其是消费电子、互联网等主流领域,几乎是必考题。 作为官方力推的主流最新芯片,仅支持 h l 库。招聘中熟悉 stm 三二 q mx 加 h l 库已成潜入式工程师的基础门槛。它适配中大型项目和跨系列移植封装通用接口,不需要印记寄存器地址 搭配工具,能自动生成代码,提升开发效率。持续更新的生态也契合现代项目需求。对新人而言,掌握 h l 库是快速入职的捷径。 对团队而言,其规范性可降低写作门槛,招聘时也更易筛选到适配现代开发节奏的人才是职场竞争力的核心标配。 无论选哪个,底层原理都需吃透。但从招聘市场来看,掌握 h a 受酷士嵌入式工程师的生存必备标准,酷则是锦上添花的加分项工具,服务于职场与项目适配趋势才能少走弯路。


这个视频跟大家聊一聊标准库和黑欧库其实类似的话题呢,多年以前也讲过,当时讲的是开发单片机,到底是使用计程机操作还是使用库函数操作。其实在讲那个话题的时候, 已经有了显而易见的结论,采用的是库函数。今天这个话题也一样,使用 hell 库是发展的趋势, 也是官方主推的。那么是不是说标准库就完全的被淘汰了呢?也不记得。我给大家举个例子,假设你入职了一家做单片机的公司,他们的项目呢,很有可能就是用标准酷写的, 甚至有可能是使用自己存器直接操作的。这时你总不能跟老板去说,现在大家都在使用 户了,我们应该要使用 haople 来开发。我想作为老板的话,非常有可能第二天就把你开除了。我作为老板花钱请你来,是让你来做项目的,并不是让你来指指点点。 假设人家这个项目之前是用库函数写的,现在需要增加一点模块,那么你也要用库函数去实现它。再给大家举个例子,之前呢,我也使用黑欧库做了一个项目,项目中呢,使用了最常用的创口通信。 其实关于 help 的创口通讯,网上资料很多,但是不知道大家有没有发现,其实这些励志呢,都是演示性的,数据丢失都非常的严重。所以呢,我就决定照原来的标准库 进行改写。改写的过程中呢,还是用到了基层去操作和扩海术的操作。当然呢,可以看一下 我的这个视频。那么话说回来,现在为什么网上那么多人都推荐使用 hero 库, 使用 hao 裤更方便更简单。这个观点呢,我是这么理解的,假设你之前一直使用的是枯函数,现在如果使用 hao 裤了,这句话理解是没有问题的。但是如果你是作为初学者的话,直接入门 hao 裤,我觉得是有很大问题。 时候有的小伙伴可能会说,问题不大呀,网上历程我也都能做下来,就是因为你只是照着做而已。如果在以后真正的开发过程中需要做一些改变,你都不知道从哪入手。不 过情况的话,还是婴儿一。有的小伙伴呢,条件比较好,周围一直有学长老师带着,不懂就可以问。但是对大多数 的小伙伴来说,或者说你要把它当做一份职业的,我觉得哭函数呢,也是要了解一下。其实呢,我个人觉得 hero 哭呢,也并不是像大家说的那么简单,里面比如涉及到了函数,指针等等, 对 c 元的基础知识呢,要求也非常的高。如果是作为学习的话,还是要循序渐进。总而言之, hao 裤呢,是未来的一个趋势,也是我今后录视频的一个大方向。其实关于 hao 裤的话,我很早之前就使用过, 大家可以看一下这个视频,差不多在二零年左右时,那时候呢,已经在使用黑恶苦了。我记得当时的体验呢,并不是很好,只写了几篇博客。视频呢,没有录。几年时间过去了, qbamx 软件呢,也做得越来越好,三二的开发方 方式呢,也越来越明确。所以接下去呢,会录制黑欧库操作的一些视频。那么关于标准库和黑欧库,大家有什么想法可以在评论区留言,这个视频先到这边,谢谢大家,再见!

stm 三二标准外设库可以操作哪些外设?包括暂不限于以下几种, gpio 通用输入输出 user 通用同步一步收发器 spi 串形外设接口 irc 双线串形接口 adc 魔术转换器 dac 数模转换器 team 定时器 rtc 是实时中 usb 通用串形总线 ten 控制器局域网。以上是 stm 三二标准外设库能够操作的一些常见外设,还有其他一些外设,比如看门狗 dma 中断控制器等。 不同型号的 stm 三二芯片支持的外设略有不同,具体可查阅对应型号的数据手册。

大家好,今天这个视频呢,我主要和初学者探讨一下,我们在学习三十二位单片机的时候,应该选用哪一种库文件。 我为什么说是三十二位呢?对于八位和十六位的单位基友言呢,他只有这种传统的这个库文件,没有那种可视化的。 现在三十二位的单片集散家呢,都提供了这个可视化的助磁化工具。 所以呢,我就和大家探讨一下,我们应该选择传统的那种标准库呢?还是应该选择基于可视化初始化工具的这种库文件呢?个人我是推荐大家使用可视化 找辅助工具的,因为采用可视化这种辅助工具之后呢,你的初始化过程就确实很方便, 大大提高了我们的这个开发速度,特别是在项目开始的时候啊,我们有一些是不确定的,一些可能要重复性的进行措施化,或者说临时的 进行一些检测,对吧?如果像那种情况下呢,使用这个可视化的这个图形工具啊,就非常方便,你可以随时改,改了之后直接输出代码就可以了,只要你自己生成的代码呢,按照他的规则来写, 那么他生成的新代码是不会覆盖你原有的代码的,这样的话对我们羡慕的维护测试这个效率是非常高的, 特别是那个银角的初始化,这一点效率确实非常高。如果你按照传统的那种方式去比较多标准库去初始化你的 银角的话,你的一个格局一个一个银角去,对,去查找,这样的话就去了比较费时间,特别是中间有需要修改的话。呃,过去使用的标准库文件,标准库文件的话,它的好处呢,就是效率比较高一些,也有很多人在用这个可视化, 这个辅助工具是后来才推出来的,我看到这个工具最早的时候是使用 psa 那个带处理器的时候,我刚看到的时候呢,我感觉,哇有好多的空函数啊,感觉很复杂,也记不了那么多, 我就没有用。后来呢,我接手了一个半拉子的工程,就是别人做了一半人,人家就是基于这个辅助工具开发的。后来我也是从那个时候呢,我才开始使用这个 可视化的辐射工具,用了之后我才发现,确实应该转到这个可视化的辐射工具上面来,确实很方便 啊。原有的那个元气的那些论色,比如说这个函数这么多,每一个功能吗?是吧?某功能模块,他的库函数那么多,实际上啊,他,呃功能并不 是我们想象的那么复杂,看起来函数很多,但是功能呢,可以归为几类,然后使用起来并不是很复杂的。用这个可 化的辐射工具呢,他可以选用呢两种库函数,这点大家要注意一下。有些人说这个 h al 库函数呢,比如说这个三十二位,以这个 stm 三二代飞机为例吧,他可以选用这个 h a l 库函数,对吧?这个库函数呢,叫高级抽象层的一种库函数,换句话说,这个 函数明的定义啊,就像我们这个温度是函数一样,他是会议的,这样的话我们就很容易理解,呃,所以使用起来也比较方便。 他的不足呢,就在于,就像有些朋友说的,他的效率呢要低一些,因为他要考虑到所有的使用情况,所以呢相对而言呢,里面的 代码要露出一些。但是如果,但是我们又说回来,对于上周围的秘籍而言,如果我们在实际项目里面,他的性能啊,是远远超出了我们的实际需要的,大家可以回想一下是不是这样, 除非你的音乐里面需要精确到微秒级别的那种控制,那么这个 h a l 款所在一部分的功能可能是呃时间会长一些。 如果这种情况满足不了你的应用需求的话,那你可以选择这个 ll 库函数,也就是底层驱动库函数,这个库函数呢,实际上大家看一下就知道他是直接就是对计算器投诉,这和我们自己呃选代码对 记这记法问计算器是一个道理,只不过呢他啊对计算机的操作定义了很多比较含义比较丰富的红,这样的话 比我们直接使用对计成器操作的那种数据啊更容易理解。是啊,无论是你需要对时间控制, 比如说对控制精度比较高的那种情况下呢,我们在输出代码的时候啊,就可以选用这个 alophone 函数,如果你的代码不需要那么精确的控制,就是说 精确到微秒级别的那种控制,那么你就可以选用 hl 款,因为采用 h al 呢,好处的话就是容易维护携带吗? 产品都比较快,不足之处呢,他就是一个是他的效率是要低一些,第二个呢,他还占用了一些内存。 在初始化的时候,我们每一个模块呢,比如说一个窗口吧,他都有一个窗口的控制模块吧,它里面就定义了一个初始化窗口的一个结构,这个结构呢是绿虫一直是占用的而言,我们在实际应用里面 这个初始化一个模块之后呢,不,不用再对他进行初始化的,也就是初始化的这个数据机构,初始化完成之后呢,就可以扔掉的,可以把这部分内存给释放掉。但是如果你想要 是 alc 函数的话,那么这个绿虫是一直占用的,他也不是大的问题,因为现在,呃,钙片进 的内存都比较大,我为什么推荐大家现在要转到这个图形化的这个辅助工具上面来呢?一个就是效率高。第二个也是趋势, 你的这个应用比较简单的话,比如说简单的 gpl 储值化的话,或者一些比较简单的功能创口啊,小 spi, 同性啊,这些简单的功能的话,你可能直接反问这个,嗯,存储器也不是很难的,但是当你 需要实现一些相对复杂的应用的时候,呃,恐怕就这个优势就明显了,你比如说像,像 usb 驱动啊,有些朋友说这个我们学单边机应该从这个计算器开始学习,这话 掌声是没有错的。呃,我们理论上讲的,我们学习单片机啊,应该是从数据手册先看数据手册,然后呢 写代码是这么个过程。第三呢,我们看数据手册以后到写代码中间还有个理解啊,和这个调试的阶段。但是使我们使用这个可视化的辅助工具之后呢, 这个过程可以大大的缩短,因为他的这个提供的库函数也全部是开元元代码,因此你可以看到他这个整个初始挂钩上 他的计算器的操作可以大大的加速你对这个车的理解,特别是当一些数据手册里面有一些持续性的要求的时候呢, 你可能理解起来比较困难,但是有了个这个初始化之后的元代码,那你就很容易加深你对这个数据手册的理解,这一点也是非常重要的。

通过点亮一个灯,学习标准库编程方法。上期我们新建好了工程,本期我们使用一下点亮一个 led 灯,从中学习编程思想。我们打开工程编译一下,这样既能检查一下工程是否错误,又能在编程中使用跳转可以看到没有错误。 我们现在写一下程序,点亮一个灯本质就是操作 gpio。 在写程序之前,我们介绍几个概念, 一、外设就是在芯片上所有外围功能模块二、时钟时钟就相当于外设的心脏,在使用外设前都必须打开时钟,否则没办法工作。 可以看这张图,这是 stm 三二结构框图,可以在数据手册中找到。除了内核,其他都属于外设, 可以看到这里有很多我们今天要用到的 gpio, 也是外设的一种,那么内核是怎么控制 gpio 和其他外设的呢?其实它是用这些总线控制的, 这些总线就相当于联络员接通内核与外设,可以看到这里有很多总线,在使用外设时,外设在哪一条总线下,我们就需要打开哪条总线的时钟。 我的板子上 led 灯接的是 p c 十三,要使用 g p i o c, 所以就需要打开 a p p 二的时钟。 分析完这些回到我们的工程,第一步就是打开 a p b 二的时钟,这个函数就是打开 a p b 二时钟的,我们可以右键打开它,看下使用方法,这里都有详细的使用方法,我们放大看下,可以看到这里第一个参 参数就是要我们传入要开启的外设,他把能传入的参数都列出来了,我们选择这个后缀为 gpioc 的参数传入进去就可以了,复制下来粘贴到这里,这样第一个参数就完成了。我们看一下还有哪些参数可以点击这里返回上一个页面。 这里还有一个参数,是说要打开时钟还是要关闭时钟? enable 是打开, disable 是关闭,我们选择 enable 将它放到这里就可以了。这样几 p i o c 的时钟就打开了。现在 p c 十三还不能正常工作,我们还需要配置一下 g p i o 的输入输出模式等参数,才能让它正常工作。使用 g p i o innate 函数就可以配置它的参数了。同样我们右键跳转到 函数,就可以看到它的详细使用方法了,这里就是详细使用方法。这里第一个参数意思是说我们要选择哪一组 gpio? 由 a 到 g 组,我们选择 gpioc。 回到 may 函数,我们填入 g p i o c 这里看到还需要参数,我们右键再回去看一下。这里是说需要一个结构题参数,结构题定义是 g p i o innate type define。 我们转到定义看一下, 这里就是他的定义了,里面包含了 gpl 配置的所有参数,他需要这样一个结构体作为参数,所以我们要定义这样一个结构体。我们在上面这里定义一下,名字随便起,但是为了见明之意, 我们叫做 gpio in its draft。 现在我们在下面这里把这个结构体里的元素复制一下,我们先全部引出来,然后再一个个看下。 我们先看一下这个 mode, 我们右键转到结构体的定义,我们看一下 mode 怎么复制,这里意思是说 mode 是配置 gpio 的工作模式,具体值在 gpio mode tap define 中,我们右键转到这里看一下, 这里就是之前视频中讲过的八种 gpio 工作模式,我们选择推碗输出模式,复制一下粘贴到这里,这样这个 mod 就填写好了,我们再看一下 gpio pin, 看下定义,我们知道 g p i o c 这一组有很多银角,这里意思是说要配置哪个 g p i o 引角可以参考 g p i o p s define, 这个是在下方,这里我们要使用 p c 十三,所以我们选择这个复制过去就可以了。最后我们看一下 speed 参数,还是转到定义这里,意思是说要配置 g p i o 的速度,可以参考这个 define, 我们去看下,这里我们选择五十兆赫兹就行了,我们粘贴过去,这样就复制结束了。 最后我们把结构体传进函数,注意参数是指针形式,我们需要取地址,这时候 pc 十三已经配置完成了,接下来我们就可以使用了, 因为我板子上是低电频,点亮 led 灯,我们可以使用 gpio reset bass 函数,让 io 口述出低电频。我们需要告诉这个函数,我们要控制哪 哪一组,哪一个 g p i o, 所以要把 g p i o c g p i o 片十三传进去。现在程序已经写好了,我们编译一下, 可以看到没有错误,我们现在就可以接好下载器和板子的线下载程序了。下载程序之前需要先配置一下,点击魔术棒 debug 选项, 这里选择你自己使用的下载器类型,我使用的是 dap, 所以选择这个点击确定,点击这里下载程序 可以看到这里已经下载好了,我们看下现象,复位一下就可以看到已经点亮了。现在我们来总结一下,一、在使用外设之前要先打开对应的总线时钟。二、初始化配置 gpio 时,如果有不会使用的函数, 可以跳转查看定义,也可以直接打开对应的文件去查看可以使用的函数,函数文件就在 lab 组里,每一个外设都有对应的文件, 末尾是 rcc 的就是时钟的酷函数文件, gpio 的就是 gpio 的酷函数文件。今天的视频就到这里了,喜欢就点个关注再走吧,我们下期见。

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 三二的开发方式早该定型了,但我发现在各大高校的实验室和很多公司的老项目里,标准库依然活得好好的, 而官方强推的 hell 库配合 qmbx, 早就成了新项目的主流。今天咱们不谈虚的,就聊聊在当下,不管是为了应付考试还是找工作,到底该选哪一个。 先说说标准库,也就是 s p l。 说实话,这东西 st 官方很多年前就停止更新了,它的代码写起来虽然啰嗦,全是结构体配置,但逻辑非常直观。 我觉得它最大的价值就是离硬件够近,你配置的每一行代码几乎都能对应到底层的寄存器操作。对于刚学潜入式的同学,或者还在啃 coretextm 三权威指南的人来说,用标准库能让你真得搞懂单片机在干嘛,而不是在调 api。 再来看 hell 库,现在做新项目基本都是配合 stm 三二、 qmx 使用的,它的核心优势就两个字,效率。点点鼠标、时钟数引脚配置全自动生成。 但是这也带来了一个问题, hell 酷为了兼容性,封装的太厚了,代码执行效率确实不如标准酷。不过这两年大家也学聪明了,对性能要求高的地方会混合使用。 l l 酷既有 q mx 的 便利,又有接近底层的速度。 那么到底选哪个?其实这取决于你当下的目标,并没有绝对的优劣。如果你时间充裕,想把中段时钟这些概念吃透,标准库确实像一位研师,能逼着你去看手册。 但如果你急着参加电赛,或者以后想进企业做应用层开发,直接上手 hell 库也是完全没问题的。而且把格局打开一点,裸机开发的争论可能只是暂时的。 未来的复杂项目大概率是跑在 r t o s 上的,不管是 free r t o s 还是国产的 r t fad, 在 系统的加持下,底层用什么库其实已经被屏蔽掉了,你更需要关注的是现成调度信号量和消息队列。 所以别被工具束缚住,标准库也好, hell 库也罢,能把你脑子里的想法变成现实,就是最好的工具。