粉丝83获赞174

同学们好,我是超子,那么今天呢,我们是第六小节啊,我们穿插一个知识点,对 help 啊,它的中断处理函数,以及 week 啊,若声明的中断回调函数,那我们呃先着重的介绍一下 啊,因为呢,他不光光是针对咱们外部 l 口的外部中断啊,那各个呃外设都是一样的。 好,我们先来看啊,就是 help 和标准库的有一个很大的区别点啊,就是 help 啊,它相当于是一个 呃保姆级别的,对吧?他将各个外设的中断处理函数啊,都帮我们做好了啊,不光光是 l 口的外部中断啊,定时器,串口, adc, spi, f, oc 啊,各个外设, 那么然后呢,他会通过一个回调函数啊,就相当于是个子函数,你在这个子函数当中啊,去添加你想要处理的工作,那比如 说我们下一个章节啊,我们去做外部中断检测按键好,按键处罚了产生的中断。那么在这个外部中断的回调函数当中,那我们去添加什么程序呢?去添加控制 pb 零 l 口高低变电瓶的程序,那么进而呢,去控制 led 四的亮面。 哎,所以说各个外设的中断处理以及这个回调函数,他都是这个思路。那么所以说呢,这种情况啊,对我们新同学和老同学可能会有不同的感受。那么老同学,那我们用标准库 啊,那么标准库的时候呢,我们都是自己去处理中断处理函,中断这个函数啊,想要干什么,判断什么标志位,那我们自己处理。所以这个时候呢,可能会觉得黑小库啊,将这个条条框框卡的太紧啊,那么这个时候黑小库也并不是强制要求我们必须用他的中断处理函数,我, 那也可以像标准库一样啊,我们自己来做这个中断这个部分,那如果说老同学啊,也想省点事,是吧?啊,那咱们用他这个回调函数,那也是可以的,那如果说对新同学而言,对吧,那么这个还有库呢就,呃,应该是比较这个贴心了 啊,因为新同学啊,可能会对这个底层硬件啊,这个标志位啊啊,或者各个外设的了解呢,可能不是那么深入啊, l 口这个外部中断还比较简单, 对吧?你到了窗口 adc, 定时器, spi, 尤其是 iphonec 这个东西啊啊,各个中段啊,非常多啊,各个标志位也非常多啊,还有逻辑处理,谁在前谁在后啊。所以这个时候啊,我们用配角库啊,他做好的这个中段处理函数啊,那就我们就比较省心了 啊,就防止我们新同学啊,可能是对这个外设了解的还不够深入啊,对各标志位了解不够深入,对吧, 如果贸然自己去写的话,可能会埋下一些相关的一些隐患,那你就用它现成的来去回调函数中,你去处理你的应用程序的逻辑任务就可以了啊。所以有这么一个特点和区别点啊,大家先做一个了解 好,然后呢,我们去看黑奥库啊,嗯,各个中段的回调函数啊,它都是加了一个 weak 的一个弱声名啊,相当于替身演员。好,我们就以 l 口的外部中断啊,我们来举个例子。好,我们先打开 头文件吧,哎,从头文件看,这个函数声明列表啊,就比较清晰啊,好,我们找 g p l 口的。 好,我们看到最后啊,那么一般啊,对,各个外设的这个头文件啊,最后的这些函数,那就是我们的中段啊,还有我们的 core back 加 core back 呢,就是这种回调函数啊,好,我们可以来跳转一下, 你看他做好的这个 l 口的外部中断在干啥?首先呢是判断标志位,然后呢去清楚标志位, 那如果说啊,我们自己来写的话,那也也是这个思路,对吧?哎,所以说 hell 库呢,并不是说他有什么特殊的操作啊,只是说他帮我们去完成了这些, 呃,工作,让我们省点心。好,然后你看调用了什么呢?调用了 crow back, 呃,加 crow back 就是回调好,我们在这里面啊,去做相关的一些,我们先编一下啊,好,我们跳转一下啊,直接跳到下面了,对吧?哎,就是这样,你看他加了一个胃口 啊,那么胃口啊,我们怎么说呢?打比方就相当于是替身演员。好,那么这个时候呢,我们还没有去调用啊,就是我们自己去做这个扣外科,所以这个时候就相当于演员本人他没来,那么这个时候在 编译程序的时候啊,如果说你没有这个替身,你缺少这个函数,你说你这肯定编译不过去,对吧?所以他加了一个胃口,有个弱声名。好,那么这个时候啊,就如果说我们现在用它了, 那你说那我可不可以在这里面直接添加我们想要处理的程序,没有问题,我是可以的,对吧?因为他一调用,哎,你在里面添加了,比如说控制 pp 零, ok 啊, 但是呢,这个黑药库啊,他加这个胃口的最终目的啊,就是希望呢,我们如果说用到他的时候啊,不去破坏或者是更改黑药库的原码, 对吧?这个框架咱们不要改好,那么这个时候你看我们怎么办?我们去做一个类似于这种呃呃,引号的啊,强声名。好,什么是强声名啊?你就把这个位可去了,参数不变,函数名称不变。好,那么这会我们再来演示一下,你看我 现在跳转是跳到替身这了。好,你看啊,我演员本人来了,函数名称参数一模一样。好,这个时候我再来编译一下,嗯,点错了啊,好,编译。 好,那么这个时候我们再观察啊,我再去跳转,哎,就跳到了我们自己啊,做的这个强声明的一个函数,就相当于此时我要用了, 哎,我把演员本人请来了,那么这时候替身呢,你就不用上台了。好,我们就在我们自己做的强声明,也就是演员本人的这个 这个回调函数当中,比如我们去控制 p b 零就 ok 了啊,所以说各个外设啊,不光是 l 口,他都是这样的啊,你用哪个扣外壳,你就去做这么一个强声明,把演员本 人请来,你在里面添加你想要处理的任务啊,就可以了。好,那么今天这一节呢,我们是做一个支点的补充啊,我们下一节就进入到外部中断啊,按键检测。

用 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 文件加路径,我们添加一下, 我们再次编译一下,可以看到已经没有错误了。工程到这里已经创建好了,喜欢的小伙伴记得点赞关注哦,我们下期见。

生育员中的回调函数是一个很重要的知识点,但是作为初学者却很难理解和意思。什么是回调函数?就是把一个函数的地址作为另一个函数的参数, 在另一个函数中,通过指针的形式来标用这个函数,这就是回答函数。回到函数的作用,可以修改函数的功能,可以更好的把握标用函数的时机,还能让触发逻辑和业务逻辑分离,让代码结构显得更清晰。我们用一个简单的例子来说明,随手写一个冒泡牌去算法 实现从小到大的排序功能,但是这个代码也只能实现从小到大排序,如果想要反过来,就必须要修改排序函数,把大于号改成小于号,这种办法多少显得有点不够高端。如果排序函数被做成一个库,修改起来比较麻烦,那可不可以实现一个排序函数, 既能从大到小排序,也能从小到大排序,让调动者来决定,这样的代码才显得更加人性化。于是我们把代码修改一下,先实现两个函数, grat 和 nice 函数原型都一样,功能也差不多完成两个数字的比较,区别就是他们的结果相反。 然后在排序函数上添加一个参数函数指针,函数体重做比较的部分通过函数指针来实现。 要用排序函数的时候,先传入 grat 来看下结果,实现了从大到小排序,再回到慢函数中, 把参数修改成 nice, 再运行一下,结果是从小到大排序,这个排序函数就显得智能一些,实现什么样的排序完全由调整来决定。我们来分析一下步骤是什么样的?要送函数的时候,把 nice 作为参数传入, 其实就是传入 less 函数的地址,于是函数指正 p 指向了函数 lex。 判断语句中通过函数指针来间接的调入函数,相当于实现了 aj 和 aj 加一的比较, 这个过程就是 c 语言里面的回调机制。最后给大家留一个问题,你知道在 cd 加的 str 中和回调函数类似的机制叫什么吗?

同学们,大家好,我是潮子。那么今天呢,我们来进入到啊第四小节。我们来看一看 hell 库要求我们调用的第一个函数啊, hell 立体的,他做了哪些工作啊,以及标准库和 hell 库之间的一个很大的区别啊,那就是 system tiger 啊,它作为了一个时间基准。 好,我们来看一下啊。跳转。首先他做的第一个工作啊,就是将我们指令预取这个功能给他打开。 好,那我们看下讲义啊。那么经过多次的一个跳转啊,他最终寻求的啊,就是一个或等于操作, 是寻求智卫寄存器中的某个二军之位好。哪个二军之位呢? a c r 寄存器的一左一四位, beat 四好。我们可以打开一下 flash 手册, flash 呢,是一个单独的手册 啊,并没有在我们的编程手册当中啊,大家要注意一下这个点。好。 a c r 计算器 beat 四好。一 enable 啊。打开我们的指令预取好。我们再往后看设置我们的中断分组啊。 中断分组一共有五种方式啊,零一二三四不同的分组。那我们的抢占优先级以及撒吧子优先级啊,也有叫响应优先级的,他的取值范围不同。 好。那么关于中断这个部分啊,咱们老同学的话就不用多说对吧,因为中断是个非常用的功能。那么新同学的话啊,我们在具体用到中断的时候,我们再着重讲。 好,我们大家知道啊,就是默认的将组啊,中断分组分成了四,那我们也可以什么啊,自己去更改它。好。然后呢,就进 入到了我们的哎, systemtig 滴答式中,对吧?将它作为了什么呢? time based source 时间基准。然后呢,配置成了一毫秒的中段。好,我们稍后马上就会看这个中段啊。然后最后一句话, low level hardware 以以内。那初始化底层硬件 啊。但是呢,我个人呢,还是习惯于什么呢?啊,还是习惯于将这种初始化啊。各种配置呢,就放在咱们内函数啊,内函数这个位置 啊,个人习惯好。我们接下来呢,就去看这个 system tick 啊。中断好,打开我们的 a t 啊, interrupt, 我们跳转一下, 好,一个变量呢,再加一个值。我们看讲义。跳转之后啊,我们会发现啊, u w t, 它是一个什么呢? u 运 三十二类型的一个全区别量好,他加,加什么,而且重要是加,等于就是累加啊。好,我们跳转,跳转,再跳转啊。最终呢,就是一好一毫秒一次中断。 在这个中断当中,这个全局变量 uwt, 每次累加一。好。那如果说我现在获取一下,你看没有一千好,那就表示系统初始化完毕。配置好 systemtic 之后啊,过去了一千,黄秒,一秒钟。那五千呢?过去五秒,一万呢,十秒 好。然后呢,他也提供了一个函数啊, get ticket 啊,就是返回我们这个权力变量啊。那么我们这个时机啊,他用的最多的地方,那就是各个外设啊,黑小库的一个特点。呃,他不光光啊,是对外设 设计存器功能的一个配置啊。他将外设的一些数据应用,操作的一些应用策略啊,也给我们做了相关的一些风光。 而且呢,是统规为三类对吧?嗯,非阻塞方式的啊,中断 dma。 那么阻塞方式呢,就是那种轮巡方式,查询标志位了,查询数字量了啊,在 vivo 循环中进行啊,它是阻塞方式轮巡方式啊。所以说呢,这种方式 啊,需要用 systematic 这个时机去做超时判断啊。如果没有超时判断, 我们的逻辑又出现错误的情况下,你就退不出这个微笑循环对吧?因为他是轮循阻塞吗?那就相当于我们就陷入到一个死循环了。好,那咱们以串口为例。那我们一看,相信大家呢,就能够对他有一个啊。了解 好,我们加入创口的源码啊,还要加 d m a 啊,你不加 d m a 的话,创口边缘过不去。 好,我们编译一下。然后呢,我们去哎,卡住了啊。稍等。 好,我们打开创口的头文件啊,拉到大概最后这个位置啊,还是各个函数声明,那就相当于函数列表 a p i 函数啊。我们来看啊,挂 it 的 就是中断方式。那么这个呢, d m a 什么都没挂,那就是轮循阻塞方式,在微小循环中去判断。好,那么这个时候你可以观察到啊,这种 d m a 或者中断的,没有 timot 这个参数,不用超出判断对吧?因为我不组。 好。那么如果说是轮寻阻塞方式呢,就必须加入一个超时判断,以防止陷入此循环出不来。好,那我们就以咱们以接收为例。 好,四个参数啊。串口咱们还没讲啊,咱们先来大致了解一下啊。首先第一个参数呢,就是串口控制了一个总结构体, 那就是我们的 taps。 好。然后呢,是我们的一个指针接收存放接收数据的一个地址对吧?好,然后 size 接收多大数据量。然后呢,就是超时时间。好,我们来画一个图啊,比如说 size。 比如说我想接收两百字节, time out 五千单位是毫秒。好,也就是在五千毫秒的时间范围内,你帮我接收二百个字节。好,那 我们来跳转一下啊。 好,我们剪着关键的部分来说。首先看 counter, counter 等于 size, 那么现在呢?被负值成了二百。好。然后呢,这个 counter 就作为了 will 的一个退出条件, 他等于零的时候,对吧?那么他就退出了我们的微笑循环啊。那么也就是说啊,每接收一个字节,康特都会减减减减减减减,减到零,那就退出呗。好。那如果说假设现在我们的逻辑错误了啊,我可能数值判断有问题,只有一百个字节。 好,那你就说 count 永远捡不到零。那么这个时候 vivo 呢?它没有办法正常退出。那假设如果此时没有拆帽子,超时判断的话,那你这个 vivo 就现死了。那所以说我们需要加入什么超时好?超时怎么判断的?我们关注 这个子函数啊,两个关键点。首先呢,一个是 r x n e 啊,标志位接收完成。或者是接收到数据的一个标志位。然后呢,还有个 star。 好,这个 star 从哪来的呢?在这个位置。好,我们把它记录下来啊。那么这个值很重要。 s t a r t。 那么也就是说啊,在进入 well 循环之前,我先获取了一下当前的这个 u w tik 全局变量的时间对吧? get 好假设,比如说现在是一千啊, star 是一千。好,那我们跳转到这个函数啊。子函数 围绕循环。等待什么?等待 flag 之位啊。刚才我们说了,等待谁呢?就等待接收标志位之位嘛。就表示接收到了一个字节数据,你的 conte 就可以减减了。 好。那么假设现在呢?我这个数算错了。哎,给到你一百就再也不给你了。哎,也就是说我们的接收标志位他不会置位了。好。那么 vivo 呢?你不能死在这啊。那怎么办呢?你看有这个异物分支。 好。首先呢两个条件,第一个 time out 等于零啊,这是不符合逻辑的对吧?我得我怎么也得给你,最起码我给你个一毫秒吧 啊。所以说这个条件啊,是在排除这种逻辑错误的形式啊。如果说一旦说一看给了我零秒钟的超时时间,那我就直接开帽子啊,没啥可说的。好,那我们就看第二个分支啊。第二个条件啊,这个很关键啊。 will 在不断的等待接收标志为职位。好,那么这个时候呢,不能干等着啊。哎,我在这个 e 五分之内啊,还要不断的 get get get。 那么假设现在我 get 一千啊,不,不能一千了啊,得两千得加值啊。两千减一千等于多少呢?等于一千啊。你这个一千大于五千吗?不大于啊,就在等着吧。三千,四千,五千 啊。这个时候呢,你要注意啊,我这个标志位不会再支位了,因为我就一百个给你,完了就不会再支位了。好。那么这时候如果说等到了六千零一 减一千等于多少呢?有五千零一,五千零一大于 temot 嘛,大于了。那么 e 服呢?成立了好就表示什么呢?超时时间到了,那我就不能再等了,再等不就现如此讯完了吗?是不是好,直接返回 temot, 我把这清了啊。返回 temot 之后, 上层函数要判断对吧? time out 等于 ok 吗?不等好。不等于 ok 的话,直接 receive 这个函数啊,就返回 title 了。好,那我们的应用程序去调用这种轮寻阻塞方式接收数据。一判断返回值, titles 就表示在规定的时间范围内没有接收到预期的数据压。哎,我们该怎么处理?怎么处理 好?那么这个啊,就是 csmt 最为常用的地方,他不光是窗口,各个外设啊,各个数据应用策略啊,他都给我们,就是黑小库啊,都给我们封装好了。三种方式对吧?这种阻塞方式就需要用它去实际啊,做超时判断 好。然后呢,还有个地方, delete 函数啊, delete 延时函数。好,这个就比较简单了啊。那么假设呢,我想延时五十毫秒对吧?五十毫秒好,上来之后呢,肯定要有个 star 啊,一个起点好,比如 现在七点等一千。然后呢, white 啊,等于 delete 啊,它就是五十呗。啊,你要判断一下,它要小于这个什么呢? 因为它是个 unit, 三十二啊,就是这个全具备量对吧?所以最大呢,就八个 f。 好。那么 white 啊,它要加等于什么呢? frank 啊 frank, 刚才我们已经看了对吧?跳转跳转,再跳转,就一 对吧。好,所以外侧现在呢,等于五十一。那么这个时候到了微小循环了。就等着呗。年时嘛,就在这等着等等等等等啊。如果说,你看啊,如果说我现在一零五零。 好,一零五零啊,减去 star, star 等于多少?一千好,他减他等于多少?等于五十对吧?五十小于五十一吗?小于五十一。哎,说。但是呢,也到了什么,也到了临界点了。好,如果说我再加一个啊,一零 五一,因为五一减一千等于五十一了,五十一还小于五十一吗?就不成立, vivo 就退出了啊。所以说这个 white 啊,在做一个什么呢?等待就是一个 vivo 的一个退出的啊,一个边界点啊。等待的时间到了,那我就退出啊,你就可以什么继续往下走啊。一个延时毫秒级的啊,一个延时函数。 好。那么今天的任务呢,咱们就到此啊。咱们主要呢就是解决了一下 hell 语气的啊,他所做的任务,那么以及我们的时机的。呃,两点用处吧。啊,就是两个最常用的地方。

同学们大家好,我是超子,那么今天呢,我们来做准备篇的第一个内容啊,去 st 的官网下载幺零三系列海尔库的源码,然后呢去创建第一个空白工厂。好,首先我们复制下载地址,打开我们的浏览器, 我们看这个位置啊,产品选择器,我们点击一下,那么 s t m 三十二啊,那么旗下的各个系列的黑友库的原码啊,我们都可以从这个位置呢进行选择。好,我们去选我们的系列 f 一。 好,我们打开新的一个页面,然后呢直接向下拉啊,拉到大概最后这个位置吧,获取软件。好,它里面有两个分支啊,我们选择这个分支,然后点击 get noticed, 那么如果说啊,咱们 有 s t 的账号啊,下载会比较方便,如果没有账号的话呢,可以通过邮箱链接啊,或者是我们直接将这个压缩包分享给大家。好,那么它大概有一百多兆啊,我们我先暂停视频。好, hello, 酷的源码呢,已经下载完毕啊,它呢是一个压缩包。好,我们先来提取。 好,我们现在回到讲义啊,那么本次系列教程当中啊,我们所有手打的代码啊,我们所有的模板历程都是我们独立自主的去创建的工程,并没有使用 st 官方的这个 q 跟 max 这个辅助软件啊,然后那我们可以看一看啊, 啊,我们下一节呢就会对黑药库的结构啊做一个初步分析,那么每一个外设啊,他的原文件,他的头文件啊,我们会着重的去关注 expot 的 这个部分啊,那么这个部分呢又分为什么? types, contents, micro 和 function。 好,那么这些所有东西啊,我们都会以思维导图的形式呢,给大家做这么一个总结。好,那么随着我们教程的深入啊,随着大家对呃黑小库每一个外设的了解 啊,那么这个时候你会发现啊,那么其实呢, q max 软件啊,它的每一个配置项,它的每一个下拉菜单以及下拉菜单当中每一个可选项,对吧,它都会和我们这些成员啊一一对应。 所以说这个时候呢,整个 q max 这个配置界面啊,其实就相当于已经深深地刻在你的脑袋当中,你完全可以独立自主的去构建工程了 啊,那么这个时候每一句程序都是我们自己来编写的啊,所以它的灵活性啊啊,以及适应性会更高,所以说呢,我也希望同学们啊,能够独立自主的去构建我们海尔库的工程。 好,我们来看一下啊,呃,还没有解压完成,我们就先来创建一个新的文件夹, 那一会呢,我们就将工程啊创建到我们这个文件夹当中。 好,我们再来新建几个分组,首先呢是 user 啊,我们把工程还有 mender c 啊放到我们 user 里边, h w hardware, 那我们相关的自己操作硬件的啊,点 c 啊,点 h 文件啊,就放到这个分组当中。好, library lab, 那就存放什么呢?海尔库的原码还有头文件。好,不要忘了还有 c m s s, 对吧? c m 那盒 相关的。好,马上解压完毕啊,我们再来打开一个文件夹界面, 我们呢就从下载以及解压后的啊黑小库的源码当中呢,去提取我们需要的。 好,我们来关注这个 drivers f 一这个系列还有酷的哎,原码其中呢,包含头文件啊,还有这个 c 文件,那我们呢,直接就把它俩粘贴复制过来 好,然后呢,还要拿 c m s i 内核相关的,首先我们看 include, 那么这里边啊,幺零三是 c m 三内核对吧,它还包含其他的啊,所以说我们干脆啊,咱也不挑了,就直接一股脑的拿过来得了。然后再来看 d s s t。 半导体,好, f 幺系列 include 啊,幺系列下面的啊,幺零零幺零幺幺零二啊,幺零三幺零五幺零七啊,还有系统相关的,咱们也是啊,一股脑的拿过来,好,投文件搞定。 然后呢是 source 原文件模板好,首先呢,把这个 system 系统相关的点 c 文件拿过来好,我们选择啊,然后呢,点 s 啊,汇编的启动文件 对吧?啊,也是各个系列的啊,咱也那也就是直接一股脑的拿过来,好,我们用的是 c 八 t 六,对吧?幺零三, c 八 t 六,所以说和我们最相近的啊,是幺零三叉 b 好,那基本上咱们该拿的拿的差不多了啊,打开我们的 q 软件, 那么关于 q 软件啊,安装比较简单啊,如果有的同学呢,没有安装呢,就看这个 pdf 就可以了啊,我们就不占用视频的时间了。好,点击 project new, 我们放到 user 这个文件夹, 好,选择我们的芯片,幺零三, c 八 t 六 c 八, 好,我们点击管理, 创建几个分组, user h w lab c m s s 好,我们先来添加 hel 库,我们先来添加几个必备的吧, 首先呢,是还有的一个总的啊,算是一个 c 文件,然后呢,还有 cortex 啊,核相关的啊,主要是和 mac 还有以及这个 system teak, 然后呢, g p l 口,你基本上实现哪个功能? l 口肯定要用,然后就是啊, c c 啊,辅位啊,还有这个时钟配置好,那么这六个咱们先添加上,那么以后用哪个,咱们再加哪个好? c m s i s 系统相关的加入,然后呢,千万不要忘了啊,点 s 的汇编启动文件啊,和我们 c 八 t 六最相近的,我们选择幺零三,叉 b, 好,我们点击。 ok, 我们再新建一个文件夹啊,新建一个文件啊,保存什么呢? mender c, 保存在 user 这个分组当中,好,添加到 user 分组, 然后呢,我们去 include, 先来包含一个 health 的一个总的啊,投文件,然后就是什么呢?我们 c 语言的什么呢?哎,入口点内函数, 然后再点击 option, c c 加加,然后呢,去通知一下编译器啊,我们用的是哪个系列呢? s t m 三十二 f 幺零三,我们用的是叉 b。 好,然后呢,设置头文件的录 好,我们来看啊 h w 我们应该还没有哎,没有添加是吧?好,那么这个时候呢,我们只是添加文件夹啊, 投文件 原文件好, h w include lever include c m s i s include 好,三个路径,那么以后再需要的话,我们再在这个位置添加。 ok, 好,我们点击一下边翼。好,那么这种呢,发现呢?没有办法找到这个 config 头文 键,好,我们回到我们的 lab, include。 好, config 这个图文件啊,是 template, 它加了一个模板对吧?好,我们就直接用这个模板,但是名字呢,要改一下, ok, 我们再来编译, 那么这个时候呢,我们就可以什么啊,正确地找到 ctrl 这个投音键了啊,好,稍等一会, 电脑有点卡, 好,没有什么问题。那么然后啊,大家千万不要忘了一个很关键的一个点啊,就是 interrupt 啊,中断相关的,对吧?好,那么这时候呢,我们可以看啊 啊,我们可以看下载的去 project 啊,它这些模板里头和我们最相近的是幺零三 r b, 然后呢,我们可以从 examples 啊,可以找一个,比如说串口啊, it interrupt 方式 source 啊, interrupt 点 c 啊,那么这里面啊,就包含了我们各个中断一些接口的啊啊,它里面呢都是一些英文的注释啊,可能看的比较乱啊,没有关系,对吧?我在这个地方给大家 做好了一个中文注视的啊,我们直接添加到我们的工程当中, 放到 h w 分组吧,点 c, 点 h, 好,我们添加到 h w 分组 it, 对吧,就是 interrupt, 好,我们可以看一下啊, 那么大家一定要注意一下啊, system tike 啊,其中包含了一个什么呢?就是 h a l 黑药库的一个一个特点啊,就是它呢将 system tike 作为了一个实际单元 啊,不要着急,我们后面呢会对他做详细的一个讲解,那么今天的任务啊,我们就完成了,对吧,我们呢就构建起来了我们一个空白的一个基础框架, 那么今后啊,我们各个外设,那么各个功能就在这个基础框架之上啊,我们添砖加瓦去,不断的丰富。 好,那么下一篇章呢,我们就是准备篇二啊,会对黑药库的结构做初步分析,那么然后呢,再介绍一下我们这个啊思维导图的一个用法。

stm 三二开发选择用寄存器还是扩函数?对于初学 stm 三二开发的同学来说,大多数都会面临选择学习寄存器还是扩函数的问题, 建议先学习寄存器的方式,因为学习寄存器的时候,你会去看到它的原理图,包括芯片手册配置的每一个寄存器,可以让你学的更通透。当你需要设置某个引角为输出模式时,通过学习寄存器你可以直接修改相应的寄存气味,非常清晰明了。 当我们用到 stm 三二的时候,因为它是二内核,芯片复杂,寄存器多,手册也很长,需要操作多个寄存器时,你会发现效率极其低下,而使用库函数可以极大的提高开发效率。库函数封装了每个寄存器,并提供了配置函数。在 stm 三 二开发中,建议优先选择学习寄存器的方式,理解芯片原理和寄存器配置,可以更加高效地实现业务逻辑,从而提高开发效率。
