STM8S 定时器的使用
来源:互联网 发布:泉州猴子网络seo 编辑:程序博客网 时间:2024/05/23 01:39
看了网上的资源,都不怎么好用,于是决定总结总结,记录下定时器的简单实用方法。
环境: STM8SF103 ,仿真器为:STLINK
TIM4 属于8位定时器,最大128分频。
这个定时器的时钟源是系统时钟源(fMaster),然后直接通过预分频器分频后供CK_CNT使用。如:系统频率为4MHz,经过128分频后,提供给定时器使用的频率就为 31250Hz
因为项目需要,我这里使用的内部RC 16MHz振荡器,并进行LSI 4分频,所以主频为4MHz。
//main.cvoid Init_Tim4(void){ /*很多人都是在这里装填0xFF,其实是为了让PSC尽快生效,对于PSC的设置,需要在下一个更新事件时才会生效*/ TIM4_CNTR=0; //计数器值TIM4_ARR=0xFA; //自动重装寄存器 250,产生125次定时1STIM4_PSCR=0x07; //预分频系数为128TIM4_EGR=0x01; //手动产生一个更新事件,用于PSC生效 注意,是手动更新TIM4_IER=0x01; //更新事件中断 使能TIM4_CR1=0x01; //使能计时器,TIM4_CR0停止计时器}void main(void){ _asm("rim"); //这是必须的,因为系统重启后,软件中断级别为3级,处于最高级,除了TRAP,TLI,RESET三个中断外不响应其他中断。 //rim将软件级别更改为0级别,这样其他中断就能得到相应。 Init_Tim4(); while(1);}//中断向量表必须将TIM4的中断处理函数填写进去 {0x82, TIM4_UPD_OVF_IRQHandler}, /* irq23 *///处理函数如下:/*定时器4用作看门狗喂狗定时,因为看门狗最大延时510ms,定时器频率为4MHz/128=31250 = 250 * 125,125 / 5 = 25 (200ms)*/@far @interrupt void TIM4_UPD_OVF_IRQHandler(void){ t4++; TIM4_SR=0; //清除中断标志 //t4==125 //定时1S if(t4==25) //25 * 250 定时200ms { FREE_IWDG; //喂狗,如果单纯定时用,可以拿掉 //可以尝试点亮LED灯 t4=0; } return;}
定时器延时计算过程,如主频4MHz,预分频为128,定时器频率等于 4000000 / 128 = 31250 (Hz),周期为32us。4分频时周期为1us。
如:主频8MHz,预分频为128,定时器频率等于 8000000 / 128 = 62500 (Hz),周期为16us。
整个代码没有使用库函数,诸如TIM4_SR TIM4_CR1之类的定义在stm8s103k.h,其他的头也可以。
定时器2 (16位计时器) 的简单实用与此类似,但需要注意设置初值的方法,如:
void Init_Tim2(void){TIM2_EGR=0x01; //手动产生更新事件,重新初始化计数器,并允许产生一个更新事件//设置定时器初值TIM2_CNTRH=0; //不能使用TIM2_CNTR直接设值,TIM2_CNTRL=0; //设定自动重装寄存器值//这里得注意不能使用TIM2_ARR的方式进行设值,TIM2是十六位的。//如TIM2_ARR=0xFA,实际上是赋给高字节了,TIM2_ARRH=0xFA,而不是想象中的赋给低字节。TIM2_ARRH=0x7A; //31250 4MHz / 128 = 31250Hz (1S)TIM2_ARRL=0x12; //0x7A12 31250 意味着每产生一次中断时间为1STIM2_PSCR=0x07; //分频128TIM2_IER=0x01; //中断允许位使能TIM2_CR1=0x01; //使能计时器}
整个使用需要注意几点:
第一、总中断的开启 _asm("rim")
第二、中断向量表对应位置的中断处理过程改写
第三、定时器自身的使能,包括中断使能和计时器使能
第四、默认情况下,TIM4的外设时钟是开启的,CLK_PCKENR为0xFF,外设TIM4时钟如果关闭,时钟是运行不起来的。
- STM8S 定时器的使用
- STM8S 定时器的使用
- STM8S 定时器的使用
- STM8S 定时器的使用
- 【STM8S】STM8S之定时器1的精确延时
- 记录使用stm8s的一些问题
- stm8s电机库vtimer_SetTimer()函数的使用
- STM8S定时器基本中断定时
- STM8S通过官方LIB使用定时器1从CH4输出PWM到
- STM8S---TIM2产生PWM与TIM1定时器周期中断的时钟问题
- STM8s使用中遇到的死机问题的排除
- STM8S---定时器产生PWM(TIM2)
- STM8S定时器溢出及重装载理解
- stm8s开发(二) GPIO的使用:点亮LED!
- stm8s开发(三) UART的使用:串口通信!
- stm8s开发(四) CLOCK的使用:时钟控制!
- stm8s开发(五) TIMER的使用:定时!
- stm8s开发(七) SPI的使用:SPI主机通信!
- FDN的使用
- Crashlytics告诉你iOS应用为何崩溃
- C++之<<每天一点点>>
- javascript动态操作表格:新增、设置样式、删除、移动行
- 新手建站必知的七条SEO避忌知识
- STM8S 定时器的使用
- GridView无代码分页排序的实现
- GridView选中,编辑,取消,删除
- (中级)系统集成项目管理工程师常用英语汇总
- 坚持做到几点
- 二项堆
- android多点触控
- Android NDK 开发的栈错误调试
- 好程序需要至少写两遍