目录:
1.程序:定时器2中断配置、高精度延时函数和LED灯初始化
2.基础知识:
一、程序:
#include #include "timer.h" #include "led.h" //unsigned int ms_count=0;//毫秒计数 //定时器2初始化 void InitTIM2() { TIM2_PSCR=0x00;//1分频,定时器时钟等于系统时钟=16m TIM2_ARRH=0X3e;//一定要先装高八位,再装低八位 TIM2_ARRL=0X80;//1ms重装值16000,这是个坑,技术手册里说tim2是向上计数,其实是向下计数的 TIM2_CNTRH=0x00; TIM2_CNTRL=0x00;//有必要清除下计数器 TIM2_IER=0X01;//使能tim2更新中断 TIM2_SR1=0X01;//清除tim2更新中断标志 TIM2_CR1=0X81;//允许重装,使能定时器 } #pragma vector=0xF //设置定时器2重载的中断向量号 = 0xF,这个是中断的格式,直接调用就好 __interrupt void TIM2_UPD_OVF_BRK_IRQHandler(void) { TIM2_SR1=0x00; ms_count++; if(ms_count>=1|ms_count<=600) { PB4_out = 0; /* PD0引脚输出0 */ PB5_out = 1; } if(ms_count>=600)//1ms*1000=1s { PB4_out = 1; /* PD0引脚输出0 */ PB5_out = 0; } if(ms_count>=1200) {ms_count=0;} } int main(void) { CLK_CKDIVR=0x00;/*设置时钟为内部16M高速时钟*/ asm("sim");//关闭总中断 InitTIM2();//定时器2初始化 LED_conf();//LED初始化 asm("rim");//开启总中断 __enable_interrupt(); while(1) { // LED_Display_Bit(); } } /*LED灯初始化*/ void LED_conf(void) { //PB5、PB4 PB_DDR|=0x30; /* 设置数据方向寄存器 1为输出,0为输入--查看STM8寄存器.pdf P87 */ PB_CR1|=0x30; /* 设置推挽输出--查看STM8寄存器.pdf P88 */ PB_CR2|=0x00; /* 设置输出频率 1为10M,0为2M--查看STM8寄存器.pdf P89 */ } void LED_Display_Bit() { PB4_out = 0; /* PD0引脚输出0 */ PB5_out = 1; Delayms(500); PB4_out = 1; /* PD0引脚输出1 */ PB5_out = 0; Delayms(500); } /*延时函数 */ #include #include "timer.h" void ClkInit(void) { CLK_ECKR |=0x1; //开启外部时钟 while(!(CLK_ECKR&0x2)); //等待外部时钟rdy CLK_CKDIVR &= 0xF8; //CPU无分频 16M CLK_SWR = 0xB4; //选择外部时钟 while(!(CLK_SWCR&0x8)); CLK_SWCR |=0x2; //使能外部时钟 } //--- 微秒级延时-------------------------- void Delayus(void) { asm("nop"); //一个asm("nop")函数经过示波器测试代表100ns asm("nop"); asm("nop"); asm("nop"); } //---- 毫秒级延时程序----------------------- void Delayms(unsigned int time) { unsigned int i; while(time--) for(i=900;i>0;i--) Delayus(); } 二、基础知识: 1.定时器2介绍: 通用定时器TIM2,TIM3,TIM5 ;通用定时器可以选择16种分频,定时器都是向下计数。 2.基本中断定时用到的寄存器如下; (1)、自动装载寄存器高位(TIMx_ARRH) 和 自动装载寄存器低位(TIMx_ARRL) 通用定时器TIM2,TIM3,TIM5都是16位计数的定时器,操作寄存器的时候要先写高8位再写低8位。操作重装载寄存器的时候更新的值不会马上写入重装载寄存器,而是等到有中断产生的时候操作的数值才会写入寄存器,当然也可以用软件的方法产生中断。 (2)、计数器高位(TIMx_CNTRH) 和计数器低位(TIMx_CNTRL) 通用定时器TIM2,TIM3,TIM5会用到这两个计数器。 (3)、中断使能寄存器(TIMx_IER) 地址偏移值:0x04 复位值:0x00 7-0: BIE TIE COMIE CC4IE CC3IE CC2IE CC1IE UIE 位7 BIE:允许刹车中断 0:禁止刹车中断; 1:允许刹车中断。 位6 TIE:触发中断使能 0:禁止触发中断; 1:使能触发中断。 位5 COMIE:允许COM中断 0:禁止COM中断; 1:允许COM中断。 位4 CC4IE:允许捕获/比较4中断 0:禁止捕获/比较4中断; 1:允许捕获/比较4中断。 位3 CC3IE:允许捕获/比较3中断 0:禁止捕获/比较3中断; 1:允许捕获/比较3中断。 位2 CC2IE:允许捕获/比较2中断 0:禁止捕获/比较2中断; 1:允许捕获/比较2中断。 位1 CC1IE:允许捕获/比较1中断 0:禁止捕获/比较1中断; 1:允许捕获/比较1中断。 位0 UIE:允许更新中断 0:禁止更新中断; 1:允许更新中断。 (4)、状态寄存器 1(TIMx_SR1) 地址偏移值:0x05 复位值:0x00 7-0: BIF TIF COMIF CC4IF CC3IF CC2IF CC1IF UIF 位7 BIF:刹车中断标记 一旦刹车输入有效,由硬件对该位置1。如果刹车输入无效,则该位可由软件清0。 0:无刹车事件产生; 1:刹车输入上检测到有效电平。 位6 TIF:触发器中断标记 当发生触发事件(当从模式控制器处于除门控模式外的其它模式时,在TRGI输入端检测到有效边沿,或门控模式下的任一边沿)时由硬件对该位置1。它由软件清0。 0:无触发器事件产生; 1:触发中断等待响应。 位5 COMIF:COM中断标记 一旦产生COM事件(当捕获/比较控制位:CCiE、CCiNE、OCiM已被更新)该位由硬件置1。它 由软件清0。 0:无COM事件产生; 1:COM中断等待响应。 位4 CC4IF:捕获/比较4中断标记 参考CC1IF描述。 位3 CC3IF:捕获/比较3中断标记 参考CC1IF描述。 位2 CC2IF:捕获/比较2中断标记 参考CC1IF描述。 位1 CC1IF:捕获/比较1中断标记 如果通道CC1配置为输出模式: 当计数器值与比较值匹配时该位由硬件置1,但在中心对称模式下除外(参考TIM1_CR1寄存器的CMS位)。它由软件清0。 0:无匹配发生; 1:TIMx_CNT的值与TIMx_CCR1的值匹配。 注:在中心对称模式下,当计数器值为0时,向上计数,当计数器值为ARR时,向下计数(它从0向上计数到ARR-1,再由ARR向下计数到1)。因此,对所有的SMS位值,这两个值都不置标记。但是,如果CCR1>ARR,则当CNT达到ARR值时,CC1IF置1 如果通道CC1配置为输入模式: 当捕获事件发生时该位由硬件置1,它由软件清0或通过读TIM1_CCR1L清0。 0:无输入捕获产生; 1:计数器值已被捕获(拷贝)至TIM1_CCR1(在IC1上检测到与所选极性相同的边沿)。 位0 UIF:更新中断标记 当产生更新事件时该位由硬件置1。它由软件清0。 0:无更新事件产生; 1:更新事件等待响应。当寄存器被更新时该位由硬件置1: − 若TIM1_CR1寄存器的UDIS=0,当计数器上溢或下溢时; − 若TIM1_CR1寄存器的UDIS=0、URS=0,当设置TIM1_EGR寄存器的UG位软件对计数器 CNT重新初始化时; − 若TIM1_CR1寄存器的UDIS=0、URS=0,当计数器CNT被触发事件重新初始化时 (参考0 从模式控制寄存器TIM1_SMCR)。 (5)、控制寄存器 1(TIMx_CR1) 地址偏移值:0x00 复位值:0x00 7-0: ARPE CMS[1:0] DIR OPM URS UDIS CEN 位7 ARPE:自动预装载允许位 0:TIM1_ARR寄存器没有缓冲,它可以被直接写入; 1:TIM1_ARR寄存器由预装载缓冲器缓冲。 位6:5 CMS:选择中央对齐模式 00:边沿对齐模式。计数器依据方向位(DIR)向上或向下计数。 01:中央对齐模式1。计数器交替地向上和向下计数。配置为输出的通道(TIM1_CCMRx寄存器中CCiS=00)的输出比较中断标志位,只在计数器向下计数时被置1 10:中央对齐模式2。计数器交替地向上和向下计数。配置为输出的通道(TIM1_CCMRx寄存器中CCiS=00)的输出比较中断标志位,只在计数器向上计数时被置1。 11:中央对齐模式3。计数器交替地向上和向下计数。配置为输出的通道(TIM1_CCMRx寄存器中CCiS=00)的输出比较中断标志位,在计数器向上和向下计数时均被置1。 注1:在计数器开启时(CEN=1),不允许从边沿对齐模式转换到中央对齐模式。 注2:在中央对齐模式下,编码器模式( GPT_SMCR寄存器中的SMS=001,010,011)必须 被禁止。 位4 DIR:方向 0:计数器向上计数; 1:计数器向下计数。 注:当计数器配置为中央对齐模式或编码器模式时,该位为只读。 位3 OPM:单脉冲模式 0:在发生更新事件时,计数器不停止; 1:在发生下一次更新事件(清除CEN位)时,计数器停止。 位2 URS:更新请求源 0:如果UDIS允许产生更新事件,则下述任一事件产生一个更新中断: − 寄存器被更新(计数器上溢/下溢) − 软件设置UG位 − 时钟/触发控制器产生的更新 1:如果UDIS允许产生更新事件,则只有当下列事件发生时才产生更新中断,并UIF置1: − 寄存器被更新(计数器上溢/下溢) 位1 UDIS:禁止更新 0:一旦下列事件发生,产生更新(UEV)事件: − 计数器溢出/下溢 − 产生软件更新事件 − 时钟/触发模式控制器产生的硬件复位 被缓存的寄存器被装入它们的预装载值。 1:不产生更新事件,影子寄存器(ARR、PSC、CCRx)保持它们的值。如果设置了UG位或时 钟/触发控制器发出了一个硬件复位,则计数器和预分频器被重新初始化。 位0 CEN:允许计数器 0:禁止计数器; 1:使能计数器。 注:在软件设置了CEN位后,外部时钟、门控模式和编码器模式才能工作。然而触发模式可以 自动地通过硬件设置CEN位。 (6)、TIMX_PSCR预分频寄存器 位7:0 PSC[15:7]:预分频器的高8位值 PSC[7:0]:预分频器的低8位值 预分频器用于对CK_PSC进行分频。 计数器的时钟频率(fCK_CNT)等于fCK_PSC/( PSCR[15:0]+1)。 PSCR包含了当更新事件产生时装入当前预分频器寄存器的值(更新事件包括计数器被 TIM_EGR的UG位清0或被工作在复位模式的从控制器清0)。这意味着为了使新的值起作用,必须产生一个更新事件。
上一篇:STM8SF903K3T6定时器1输入捕获
下一篇:STM8S:Debug调试正常,烧录程序运行不正常
推荐阅读最新更新时间:2024-11-03 17:18
设计资源 培训 开发板 精华推荐
- 【物联网】基于鸿蒙系统的WIFI开关设计
- LR8 高输入电压、可调线性稳压器的典型应用
- MPC574XG-MB: 面向MPC574xB/C/G系列的评估系统
- TS1935B 1.9A / 1.2MHz Boost DC-DC转换器的典型应用
- LT1172HVCT、5V/1.25A 升压转换器的典型应用
- 【物联网】鸿蒙物联网智能WIFI开关+1606634A
- #征集令#立创·梁山派-LoRa通信扩展板
- FPC Design
- STEVAL-ISQ014V1,基于 TSZ121 运算放大器的低侧电流检测评估板
- STR-PWRNCV330-R0-GEVK:具有软启动功能的汽车 Strata 受控负载开关