搜索

tag 标签: 定时器

相关帖子

版块 作者 回复/查看 最后发表
关于曼彻斯特解码的问题 RF/无线 wanghahaa 2017-6-22 2 2576 wanghahaa 2017-6-23 16:24
DSP开发--- dm642的中断定时器 【DSP 与 ARM 处理器】 Aguilera 2017-6-21 0 505 Aguilera 2017-6-21 21:13
WatchDog例程中LoopCount计数次数问题 attach_img 【微控制器 MCU】 寒风吹彻 2017-6-17 1 1301 strong161 2017-6-18 17:25
CC2530-A2 Zigbee模块 无线组网透传 板载PCB天线 15X24mm 4.5dBm - [!price! 1 枚芯币] 信息发布 jack914 2017-6-15 0 808 jack914 2017-6-15 13:36
单片机 单片机 菲利盟电子 2017-6-8 0 808 菲利盟电子 2017-6-8 11:17
stm32不占用定时器和Systick的us级延时函数 attach_img 【stm32/stm8】 dql2016 2017-6-5 2 2411 皈依 2017-6-6 09:10
stc89c52单片机使用外部中断0时,ET1不能置1吗? attach_img 【51单片机】 赵怡彬 2017-5-29 4 1182 billliu66 2017-5-29 13:14
悬赏 RTX定时器程序 出先错误:'rtapi.h': No such file or directory - [悬赏 1 枚芯币] 产业风云 t1422020674 2017-5-27 0 909 t1422020674 2017-5-27 21:13
LPC1768定时器问题 【NXP LPC MCU】 yunhai14 2017-5-26 8 1341 EETUX 2017-5-26 15:25
STM32定时器的捕获通道的“边沿检测器”的疑惑 【stm32/stm8】 huixianfxt 2017-5-15 1 1876 ienglgge 2017-5-15 13:22
STM32L4的LPTIM定时器是否能够像51单片机进行外部脉冲计数? 【stm32/stm8】 ZHANGXUEJIE 2017-5-11 1 1402 gs001588 2017-5-15 17:15
28335ADC采样的触发源 【DSP 与 ARM 处理器】 nepudqyzdh 2017-5-2 7 4146 hwaming 2018-3-17 22:08
介绍MSP430定时器A捕捉脉实例 【微控制器 MCU】 fish001 2017-4-26 0 404 fish001 2017-4-26 22:05
MSP430 单片机中断嵌套使用过程的总结 【微控制器 MCU】 fish001 2017-4-26 0 1111 fish001 2017-4-26 22:04
Msp430定时器的介绍及其基本应用 【微控制器 MCU】 fish001 2017-4-23 0 202 fish001 2017-4-23 20:54
stm32高级定时器主输出使能后,usart1就不能发送只能接收了? attachment 【stm32/stm8】 赵怡彬 2017-4-23 9 3979 wjcjm 2019-7-16 11:36
诚信做台湾麦肯单片机销售及方案开发 信息发布 hanlie2345678 2017-4-21 0 909 hanlie2345678 2017-4-21 17:25
MSP430_定时器A的使用(含OUTMOD模式详解及运用) attachment 【微控制器 MCU】 fish001 2017-4-23 0 202 fish001 2017-4-23 21:00
MSP430单片机学习小记--基础定时器 【微控制器 MCU】 fish001 2017-6-25 0 606 fish001 2017-6-25 09:56
11.0592MHZ晶振跟51单片机是什么暧昧关系? 信息发布 Lily廖 2017-6-27 0 909 Lily廖 2017-6-27 14:17

相关日志

分享 51单片机定时器无限使用
Atle 2017-6-15 15:26
/************************************* *** 定时器完成 *** 两灯不同频率闪 ***************************************/ #includereg52.h #define FOSC (11059200L) #define WANTTIME (1) //单位MS 进中断的时间 #define VTL ((65536-FOSC*WANTTIME/12000)%256) #define VTH ((65536-FOSC*WANTTIME/12000)/256) #define TIMEISUP (1) #define TIMEISNOTUP (0) #define TIMERCOUNT (2) #define TIMER1 (0) #define TIMER2 (1) #define LED1DELAYTIME (100) #define LED2DELAYTIME (300) sbit Led1 =P0^0; sbit Led2 =P0^1; unsigned int Timers ; void LedEffect(); void Init(); //iTimer是定时器数组的下标 //xTime是要定时的时长,单位ms unsigned char xDelay(unsigned char iTimer,unsigned int xTime) { if(Timers ==0) { Timers =xTime; return(TIMEISUP); } return(TIMEISNOTUP); } void main() { Init(); while(1) { LedEffect(); } } void Init() { TMOD=0X01; TL0=VTL; TH0=VTH; ET0=1; TR0=1; EA=1; } void InitT0() interrupt 1 { unsigned char i; TL0=VTL; TH0=VTH; for(i=0;iTIMERCOUNT;i++) if(Timers 0) Timers --; } void LedEffect() { if(xDelay(TIMER1,LED1DELAYTIME)==TIMEISUP) Led1^=1; if(xDelay(TIMER2,LED2DELAYTIME)==TIMEISUP) Led2^=1; }
423 次阅读|0 个评论
分享 单片机的时钟源和定时器有什么区别?
Mavine 2017-4-6 11:38
大多数单片机都只有 系统时钟 一个。就是CPU的各节拍工作时序的驱动源了。这个频率一般为几MHz。速度比较快,其目的无非是让单片机快点干活。那为啥不是GHz数量呢,这个是 集成电路工艺 决定的。根据工艺反推出某款单片机的理想 工作频率 ,往往也是最佳 工作频率 了。系统在这个频率下工作又快(已达最佳极限)又稳定。最好地体现了计算机的高速运算能力。而定时器就是用来数数 的。跟系统 运行没有关 系。
501 次阅读|0 个评论
分享 51单片机控制舵机程序(别人分享下)
嘟嘟嘟a嘟嘟嘟 2016-8-24 11:11
51 单片机舵机程序不用定时器:自己整理的不用定时器调舵机向左 , 中 , 右三个方向摆动的 51 单片机程序 #includereg52.h sbit a=P0^0; #define uchar unsigned char #define uint unsigned int void delay(uint z) { uint x,y; for(x=z;x0;x--) for(y=110;y0;y--); } void delayus2x(unsigned char t) { while(--t); } void delay750us() { delayus2x(245); delayus2x(122); } void delay1500us() { delayus2x(245); delayus2x(245); delayus2x(245); } void delay2300us() { delayus2x(245); delayus2x(245); delayus2x(245); delayus2x(245); delayus2x(147); } void main() //a=~a 和 delay 顺序不能反 { while(1) { uint i=50; while(--i) // 中 { a=1; delay1500us(); a=0; delay(20); } i=50; while(--i) // 左 { a=1; delay2300us(); a=0; delay(20); } i=50; while(--i) // 右 { a=1; delay750us(); a=0; delay(20); } } }
个人分类: 51控制舵机|543 次阅读|0 个评论
分享 软件模拟串口+红外通信
天涯思君 2016-3-28 18:07
1、软件模拟串口 软件模拟串口就是按照标准RS232时序来发送与接收数据,从而模拟实现单片机的UART功能。 RS232标准 :反逻辑 -3V ~ -15V —— “1” +3V ~ +15V —— “0” 即低电平代表1,高电平代表0。 而 单片机的UART与RS232遵循的是同一个协议,只不过是电平标准不同而已 ,由于这一点,它们之间的通信需要进行电平转换,MAX232芯片的作用就在于此。 RS232时序 : 先发起始位( 0 ),再发8位数据( 低位在先 ),最后发停止位( 1 )。 模拟串行口就必须要计算出每个位的时间, 以波特率9600为例:每秒发9600个位,所以每个位占用的时间为(1/9600)s,大约是104us,然后我们就是要做一个精确的延时,来满足数据发送与接收的时序要求 。 规定:当没有通信信号发生时,通信线路保持高电平。 具体实现: 我们用 定时器 来实现精准的延时。 接收 :当接收到起始位时,便给定时器赋初值、启动定时器、标志位置低,然后等待,当定时器溢出后在中断内部置高标志位,等过起始位,就读取第一位数据,重复上述步骤,等待读取第二位数据......最后得到8位数据。 发送 :发送时先发起始位,再从低位开始,与接收时类似,只要保证电平时间要求依次发送数据就行了。 这里采用ACC来做为发送与接收的缓冲器,发送时先把值给ACC,再依次发ACC的低位,次低位......,接收时同样把先接收到的数据放在ACC的低位。 具体代码请参考附件: 软件模拟串口.txt 2、红外通信 红外接收头参数 : 频率:38KHZ静态输出:高电平 红外发送协议: 引导码 + 客户码1 + 客户码2 + 操作码 + 操作反码 (用户真正需要的就只有操作码。) 各种编码的作用 v1引导码:就是一把钥匙,单片机只有检测到了引导码出现了才确认接收后面的数据 ,保证数据接收的正确性. v2 客户码:为了区分各红外遥控设备,使之不会互相干扰. v3 操作码 :用户实际须要的编码,按下不同的键产生不同的操作码,待接收端接收到后根据其进行不同的操作. v4 操作反码:为操作码的反码,目的是接收端接收到所有数据之后,将其取反与操作码比较,不相等则表示在传输过程中编码发生子变化,视为此次接收的数据无效,可提高接收数据的准确性. 引导码定义 : 一般的红外发射芯片,比如日本NEC的uPD6121G,定义的引导码为 9ms的高电平 + 4.5ms的低电平 (4.5ms的低电平也叫结果码).如下图示: 引导码 客户码操作码定义 : 客户码和操作码都为8位的二进制编码 日本NEC的uPD6121G定义的'0'、'1'如下: 0: 0.56ms的高电平 + 0.565ms的低电平 1: 0.56ms的高电平 + 1.685ms的低电平 如下图示: 客户码操作码 红外接收头的特性 : v.当接收到38KHz的红外线时其输出低电平 v.静态时其输出为高电平 1、由上图可以看出,红外发光管发出的信号经过红外接收头后已经进行了解调,并且将信号进行了反向. 2、同时还可以看出'0' 、 '1' 码只是低电平时的时间不同,既然这样我们就可以 通过计算电平时间长度来判断是 '0' 码还是 '1' 码 . 具体实现: 当引导码出现时会产生一个下降沿,所以我们就利用中断来检测这个下降沿,在检测到下降沿后,就开始计时,直到下一个下降沿出现,则第一位编码接收完毕,然后根据这位编码的时间长度来判断它是否为引导码,若为引导码,则继续接收,若否,则在下一次下降沿到来时重新判断是否为引导码。 当我们接收完33位编码,就去掉第1位的引导码,剩下的32位数据分别用4个字节的空间来保存,然后读取第3个字节(操作码)的数值,再与红外遥控器键码值比对,从而可以判断出是按下了哪个键。 具体代码请参考附件: 红外接收-中断法.txt
2391 次阅读|0 个评论
分享 51单片机的晶振为何常常使用 11.0592Mhz?
charlion 2014-8-28 09:05
因为对于标准通信速率,使用11.0592Mhz的晶振可以得到精准的数值。具体而言如下: 常用波特率通常有:1200、2400、4800、9600,------,若采用晶振12Mhz或6Mhz,计算出的T1定时初值将不是一个整数,这样通信时便会产生积累误差,进而产生波特率误差,影响串行通信的同步性能。 解决方法只有调整单片机的时钟频率,通常采用11.0592Mhz晶振,因为它能非常精确地计算出T1定时器初值,只要是标准通信速率,就可以得到非常准确的数值。
个人分类: 单片机|574 次阅读|0 个评论
分享 430定时器A输出pwm异常
wjh251663924 2014-8-18 11:20
我用430定时器A输出pwm,出现3层现象,一般pwm不就是高低电平嘛,我的开发板出现高中低3层,我用相同程序灌进别的430中,很正常。是我430开发板坏了吗???新买的
227 次阅读|0 个评论
分享 MSP430单片机的中断
幽冥枯哲 2014-7-29 17:00
MSP430单片机的中断 中断是MSP430微处理器的一大特色,有效地利用中断可以简化程序和提高执行效率。MSP430的几乎每个外围模块都能够产生中断,为MSP430针对事件(即外围模块产生的中断)进行的编程打下基础。MSP430在没有事件发生时进入低功耗模式,事件发生时,通过中断唤醒CPU,事件处理完毕后,CPU再次进入低功耗状态。由于CPU的运算速度和退出低功耗的速度很快,所以在应用中,CPU大部分时间都处于低功耗状态。 MSP430的中断分为3种:系统复位、不可屏蔽中断、可屏蔽中断。 (1)系统复位的中断向量为0xFFFE。 (2)不可屏蔽中断的中断向量为0xFFFC。响应不可屏蔽中断时,硬件自动将OFIE、NMIE、ACCVIE复位。软件首先判断中断源并复位中断标志,接着执行用户代码。退出中断之前需要置位OFIE、NMIE、ACCVIE,以便能够再次响应中断。需要特别注意点:置位OFIE、NMIE、ACCVIE后,必须立即退出中断相应程序,否则会再次触发中断,导致中断嵌套,从而导致堆栈溢出,致使程序执行结果的无法预料。 (3)可屏蔽中断的中断来源于具有中断能力的外围模块,包括看门狗定时器工作在定时器模式时溢出产生的中断。每一个中断都可以被自己的中断控制位屏蔽,也可以由全局中断控制位屏蔽。 多个中断请求发生时,响应最高优先级中断。响应中断时,MSP430会将不可屏蔽中断控制位SR.GIE复位。因此,一旦响应了中断,即使有优先级更高的可屏蔽中断出现,也不会中断当前正在响应的中断,去响应另外的中断。但SR.GIE复位不影响不可屏蔽中断,所以仍可以接受不可屏蔽中断的中断请求。 中断响应的过程:(1)如果CPU处于活动状态,则完成当前指令;(2)若CPU处于低功耗状态,则退出低功耗状态;(3)将下一条指令的PC值压入堆栈;(4)将状态寄存器SR压入堆栈;(5)若有多个中断请求,响应最高优先级中断;(6)单中断源的中断请求标志位自动复位,多中断源的标志位不变,等待软件复位;(7)总中断允许位SR.GIE复位。SR状态寄存器中的CPUOFF、OSCOFF、SCG1、V、N、Z、C位复位;(8)相应的中断向量值装入PC寄存器,程序从此地址开始执行。 中断返回的过程:(1)从堆栈中恢复PC值,若响应中断前CPU处于低功耗模式,则可屏蔽中断仍然恢复低功耗模式;(2)从堆栈中恢复PC值,若响应中断前CPU不处于低功耗模式,则从此地址继续执行程序。
801 次阅读|0 个评论
分享 STM32定时器时间的计算方法(转)
huanghai381 2014-7-7 15:09
STM32定时器时间的计算方法 STM32中的定时器有很多用法: (一)系统时钟(SysTick) 设置非常简单,以下是产生1ms中断的设置,和产生10ms延时的函数: void RCC_Configuration(void) { RCC_ClocksTypeDef RCC_ClockFreq; SystemInit();//源自system_stm32f10x.c文件,只需要调用此函数,则可完成RCC的配置. RCC_GetClocksFreq(RCC_ClockFreq); //SYSTICK分频--1ms的系统时钟中断 if (SysTick_Config(SystemFrequency / 1000)) { while (1); // Capture error } } void SysTick_Handler(void)//在中断处理函数中的程序 { while(tim) { tim--; } } //调用程序: Delay_Ms(10); 当然,前提是要设置好,变量tim要设置成volatile类型的。 (二)第二种涉及到定时器计数时间(TIMx) TIM_TimeBaseStructure.TIM_Prescaler = 2; //预分频(时钟分频)72M/(2+1)=24M TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数 TIM_TimeBaseStructure.TIM_Period = 65535; //装载值18k/144=125hz TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_RepetitionCounter = 0x0; TIM_TimeBaseInit(TIM3,TIM_TimeBaseStructure); 定时时间计算: TIM_TimeBaseStructure.TIM_Prescaler = 2; //分频2 72M/(2+1)/2=24MHz TIM_TimeBaseStructure.TIM_Period = 65535; //计数值65535 ((1+TIM_Prescaler )/72M)*(1+TIM_Period )=((1+2)/72M)*(1+65535)=0.00273 秒=366.2Hz */ 注意两点(来自大虾网,未经检验) (1)TIMx(1-8),在库设置默认的情况下,都是72M的时钟; (2)TIM_TimeBaseStructure.TIM_RepetitionCounter=0; 是重复计数,就是重复溢出多少次才给你来一个溢出中断, 它对应的寄存器叫TIM1 RCR. 如果这个值不配置,上电的时候寄存器值可是随机的,本来1秒中断一次,可能变成N秒中断一次,让你超级头大! 假设系统时钟是72Mhz,TIM1是由PCLK2(72MHz)得到,TIM2-7是由PCLK1得到 关键是设定时钟预分频数,自动重装载寄存器周期的值 定时器的基本设置 1、 TIM_TimeBaseStructure.TIM_Prescaler = 7199;//时钟预分频数 例如:时 钟频率=72/(时钟预分频+1) 2、TIM_TimeBaseStructure.TIM_Period = 9999; //自动重装载寄存器周期的值(定时 时间) 累计0xFFFF个频率后产生个更新或者中断(也是说定时时间到) 3、 TIM_TimeBaseStructure.TIM_CounterMode = TIM1_CounterMode_Up; //定时器 模式 向上计数 4、TIM_TimeBaseStructure.TIM_ClockDivision = 0x0; //时间分割值 5、TIM_TimeBaseInit(TIM2, TIM_TimeBaseStructure);//初始化定时器2 6、TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); //打开中断 溢出中断 7、TIM_Cmd(TIM2, ENABLE);//打开定时器 或者: TIM_TimeBaseStructure.TIM_Prescaler = 35999;//分频35999 72M/ (35999+1)/2=1Hz 1秒中断溢出一次 TIM_TimeBaseStructure.TIM_Period = 2000; //计数值2000 ((1+TIM_Prescaler )/72M)*(1+TIM_Period )=((1+35999)/72M)*(1+2000)=1秒*/ STM32通用定时器的基本定时器功能实现灯闪烁 #include "stm32f10x.h" #include "misc.h" void RCC_Configuration(void); void NVIC_Configuration(void); void GPIO_Configuration(void); void TIM3_Configuration(void); int main(void) { RCC_Configuration(); NVIC_Configuration(); GPIO_Configuration(); TIM3_Configuration(); TIM_ClearFlag(TIM3, TIM_FLAG_Update); TIM_ARRPreloadConfig(TIM3, DISABLE); TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE); TIM_Cmd(TIM3, ENABLE); while (1) { ; } } void TIM3_Configuration(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_TimeBaseStructure.TIM_Period = 9999; TIM_TimeBaseStructure.TIM_Prescaler = 7199; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM3, TIM_TimeBaseStructure); } void RCC_Configuration(void) { SystemInit(); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); } void NVIC_Configuration(void) { NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(NVIC_InitStructure); } void GPIO_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC, GPIO_InitStructure); } #include "stm32f10x_it.h" void TIM3_IRQHandler(void) { if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) { TIM_ClearITPendingBit(TIM3, TIM_IT_Update); GPIO_WriteBit(GPIOC, GPIO_Pin_7, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_7))); } }
个人分类: STM32技术文档|608 次阅读|0 个评论
分享 LPC1768 学习(三)时钟配置及节拍定时器探索篇
黄腾酒 2014-7-5 19:51
年前,买了一块LPC1768的开发板,这是我第一次真正的接触 ARM ,随板子一起来的还有一些例程,第一个例程是一个流水灯程序,这个程序涉及到时钟配置,节拍定时器,GPIO口配置,我决定从这个例程开始入门。 程序执行的第一步是复位,复位完成后初始化时钟,这个我在《 LPC1768 学习(一)系统初始化 》中提过,CPU时钟是有锁相环0和CPU时钟配置寄存器共同决定的。锁相环可以把外部时钟倍频到较高频率,PLL0输出频率是: Fcco = (2xMxFin)/N; M值是PLL0CFG寄存器中MSEL0(倍频值)加一,N值NSEL0(预分频值)加一。N值得取值范围是1~32,而M的取值是在较高的振荡器频率下(超过1MHz)允许范围是6~512。 得到PLL0输出值之后,在经过CPU时钟配置寄存器就可以得到CPU时钟。 在这个system_lpc17xx.c文件中,修改#define PLL0CFG_Val 0x00050063的宏定义值就可以了。 例如:00050063这个状态下PLL0输出400MHz。 M = 0x63(16进制) + 1 = 100(10进制); N = 0x05 + 1 = 6; Fcco = 2X12x100/6 = 400M 在经过CPU时钟配置寄存器4分频就变成100M。 在路虎的程序中我发现一个比较好的地方,就是利用时钟节拍定时器定时。 在主函数中写下如下语句就能让节拍定时器1ms中断一次。 if (SysTick_Config(SystemCoreClock / 1000))/1ms进入一次中断/ { while (1); /* 错误情况下就停在这里,对于一个while(1)死循环表示难受,但是还是保留吧 */ } 这个函数的原型是 __STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) { if ((ticks - 1) SysTick_LOAD_RELOAD_Msk) return (1); /* Reload value impossible */ SysTick-LOAD = ticks - 1; /* set reload register */ NVIC_SetPriority (SysTick_IRQn, (1__NVIC_PRIO_BITS) - 1); /* set Priority for Systick Interrupt */ SysTick-VAL = 0; /* Load the SysTick Counter Value */ SysTick-CTRL = SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_TICKINT_Msk | SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ return (0); /* Function successful */ } #define __INLINE __inline #define __STATIC_INLINE static __inline 这个函数的修饰一看就明白,静态内连,但是编译器怎么解释还是看标准是怎么定的,inline是C99标准,想具体了解,可以移步http://blog.csdn.net/hanchaoman/article/details/7270345,这里写的比较清楚。 这个函数就不解释,就是节拍函数的初始化,需要提一下的是这个函数的形参SystemCoreClock /1000,SystemCoreClock 是CPU频率,假设是100M的情况下,100M/1000 = 100K,节拍定时器在100M的时钟下计数100K次,1S可以溢出1000次,就是说1ms溢出一次,所以就是定时1ms。如果想定时10ms,就把除数改成100。
个人分类: LPC1768|6191 次阅读|0 个评论
分享 OLED定时器分享
dushanwu 2014-7-2 08:48
PSOC3 CY8C22545单片机,5个电容触摸按键。 定时时间到之后蜂鸣器报警,LED闪烁。 锂电池供电,断续使用时,基本上可以一个月充电一次。支持MICOR-USB接口,使用手机充电器即可充电,省去了购买充电器的麻烦。
个人分类: 项目分享|249 次阅读|0 个评论
分享 STM32定时器时间的计算方法(转)
wateras1 2014-6-18 23:56
STM32定时器时间的计算方法 STM32中的定时器有很多用法: (一)系统时钟(SysTick) 设置非常简单,以下是产生1ms中断的设置,和产生10ms延时的函数: void RCC_Configuration(void) { RCC_ClocksTypeDef RCC_ClockFreq; SystemInit();//源自system_stm32f10x.c文件,只需要调用此函数,则可完成RCC的配置. RCC_GetClocksFreq(RCC_ClockFreq); //SYSTICK分频--1ms的系统时钟中断 if (SysTick_Config(SystemFrequency / 1000)) { while (1); // Capture error } } void SysTick_Handler(void)//在中断处理函数中的程序 { while(tim) { tim--; } } //调用程序: Delay_Ms(10); 当然,前提是要设置好,变量tim要设置成volatile类型的。 (二)第二种涉及到定时器计数时间(TIMx) TIM_TimeBaseStructure.TIM_Prescaler = 2; //预分频(时钟分频)72M/(2+1)=24M TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数 TIM_TimeBaseStructure.TIM_Period = 65535; //装载值18k/144=125hz TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_RepetitionCounter = 0x0; TIM_TimeBaseInit(TIM3,TIM_TimeBaseStructure); 定时时间计算: TIM_TimeBaseStructure.TIM_Prescaler = 2; //分频2 72M/(2+1)/2=24MHz TIM_TimeBaseStructure.TIM_Period = 65535; //计数值65535 ((1+TIM_Prescaler )/72M)*(1+TIM_Period )=((1+2)/72M)*(1+65535)=0.00273 秒=366.2Hz */ 注意两点(来自大虾网,未经检验) (1)TIMx(1-8),在库设置默认的情况下,都是72M的时钟; (2)TIM_TimeBaseStructure.TIM_RepetitionCounter=0; 是重复计数,就是重复溢出多少次才给你来一个溢出中断, 它对应的寄存器叫TIM1 RCR. 如果这个值不配置,上电的时候寄存器值可是随机的,本来1秒中断一次,可能变成N秒中断一次,让你超级头大! 假设系统时钟是72Mhz,TIM1是由PCLK2(72MHz)得到,TIM2-7是由PCLK1得到 关键是设定时钟预分频数,自动重装载寄存器周期的值 定时器的基本设置 1、 TIM_TimeBaseStructure.TIM_Prescaler = 7199;//时钟预分频数 例如:时 钟频率=72/(时钟预分频+1) 2、TIM_TimeBaseStructure.TIM_Period = 9999; //自动重装载寄存器周期的值(定时 时间) 累计0xFFFF个频率后产生个更新或者中断(也是说定时时间到) 3、 TIM_TimeBaseStructure.TIM_CounterMode = TIM1_CounterMode_Up; //定时器 模式 向上计数 4、TIM_TimeBaseStructure.TIM_ClockDivision = 0x0; //时间分割值 5、TIM_TimeBaseInit(TIM2, TIM_TimeBaseStructure);//初始化定时器2 6、TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); //打开中断 溢出中断 7、TIM_Cmd(TIM2, ENABLE);//打开定时器 或者: TIM_TimeBaseStructure.TIM_Prescaler = 35999;//分频35999 72M/ (35999+1)/2=1Hz 1秒中断溢出一次 TIM_TimeBaseStructure.TIM_Period = 2000; //计数值2000 ((1+TIM_Prescaler )/72M)*(1+TIM_Period )=((1+35999)/72M)*(1+2000)=1秒*/ STM32通用定时器的基本定时器功能实现灯闪烁 #include "stm32f10x.h" #include "misc.h" void RCC_Configuration(void); void NVIC_Configuration(void); void GPIO_Configuration(void); void TIM3_Configuration(void); int main(void) { RCC_Configuration(); NVIC_Configuration(); GPIO_Configuration(); TIM3_Configuration(); TIM_ClearFlag(TIM3, TIM_FLAG_Update); TIM_ARRPreloadConfig(TIM3, DISABLE); TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE); TIM_Cmd(TIM3, ENABLE); while (1) { ; } } void TIM3_Configuration(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_TimeBaseStructure.TIM_Period = 9999; TIM_TimeBaseStructure.TIM_Prescaler = 7199; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM3, TIM_TimeBaseStructure); } void RCC_Configuration(void) { SystemInit(); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); } void NVIC_Configuration(void) { NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPrio rity = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(NVIC_InitStructure); } void GPIO_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC, GPIO_InitStructure); } #include "stm32f10x_it.h" void TIM3_IRQHandler(void) { if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) { TIM_ClearITPendingBit(TIM3, TIM_IT_Update); GPIO_WriteBit(GPIOC, GPIO_Pin_7, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_7))); } }
个人分类: STM32F4XX/1XX/2XX/3XX/stm8s|488 次阅读|0 个评论
分享 STM32定时器时间的计算方法(转)
wateras1 2014-6-18 23:56
STM32定时器时间的计算方法 STM32中的定时器有很多用法: (一)系统时钟(SysTick) 设置非常简单,以下是产生1ms中断的设置,和产生10ms延时的函数: void RCC_Configuration(void) { RCC_ClocksTypeDef RCC_ClockFreq; SystemInit();//源自system_stm32f10x.c文件,只需要调用此函数,则可完成RCC的配置. RCC_GetClocksFreq(RCC_ClockFreq); //SYSTICK分频--1ms的系统时钟中断 if (SysTick_Config(SystemFrequency / 1000)) { while (1); // Capture error } } void SysTick_Handler(void)//在中断处理函数中的程序 { while(tim) { tim--; } } //调用程序: Delay_Ms(10); 当然,前提是要设置好,变量tim要设置成volatile类型的。 (二)第二种涉及到定时器计数时间(TIMx) TIM_TimeBaseStructure.TIM_Prescaler = 2; //预分频(时钟分频)72M/(2+1)=24M TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数 TIM_TimeBaseStructure.TIM_Period = 65535; //装载值18k/144=125hz TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_RepetitionCounter = 0x0; TIM_TimeBaseInit(TIM3,TIM_TimeBaseStructure); 定时时间计算: TIM_TimeBaseStructure.TIM_Prescaler = 2; //分频2 72M/(2+1)/2=24MHz TIM_TimeBaseStructure.TIM_Period = 65535; //计数值65535 ((1+TIM_Prescaler )/72M)*(1+TIM_Period )=((1+2)/72M)*(1+65535)=0.00273 秒=366.2Hz */ 注意两点(来自大虾网,未经检验) (1)TIMx(1-8),在库设置默认的情况下,都是72M的时钟; (2)TIM_TimeBaseStructure.TIM_RepetitionCounter=0; 是重复计数,就是重复溢出多少次才给你来一个溢出中断, 它对应的寄存器叫TIM1 RCR. 如果这个值不配置,上电的时候寄存器值可是随机的,本来1秒中断一次,可能变成N秒中断一次,让你超级头大! 假设系统时钟是72Mhz,TIM1是由PCLK2(72MHz)得到,TIM2-7是由PCLK1得到 关键是设定时钟预分频数,自动重装载寄存器周期的值 定时器的基本设置 1、 TIM_TimeBaseStructure.TIM_Prescaler = 7199;//时钟预分频数 例如:时 钟频率=72/(时钟预分频+1) 2、TIM_TimeBaseStructure.TIM_Period = 9999; //自动重装载寄存器周期的值(定时 时间) 累计0xFFFF个频率后产生个更新或者中断(也是说定时时间到) 3、 TIM_TimeBaseStructure.TIM_CounterMode = TIM1_CounterMode_Up; //定时器 模式 向上计数 4、TIM_TimeBaseStructure.TIM_ClockDivision = 0x0; //时间分割值 5、TIM_TimeBaseInit(TIM2, TIM_TimeBaseStructure);//初始化定时器2 6、TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); //打开中断 溢出中断 7、TIM_Cmd(TIM2, ENABLE);//打开定时器 或者: TIM_TimeBaseStructure.TIM_Prescaler = 35999;//分频35999 72M/ (35999+1)/2=1Hz 1秒中断溢出一次 TIM_TimeBaseStructure.TIM_Period = 2000; //计数值2000 ((1+TIM_Prescaler )/72M)*(1+TIM_Period )=((1+35999)/72M)*(1+2000)=1秒*/ STM32通用定时器的基本定时器功能实现灯闪烁 #include "stm32f10x.h" #include "misc.h" void RCC_Configuration(void); void NVIC_Configuration(void); void GPIO_Configuration(void); void TIM3_Configuration(void); int main(void) { RCC_Configuration(); NVIC_Configuration(); GPIO_Configuration(); TIM3_Configuration(); TIM_ClearFlag(TIM3, TIM_FLAG_Update); TIM_ARRPreloadConfig(TIM3, DISABLE); TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE); TIM_Cmd(TIM3, ENABLE); while (1) { ; } } void TIM3_Configuration(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_TimeBaseStructure.TIM_Period = 9999; TIM_TimeBaseStructure.TIM_Prescaler = 7199; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM3, TIM_TimeBaseStructure); } void RCC_Configuration(void) { SystemInit(); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); } void NVIC_Configuration(void) { NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPrio rity = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(NVIC_InitStructure); } void GPIO_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC, GPIO_InitStructure); } #include "stm32f10x_it.h" void TIM3_IRQHandler(void) { if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) { TIM_ClearITPendingBit(TIM3, TIM_IT_Update); GPIO_WriteBit(GPIOC, GPIO_Pin_7, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_7))); } }
个人分类: STM32F4XX/1XX/2XX/3XX/stm8s|7099 次阅读|0 个评论
分享 MDKA5D3X-EK_T70开发板IAR EWARM裸机例程01:getting started(LED例子)
mcuzone1 2014-2-23 20:55
By Mcuzone 这个例子使开发板上的2个用户LED以固定的频率闪烁,闪烁频率由定时器产生,这2个LED的闪烁都可以用PC键盘上的按键‘1’和‘2’来控制其暂停或开始(需打开超级终端等串口调试工具)。 硬件平台:MDKA5D3X-EK_T70开发板 开发板所带操作系统:linux 3.6.9 裸机程序编译工具:IAR Embedded Workbench for ARM 6.60 裸机程序调试工具:J-LINK 重要提示: 1、在仿真调试开发板裸机程序之前,开发板需要先烧写linux系统(linux系统的烧写请参考开发板文档)。 2、在开发板烧写有linux系统的情况下,将开发板调试串口与PC连接好,打开PC端的超级终端(或其他串口调试工具),使其连接上开发板的调试串口,然后将开发板上电,连续按下PC端键盘的空格键,使开发板停在U-Boot下,超级终端输出如下图所示: 如无其他说明,超级终端默认设置为:115200, 8,N,1 。如下图所示: 当开发板停在U-Boot下后,就可以仿真调试裸机程序了。 关于IAR EWARM裸机程序的编译和下载调试方法可以参考开发板文档:MAN3050A_CH_IAR_MDKA5D3x-EK。 本裸机程序运行后,调试串口输出信息如下图所示: 程序运行后,可以看到开发板上的2个用户LED不停的闪烁,就可以使用PC端键盘上的按键‘1’和‘2’来控制其闪烁的停止与开始。
个人分类: A5D3示例|195 次阅读|0 个评论

Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2019-10-19 12:07 , Processed in 0.059428 second(s), 19 queries , Gzip On, MemCache On.

Powered by EEWORLD电子工程世界

© 2019 http://bbs.eeworld.com.cn/

返回顶部