前言

最近在调试项目过程中,用了 STM32F030 的定时器 16 作为系统时钟,1ms 触发一次中断,过程中遇到一些值得记录的问题。

记录

STM32F030 中定时器 16 的初始化配置如下

void TIM16_Init(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM16, ENABLE); TIM_TimeBaseStructure.TIM_Prescaler = 48 - 1; //预分频系数为48-1,这样计数器计数频率为48MHz/48 = 1MHz
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //设置计数器模式为向上计数模式
TIM_TimeBaseStructure.TIM_Period = 1000; //设置计数溢出大小,每计1000个数就产生一个更新事件,1ms一次中断
TIM_TimeBaseStructure.TIM_RepetitionCounter = 0; //重复n次计数才触发中断
TIM_TimeBaseInit(TIM16, &TIM_TimeBaseStructure); //将配置应用到TIM16中
TIM_ITConfig(TIM16, TIM_IT_Update, ENABLE); //使能TIM16的更新中断
TIM_Cmd(TIM16, ENABLE); //开启定时器16 //Enable the TIM16 Interrupt
NVIC_InitStructure.NVIC_IRQChannel = TIM16_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPriority = 3;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}

对应的中断配置

void TIM16_IRQHandler(void)
{
if(TIM_GetITStatus(TIM16, TIM_IT_Update) != RESET)
{
systime_ms++;
}
TIM_ClearITPendingBit(TIM16, 0x00ff);
}

配置使用了 Update 中断,也就是更新事件中断。值得注意的是初始化中的 TIM_RepetitionCounter,这个代表重复溢出多少次才触发一个中断,在一开始的配置中我忽略了这个参数,但仍然是 1ms 触发一次中断。但在后面开启了 I2C 功能和初始化 I2C 后,这个定时器就变成了 2 次溢出才触发一次中断,只有配置

TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;

之后才正常中断

STM32F030 定时器多次溢出才触发中断的问题的更多相关文章

  1. stm32F042 (二) 按键触发中断

    已经实现GPIO口输出高低电平控制LED,这里实现按键触发中断来改变LED闪亮的频率,因为PB3连着LED,所以PB3的输出模式没有改变,随意选一个GPIO口PA7接按键产生中断.因为nucleo开发 ...

  2. jenkins实现master变化时,才触发构建(过滤分支)

    现状:现在是这样的,每个开发push时,都触发jenkins进行构建 期望:只有当代码被push到master时才进行构建 (根据使用的git平台)做这些配置需要先了解一些概念: (github) p ...

  3. ZYNQ笔记(4):PL触发中断

    一.ZYNQ中断框图 PL到PS部分的中断经过ICD控制器分发器后同时进入CPU1 和CPU0.从下面的表格中可以看到中断向量的具体值.PL到PS部分一共有20个中断可以使用.其中4个是快速中断.剩余 ...

  4. 继承CListCtrl,然后重载OnLButtonUP消息,发现变成双击才触发???

    原文链接: http://bbs.csdn.net/topics/380052636 1楼 因为WM_LBUTTONDOWN事件和NM_CLICK事件是同时发生的,只是后者要等到用户释放鼠标后才算完成 ...

  5. @DisallowConcurrentExecution 注解的作用 【定时器执行完当前任务才开启下一个线程的方式】

    转: @DisallowConcurrentExecution 注解的作用 2018年10月12日 16:42:40 fly_captain 阅读数:4317   Quartz定时任务默认都是并发执行 ...

  6. js 如何控制文本域输入内容在一定间隔时间段才触发事件查询相关数据

    <script>var flag = 0;var t;function openFlag () { t = setTimeout(function(){flag = 1; dosometh ...

  7. MSP430单片机的中断

    这篇文章是从网上转载过来的,原文章地址:http://www.21ic.com/jichuzhishi/mcu/questions/2012-12-21/154794.html 中断是MSP430微处 ...

  8. 定时器事件QtimerEvent 随机数 qrand Qtimer定时器

    QTimerEvent类:定时器事件.QObject的子类都可使用  int QObject::startTimer(int interval)[参数:毫秒][返回值:定时器整型编号]来开启一个定时器 ...

  9. DMA设计

    目录 DMA设计 DMA框架 手册请看英文手册 芯片特性 请求来源 协议简述 基本时序 模式 协议 数据大小的描述 具体完整的实例时序 代码设计 驱动程序 测试程序 测试 参考链接 title: DM ...

随机推荐

  1. AJAX——XMLHttpRequest对象的使用

    AJAX是web2.0即动态网页的基础,而XMLHttpRequest对象又是AJAX的核心.XMLHttpRequest对象负责将用户信息以异步通信地发送到服务器端,并接收服务器响应信息和数据 一. ...

  2. windows 修改端口数据及连接时间

    最近线上遇到windows机器访问其他机器的时候失败的情况.实际就是本地的端口不够用造成的. D:\>netsh interface ipv4 show dynamicportrange pro ...

  3. Mysql 不存在则插入,存在则更新

    )) BEGIN ) ; END 开始写了一大堆的代码来实现,原来还有这种方法,惊讶~~~ 如果不存在,就插入一条数据:如果存在,更新某个字段. on duplicate key update: my ...

  4. struts2学习笔记(4)接收参数

    ①用action属性接收 登录界面例子 在webroot下创建login.jsp和success.jsp login.jsp中加入表单: <form action="LoginActi ...

  5. NoSQL概述

  6. isinstance判断某个对象是否是某个类创建的

    #!/usr/bin/env python li = [11,22] #判断某个对象是否是某个类创建的. r = isinstance(li, list) print(r) 结果: C:\Python ...

  7. springboot启动过程(2)-run方法

    1 springApplication的run run方法主要是用于创造spring容器ConfigurableApplicationContext对象. public ConfigurableApp ...

  8. day70 12-存储过程和存储函数

    什么是相关子查询? 这是一个子查询,子查询本身又是一个多表查询.where不能用组函数,但是可以用字符函数instr().除了order by排序没有考,查询语句的所有内容都考了.这个题有点难度. 今 ...

  9. day17 12.复习

    最后能抽取成word文档或者是图片之类的. 1.jdbc介绍  jdbc是一套标准,可以让我们Java程序员通过Java代码直接操作数据库,这就够了.jdbc涉及到的包两个:java.sql,java ...

  10. 使用HttpClient进行Get通信

    --------------siwuxie095                             首先到 Apache官网 下载相关的库文件     Apache官网:http://www.a ...