STM32定时器溢出模式计时设置

发布者:美人如玉剑如虹最新更新时间:2016-05-25 来源: eefocus关键字:STM32  定时器  溢出模式  计时设置 手机看文章 扫描二维码
随时随地手机看文章
环境:

 

主机:WIN7

开发环境:MDK4.23

MCU:STM32F103CBT6

 

源代码1:

说明:定时器采用TIM2,时钟源为内部8M晶振,向上溢出模式.此定时器用在延时函数,最小可以延时1us,故没有采用中断形式定时.

初始化代码:

 

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
//重新将Timer设置为缺省值
TIM_DeInit(TIM2);
//采用内部时钟给TIM2提供时钟源
TIM_InternalClockConfig(TIM2);

timInitStruct.TIM_ClockDivision = TIM_CKD_DIV2;   			//定时器基准频率8MHz
timInitStruct.TIM_Prescaler = 8 - 1;           				//计数频率为1us跳转1次
timInitStruct.TIM_CounterMode = TIM_CounterMode_Up; 		//向上计数
timInitStruct.TIM_RepetitionCounter = 0;
timInitStruct.TIM_Period = 0; 								//这个值实际上就是TIMX->ARR,延时开始时重新设定即可

TIM_TimeBaseInit(TIM2, &timInitStruct);
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); 					//计数溢出时触发中断
TIM_Cmd(TIM2, ENABLE);				 						//开启计数器

 

 

延时函数代码:

 

//延时1us
//最大65536us
void _delay_us(uint16_t t)
{
	TIM_SetCounter(TIM2,0);
	TIM_SetAutoreload(TIM2,t - 1);
	//等待时间到
	while (TIM_GetITStatus(TIM2,TIM_FLAG_Update) == 0);
	//停止计数
	TIM_SetAutoreload(TIM2,0);
	//清中断标志
	TIM_ClearITPendingBit(TIM2,TIM_FLAG_Update);
}

//延迟1ms
//最大65ms
void _delay_ms(uint8_t t)
{
	
	if (t > 65)
	{
	 	t = 65;
	}
	_delay_us(t * 1000);
}

 

源代码2:

说明:定时器采用TIM3,时钟源为内部8M晶振,向上溢出模式.此定时器用在长时间计时,最小计时间隔为100us,故采用中断形式定时.

初始化代码:

 

//中断NVIC设置:允许中断,设置优先级
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;    			//更新事件
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;   //抢占优先级0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;          //响应优先级1
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;             //允许中断
NVIC_Init(&NVIC_InitStructure);                             //写入设置

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
//重新将Timer设置为缺省值
TIM_DeInit(TIM3);
//采用内部时钟给TIM3提供时钟源
TIM_InternalClockConfig(TIM3);

timInitStruct.TIM_ClockDivision = TIM_CKD_DIV2;   			//定时器基准频率8MHz
timInitStruct.TIM_Prescaler = 800 - 1;           			//计数频率为100us跳转1次
timInitStruct.TIM_CounterMode = TIM_CounterMode_Up; 		//向上计数
timInitStruct.TIM_RepetitionCounter = 0;
timInitStruct.TIM_Period = 0; 								//这个值实际上就是TIMX->ARR,延时开始时重新设定即可

TIM_TimeBaseInit(TIM3, &timInitStruct);
//清溢出中断标志
TIM_ClearFlag(TIM3, TIM_FLAG_Update);
//禁止ARR预装载缓冲器
TIM_ARRPreloadConfig(TIM3, DISABLE);
//开启中断
TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE); 				
TIM_Cmd(TIM3, ENABLE);				 						//开启计数器

中断函数代码:

 

 

//TIM3中断
void TIM3_IRQHandler(void)
{
	if(TIM_GetITStatus(TIM3, TIM_IT_Update) == SET)
    {
		TIM3->ARR = 0;
        //清中断溢出标志
 		TIM_ClearITPendingBit(TIM3,TIM_FLAG_Update);
	
		//发送信号
		Sig_Table.stop_require = 1;
    }
}

 


关键字:STM32  定时器  溢出模式  计时设置 引用地址:STM32定时器溢出模式计时设置

上一篇:SysTick系统时钟滴答实验(stm32中断入门)
下一篇:stm32cube通用定时器输入捕获

推荐阅读最新更新时间:2024-03-16 14:54

STM32学习笔记time定时器
STM32的定时器是个强大的模块,定时器使用的频率也是很高的,定时器可以做一些基本的定时,还可以做PWM输出或者输入捕获功能。从系统框架图下看,名为TIMx的有八个,其中TIM1和TIM8挂在APB2总线上,而TIM2-TIM7则挂在APB1总线上。其中TIM1&TIM8称为高级控制定时器(advancedcontroltimer).他们所在的APB2总线也比APB1总线要好。APB2可以工作在72MHz下,而APB1最大是36MHz。 由上图可知,当APB1的预分频系数为1 时,这个倍频器不起作用,定时器的时钟频率等于APB1的频率;当APB1的预分频系数为其它数值(即预分频系数为2、4、8 或16)时,这个倍频器
[单片机]
<font color='red'>STM32</font>学习笔记time<font color='red'>定时器</font>
STM32只开启SWD模式调试程序
由于IO口不足,需要将JTAG复用成IO口使用,保留SWD功能调试程序。设置如下: GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);
[单片机]
STM32固件库实现按键控制
前言 使用固件库实现按键控制LED 一、原理图 从按键的原理图可知,这些按键在没有被按下的时候,GPIO 引脚的输入状态为低电平(按键所在的电路不通,引脚接地),当按键按下时,GPIO 引脚的输入状态为高电平(按键所在的电路导通,引脚接到电源)。只要我们检测引脚的输入电平,即可判断按键是否被按下。 电容的作用:利用电容充放电的延时,消除了波纹,起到消抖功能。 二、软件设计 在“工程”上新建“bsp_key.c”及“bsp_key.h”文件,这些文件不属于STM32 标准库的内容,是由我们自己根据应用需要编写的,编程步骤如下: 使能 GPIO 端口时钟; 初始化 GPIO 目标引脚为输入模式(浮空输入); 编写简
[单片机]
<font color='red'>STM32</font>固件库实现按键控制
关于stm32 HardFault_Handler 异常的处理死机
在系统开发的时候,出现了HardFault_Handler硬件异常,也就是死机,尤其是对于调用了os的一系统,程序量大,检测堆栈溢出,以及数组溢出等,找了半天发现什么都没有的情况下,估计想死的心都有了。如果有些程序开始的时候一切没有问题,但是运行几个小时候,会发现死机了,搞个几天下来估计蛋都碎了一地吧。。。 一般来说运行操作系统 是以下几个问题 1.开始的时候给ucos分配的堆栈太小了,随着项目做多了,这类问题一般很容易解决 #define TASK_IO_SIZE 300 #define TASK_IO_PRIO 6 OS_STK TASK_IO_STK ; 比如修改300到 1000,做开发的时候 如果ram允许,尽量
[单片机]
关于<font color='red'>stm32</font> HardFault_Handler 异常的处理死机
STM32 DMA正常模式等待传输完成和开始下一次传输
选择DMA的正常模式,即DMA只传输一次。如果当传输完一次后,还想再传输一次,就需要重启DMA: DMA_Cmd(DMA1_Channel6,DISABLE); 重新设置源地址 重新设置目的地址 重设传输数量 DMA_Cmd(DMA1_Channel6,ENABLE); 因此建议把DMA_InitStructure定义为全局变量,然后可以使用下面语句来重启DMA: DMA_Cmd (DMA1_Channel4,DISABLE); DMA_Init(DMA1_Channel4, &DMA_InitStructure); DMA_Cmd (DMA1_Channel4,ENABLE); 刚发现只需要重新设置传输数据长度就可以
[单片机]
使用STM32的PWM输入功能计算输入PWM的周期
1、时钟部分,TIMER2的时钟频率,我是初始化为36M. RCC_PCLK1Config(RCC_HCLK_Div2); //设置低速AHB时钟=系统时钟/2 RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); // 倍频系数为9 PLLCLK="8"*9=72 2、TIMER初始化 TIM_DeInit(TIM2); TIM_TimeBaseStructure.TIM_Period = 65535; TIM_TimeBaseStructure.TIM_Prescaler = 18; TIM_TimeBaseStructure.TIM_ClockDivision
[单片机]
STM32网络通信之DM9000A电路设计
1 总体描述: DM9000A的PHY 能够以10BASE-T 的标准在UTP3\4\5或者以100BASE-T的标准在UTP5上接口通信。它的自动协商功能是够自动配置DM9000A最大地发挥出自身性能。它同时支持IEEE 802.3X全双工数据流通信。 2、结构图: 3、硬件电路的设计 (1)电源连接: 引脚号 电气连接 说明 2、9 模拟2.5V 为RX和TX供电,必须为2.5V 23、30、42 数字3.3V1 数字电源3.3V为芯片供电 15、33、45 数字地 数字地 5、6、47、48 模拟地 5、47、6分别为RX和TX的GND,48是通带宽带的GND 41
[单片机]
<font color='red'>STM32</font>网络通信之DM9000A电路设计
stm32之nRF24L01无线模块(1):SPI2到SPI1的移植
本来要接着写滴答定时器的,但是趁热打铁写下SPI2到SPI1的移植。 为什么SPI2到SPI1的移植要放在nRF24L01模块里写呢,因为无线模块最重要的数据传输就是通过SPI实现的。为什么需要移植呢,因为即使是一个厂家的板子,不同型号之间它的无线模块引脚也有可能是不同的,顺便稿下移植,加深下理解。SPI2移植到SPI1呢,自己做的时候遇到了一些问题,就从遇到的问题顺便讲下初始化。 1.引脚问题 看stm32的手册,不知道为什么,无论在GPIO还是在SPI里都没有看到这个引脚的问题(初学者有可能移植的时候可能纳闷为什么是这些引脚),只有在引脚复用AFIO那里才提了一下,如下图 这样才知道SPI1的引脚,但是
[单片机]
<font color='red'>stm32</font>之nRF24L01无线模块(1):SPI2到SPI1的移植
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved