目录
这一章,我们将向大家介绍如何使用 STM32F1系列 的通用定时器。TIME1和TIME8为高级定时器;TIME2~5为通用定时器;TIME6和TIME7为基本定时器。本章将选择难度适中的通用定时器讲解,在本章中,我们将学会如何配置使用 TIM3 的定时器中断。
STM32F1 的通用定时器是一个16位自动装载计数器构成的(可计数0~65535)。每个通用定时器有4个独立通道(ch1~4),每个独立通道可实现:1)输入捕获 2)输出比较 3)PWM模式 4)单脉冲模式输出。(输出比较与PWM模式都能输出PWM波形,但有差别,常使用PWM模式输出PWM波形)。
自动重装载计数器可以向上计数、向下计数或者向上向下双向计数。此计数器时钟频率由 72M经过预分频器分频得到。
定时器本质上是一个16位计数器(就是自动重装载计数器),计数器是一种寄存器,学过数电应该清楚,寄存器必须输入时钟才能工作,该计数器输入时钟频率为72M/(psc+1),psc就是预分频值。计数器每增加一个数,时间增加一个计数器时钟周期,因此,计数器计多少个数,就决定了定时时长是多少。这样就能理解为什么要配置自动重装载计数器和预分频寄存器了。
该部分可大体浏览一下,可只看文字部分,初步了解,等以后深入。
1)控制寄存器1(TIMx_CR1)。

图 1.1.1 TIMx_CR1 寄存器各位描述
我们主要关注这几位:最低位CEN,也就是计数器使能位,该位必须置 1,才能让定时器开始计数。第 4 位 DIR(direction,方向),设置计数方式是向上计数还是向下计数。
2)DMA/中断使能寄存器 (TIMx_DIER),(DMA/Interrupt Enable Register)该寄存器是一个 16 位的寄存器。

图1.1.2 TIMx_DIER寄存器描述
第0位:更新中断允许位,本章使用定时器中断需要使该位置1。
3)预分频寄存器(TIMx_PSC)。

图1.1.3 TIMx_PSC寄存器描述
该寄存器对时钟进行分频,然后提供给计数器,作为计数器的时钟。 定时器时钟来源有多个。常见的时钟来源是从APB1倍频而来,72MHZ。f_计数器 = 72 M/(psc+1)
这个控制寄存器带有缓冲器,它能够随时被该变预分频值,但是新的预分频器值将在下一次中断发生时被设置成新的分频系数。
4)自动重装载寄存器。(TIMx_ARR)实际上有两个自动重装载寄存器,一个是我们看得见的,可以直接操作的;另一个是我们看不见的,叫影子寄存器。影子寄存器里的自动重装载值才是真正使用的自动重装载值。我们可以随时向看的见的寄存器里写入新的值,但是只有在在产生中断时,影子寄存器才会重新置入自动重装载值。

图1.1.4 TIMx_ARR 寄存器描述
时基单元包含:
● 计数器寄存器(TIMx_CNT)
● 预分频器寄存器 (TIMx_PSC)
● 自动装载寄存器 (TIMx_ARR)
向上计数模式:
在向上计数模式中,计数器从0计数到自动重装载值(TIMx_ARR计数器的内容),然后重新从0开始
计数并且产生一个计数器中断事件。
向下计数和中央对齐模式暂不介绍。
timer3.c文件
#include "stm32f10x.h"
void timer3_init(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStr; //定义时基单元结构体
NVIC_InitTypeDef NVIC_Initstr; //定义NVIC结构体
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟3使能,挂载于APB1
TIM_TimeBaseInitStr.TIM_ClockDivision = TIM_CKD_DIV1; //默认值,目前不需要修改
TIM_TimeBaseInitStr.TIM_CounterMode = TIM_CounterMode_Up;//向上计数模式
TIM_TimeBaseInitStr.TIM_Period = 4999; //2hz 72000000/(4999+1)(7199+1)
TIM_TimeBaseInitStr.TIM_Prescaler = 7199; //设置预分频器值
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStr); //初始化时基单元
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //Timer3中断使能
NVIC_Initstr.NVIC_IRQChannel = TIM3_IRQn;
NVIC_Initstr.NVIC_IRQChannelCmd = ENABLE;
NVIC_Initstr.NVIC_IRQChannelPreemptionPriority = 0;//最高优先级
NVIC_Initstr.NVIC_IRQChannelSubPriority= 0;
NVIC_Init(&NVIC_Initstr);
TIM_Cmd(TIM3, ENABLE);//开启定时器
}
函数及参数讲解:
voidTIM_TimeBaseInit(TIM_TypeDef*TIMx, TIM_TimeBaseInitTypeDef*TIM_TimeBaseInitStruct);
时基初始化函数:该函数用来设置 定时器 定时时长。第一个参数指定哪个定时器。第二个参数传入时基单元结构体指针,该结构体参数如下:
中断服务函数
void TIM3_IRQHandler(void) //定时器中断服务函数,固定函数名,去starup启动函数文件找函数名
{
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查 TIM3 更新中断发生与否
{
TIM_ClearITPendingBit(TIM3, TIM_IT_Update ); //清除 TIM3 更新中断标志
LED0=!LED0;
}
}
函数及参数讲解:
主函数
int main(void)
{
delay_init();
Led_Init();
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
timer3_init();
while(1)
{
}
}
学先大体了解工作原理,学会调用库函数实现功能;然后再逐步深入。初有问题请留言。
文章目录1.开发板选择*用到的资源2.串口通信(个人理解)3.代码分析(注释比较详细)1.主函数2.串口1配置3.串口2配置以及中断函数4.注意问题5.源码链接1.开发板选择我用的是STM32F103RCT6的板子,不过代码大概在F103系列的板子上都可以运行,我试过在野火103的霸道板上也可以,主要看一下串口对应的引脚一不一样就行了,不一样的就更改一下。*用到的资源keil5软件这里用到了两个串口资源,采集数据一个,串口通信一个,板子对应引脚如下:串口1,TX:PA9,RX:PA10串口2,TX:PA2,RX:PA32.串口通信(个人理解)我就从串口采集传感器数据这个过程说一下我自己的理解,
目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称
最近在学习CAN,记录一下,也供大家参考交流。推荐几个我觉得很好的CAN学习,本文也是在看了他们的好文之后做的笔记首先是瑞萨的CAN入门,真的通透;秀!靠这篇我竟然2天理解了CAN协议!实战STM32F4CAN!原文链接:https://blog.csdn.net/XiaoXiaoPengBo/article/details/116206252CAN详解(小白教程)原文链接:https://blog.csdn.net/xwwwj/article/details/105372234一篇易懂的CAN通讯协议指南1一篇易懂的CAN通讯协议指南1-知乎(zhihu.com)视频推荐CAN总线个人知识总
深度学习部署:Windows安装pycocotools报错解决方法1.pycocotools库的简介2.pycocotools安装的坑3.解决办法更多Ai资讯:公主号AiCharm本系列是作者在跑一些深度学习实例时,遇到的各种各样的问题及解决办法,希望能够帮助到大家。ERROR:Commanderroredoutwithexitstatus1:'D:\Anaconda3\python.exe'-u-c'importsys,setuptools,tokenize;sys.argv[0]='"'"'C:\\Users\\46653\\AppData\\Local\\Temp\\pip-instal
在添加一些空格以使代码更具可读性时(与上面的代码对齐),我遇到了这个:classCdefx42endendm=C.new现在这将给出“错误数量的参数”:m.x*m.x这将给出“语法错误,意外的tSTAR,期待$end”:2/m.x*m.x这里的解析器到底发生了什么?我使用Ruby1.9.2和2.1.5进行了测试。 最佳答案 *用于运算符(42*42)和参数解包(myfun*[42,42])。当你这样做时:m.x*m.x2/m.x*m.xRuby将此解释为参数解包,而不是*运算符(即乘法)。如果您不熟悉它,参数解包(有时也称为“spl
我完全不是程序员,正在学习使用Ruby和Rails框架进行编程。我目前正在使用Ruby1.8.7和Rails3.0.3,但我想知道我是否应该升级到Ruby1.9,因为我真的没有任何升级的“遗留”成本。缺点是什么?我是否会遇到与普通gem的兼容性问题,或者甚至其他我不太了解甚至无法预料的问题? 最佳答案 你应该升级。不要坚持从1.8.7开始。如果您发现不支持1.9.2的gem,请避免使用它们(因为它们很可能不被维护)。如果您对gem是否兼容1.9.2有任何疑问,您可以在以下位置查看:http://www.railsplugins.or
require'mechanize'agent=Mechanize.newlogin=agent.get('http://www.schoolnet.ch/DE/HomeDE.htm')agent.clicklogin.link_withtext:/Login/然后我得到Mechanize::UnsupportedSchemeError。 最佳答案 Mechanize不支持javascript但您可以将搜索字段添加到表单并为其分配搜索词并使用mechanize提交表单form=page.forms.firstform.add_fie
在几个项目中,我希望有一个类似rakeserver的rake任务,它将通过任何需要的方式开始为该应用程序提供服务。这是一个示例:task:serverdo%x{bundleexecrackup-p1234}end这行得通,但是当我准备停止它时,按Ctrl+c并没有正常关闭;它中断了Rake任务本身,它说rakeaborted!并给出堆栈跟踪。在某些情况下,我必须执行Ctrl+c两次。我可能可以用Signal.trap写一些东西来更优雅地中断它。有没有更简单的方法? 最佳答案 trap('SIGINT'){puts"Yourmessa
我有可变数量的表格和可变数量的行,我想让它们一个接一个地显示,但如果表格不适合当前页面,请将其放在下一页,然后继续。我已将表格放入事务中,以便我可以回滚然后打印它(如果高度适合当前页面),但我如何获得表格高度?我现在有这段代码pdf.transactiondopdf.table@data,:font_size=>12,:border_style=>:grid,:horizontal_padding=>10,:vertical_padding=>3,:border_width=>2,:position=>:left,:row_colors=>["FFFFFF","DDDDDD"]pdf.
我正在寻找一个用ruby演示计时器的在线示例,并发现了下面的代码。它按预期工作,但这个简单的程序使用30Mo内存(如Windows任务管理器中所示)和太多CPU有意义吗?非常感谢deftime_blockstart_time=Time.nowThread.new{yield}Time.now-start_timeenddefrepeat_every(seconds)whiletruedotime_spent=time_block{yield}#Tohandle-vesleepinteravalsleep(seconds-time_spent)iftime_spent