粉丝4.3万获赞10.2万


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 三二,如何使用系统滴答定时器实现精准延时?定时器能够记录时间,并且到设定时间后能提醒的一种器件。那么系统滴答定时器和普通的定时器有什么区别呢? 区别在于,系统滴答定时器是捆绑在 nvic 中段体系的定时器,常用于提供操作系统的时间节拍,为不同任务徐以不同数目的时间片,确保没有一个任务能霸占系统。首先让我们了解一下系统滴答定时器的系统框架, 它主要由一个时钟源选择电路,一个重在置寄存器、一个二十四位递减技术器以及一个控制状态寄存组成。如何实现精准延时功能?第一步,通过状态控制寄存器的第二位可以选择技术器的时钟源,以此来决定技术器及一次数 的时间。第二步,通过重载值寄存器可以设置技术器从哪个数字递减技术到零。第三步,当我们设置好第一步和第二步以后,这个时候我们就可以通过技术器及一次数的时间和技术的次数即可计算出计数器技术完的时间。 这个时候只需要对状态控制计存器的第零位写一,以打开技术器,使其开始技术。第四步,通过轮寻状态控制计存器的第十六位,如果该位为一,则说明技术器技术完成,那么就完成了对应的精准延时。 以 stm 三二 f 四零七单片机为例,使用系统低搭定时器实现好鸟级精准延时,参考代码如下。 使用系统滴答电石器实现微秒级精准延时,参考代码如下。


简单了解 stm 三二单片机的 pwm 功能。 pwm 的全称是脉冲宽度调制,可以通过对改变脉冲的时间宽度来等效地获得所需要合成的相应幅值和频率的波形, 多应用于 led 灯亮度调节、电机调速等场合。在 stm 三二单片机中,并没有哪个片上外设的名字叫做 pwm, 而官方将 p w m 的功能集成在通用定时器的电路上面。因此想要使用 p w m 功能,就需要了解通用定时器如何产生。 p w m 通用定时器其实是基本定时器的 plus 版本,就是在基本定时器的基础上增加了一个比较计存器和一个输出控制电路来实现 pwm 功能。比较计存器的作用就是将计数器的每 每一个值和写入的特殊值进行比较,然后将比较结果传递给输出控制电路,使其输出对应的电瓶信号。我们代码配置自动重载值为一千,技术器递减技术,那么技术器就会反复的从一千数到零, 在这个时候,我们往比较计存器里面写入一个七百,那么比较计存器就会挨个将计数器的值和比较计存器的值进行比较,根据比较结果,对应的输出通道就会有一个图例的波形输出。 简单地来说,比较寄存器的作用就是用来调节 p w m 波的高低,电瓶的占空比。我们想要实现 p w m 输出功能,只需要在基本定时器的配置代码上添加以下步骤的代码, 将比较寄存器的值以及输出控制电路配置好,即可完成 p w m 的输出。以 st m 三二 f 四零七单片机的 p c 六附用到通用定时器三的通道一、输出 p w m 为例,参考代码如下。

