首先,我们要先向工程文件Driver中添加STC32G_Timer.c,STC32G_Timer_Isr.c和STC32G_NVIC.c这三个文件,其中STC32G_Timer.c中定义了定时器初始化函数Timer_Inilize();STC32G_NVIC.c文件中定义了定时器中断初始化的相关函数NVIC_Timer0_Init();STC32G_Timer_Isr.c文件中定义了各种的中断函数,我们主要将想要实现的操作写进它给的对应的函数中就行。

初始化定时器0(其他的定时器初始化操作也已经写出,删掉注释就可使用),EA=1是开总开关操作,可添加到主函数中:

//========================================================================
//                               定时器配置
//========================================================================
void    Timer_config(void)
{TIM_InitTypeDef        TIM_InitStructure;                      //结构定义TIM_InitStructure.TIM_Mode      = TIM_16BitAutoReload;   //指定工作模式,   TIM_16BitAutoReload,TIM_16Bit,TIM_8BitAutoReload,TIM_16BitAutoReloadNoMaskTIM_InitStructure.TIM_ClkSource = TIM_CLOCK_1T;      //指定时钟源,     TIM_CLOCK_1T,TIM_CLOCK_12T,TIM_CLOCK_ExtTIM_InitStructure.TIM_ClkOut    = DISABLE;                //是否输出高速脉冲, ENABLE或DISABLETIM_InitStructure.TIM_Value     = (u16)(65536UL - (MAIN_Fosc / 1000UL));     //中断频率, 1000次/秒TIM_InitStructure.TIM_Run       = ENABLE;                   //是否初始化后启动定时器, ENABLE或DISABLETimer_Inilize(Timer0,&TIM_InitStructure);                  //初始化Timer0   Timer0,Timer1,Timer2,Timer3,Timer4NVIC_Timer0_Init(ENABLE,Priority_0);        //中断使能, ENABLE/DISABLE; 优先级(低到高) Priority_0,Priority_1,Priority_2,Priority_3EA = 1;//  //定时器1做16位自动重装, 中断频率为20000HZ,中断函数从P6.6取反输出10KHZ方波信号.
//  TIM_InitStructure.TIM_Mode      = TIM_16BitAutoReload; //指定工作模式,   TIM_16BitAutoReload,TIM_16Bit,TIM_8BitAutoReload,TIM_16BitAutoReloadNoMask
//  TIM_InitStructure.TIM_ClkSource = TIM_CLOCK_1T;        //指定时钟源, TIM_CLOCK_1T,TIM_CLOCK_12T,TIM_CLOCK_Ext
//  TIM_InitStructure.TIM_ClkOut    = DISABLE;             //是否输出高速脉冲, ENABLE或DISABLE
//  TIM_InitStructure.TIM_Value     = 65536UL - (MAIN_Fosc / 20000);           //中断频率, 20000次/秒
//  TIM_InitStructure.TIM_Run       = ENABLE;                  //是否初始化后启动定时器, ENABLE或DISABLE
//  Timer_Inilize(Timer1,&TIM_InitStructure);                   //初始化Timer1   Timer0,Timer1,Timer2,Timer3,Timer4
//  NVIC_Timer1_Init(ENABLE,Priority_0);        //中断使能, ENABLE/DISABLE; 优先级(低到高) Priority_0,Priority_1,Priority_2,Priority_3//  //定时器2做16位自动重装, 中断频率为10000HZ,中断函数从P6.5取反输出5KHZ方波信号.
//  TIM_InitStructure.TIM_ClkSource = TIM_CLOCK_1T;        //指定时钟源,     TIM_CLOCK_1T,TIM_CLOCK_12T,TIM_CLOCK_Ext
//  TIM_InitStructure.TIM_ClkOut    = DISABLE;             //是否输出高速脉冲, ENABLE或DISABLE
//  TIM_InitStructure.TIM_Value     = 65536UL - (MAIN_Fosc / 10000);               //初值
//  TIM_InitStructure.TIM_Run       = ENABLE;                  //是否初始化后启动定时器, ENABLE或DISABLE
//  Timer_Inilize(Timer2,&TIM_InitStructure);                   //初始化Timer2   Timer0,Timer1,Timer2,Timer3,Timer4
//  NVIC_Timer2_Init(ENABLE,NULL);      //中断使能, ENABLE/DISABLE; 无优先级//  //定时器3做16位自动重装, 中断频率为100HZ,中断函数从P6.4取反输出50HZ方波信号.
//  TIM_InitStructure.TIM_ClkSource = TIM_CLOCK_12T;   //指定时钟源,     TIM_CLOCK_1T,TIM_CLOCK_12T,TIM_CLOCK_Ext
//  TIM_InitStructure.TIM_ClkOut    = ENABLE;                  //是否输出高速脉冲, ENABLE或DISABLE
//  TIM_InitStructure.TIM_Value     = 65536UL - (MAIN_Fosc / (100*12));        //初值
//  TIM_InitStructure.TIM_Run       = ENABLE;                  //是否初始化后启动定时器, ENABLE或DISABLE
//  Timer_Inilize(Timer3,&TIM_InitStructure);                   //初始化Timer3   Timer0,Timer1,Timer2,Timer3,Timer4
//  NVIC_Timer3_Init(ENABLE,NULL);      //中断使能, ENABLE/DISABLE; 无优先级//  //定时器4做16位自动重装, 中断频率为50HZ,中断函数从P6.3取反输出25HZ方波信号.
//  TIM_InitStructure.TIM_ClkSource = TIM_CLOCK_12T;   //指定时钟源,     TIM_CLOCK_1T,TIM_CLOCK_12T,TIM_CLOCK_Ext
//  TIM_InitStructure.TIM_ClkOut    = ENABLE;                  //是否输出高速脉冲, ENABLE或DISABLE
//  TIM_InitStructure.TIM_Value     = 65536UL - (MAIN_Fosc / (50*12));     //初值
//  TIM_InitStructure.TIM_Run       = ENABLE;                  //是否初始化后启动定时器, ENABLE或DISABLE
//  Timer_Inilize(Timer4,&TIM_InitStructure);                   //初始化Timer4   Timer0,Timer1,Timer2,Timer3,Timer4
//  NVIC_Timer4_Init(ENABLE,NULL);      //中断使能, ENABLE/DISABLE; 无优先级
}

以下是STC32G_Timer_Isr.c文件定时器0的中断调用函数,我的操作是实现led灯的亮灭,led灯接在P10上。

//========================================================================
// 函数: Timer0_ISR_Handler
// 描述: Timer0中断函数.
// 参数: none.
// 返回: none.
// 版本: V1.0, 2020-09-23
//========================================================================
void Timer0_ISR_Handler (void) interrupt TMR0_VECTOR        //进中断时已经清除标志
{tt++;if(tt>=1000){P10=~P10;tt=0;}
}

除此之外,我们在开发过程中有时也会需要停止定时器,库函数也为我们提供了相应的宏定义可以直接调用:

//========================================================================
//                             定时器0设置
//========================================================================/* 0,1: 定时器0用做定时器, 12T/1T; 2: 定时器0用做计数器   */
#define     Timer0_CLK_Select(n)    do{if(n == 0) T0x12 = 0, T0_CT = 0; \if(n == 1) T0x12 = 1, T0_CT = 0; \if(n == 2) T0_CT = 1; \}while(0)#define       Timer0_CLK_Output(n)    T0CLKO = n /* T0 溢出脉冲在T0脚输出使能 */
#define     Timer0_Run(n)                   (n==0?(TR0 = 0):(TR0 = 1))              /* 定时器0计数使能 */
#define     Timer0_Stop()                   TR0 = 0                /* 禁止定时器0计数 */
#define     T0_Load(n)                      TH0 = (n) / 256,   TL0 = (n) % 256//========================================================================
//                             定时器1设置
//========================================================================/* 0,1: 定时器1用做定时器, 12T/1T; 2: 定时器1用做计数器   */
#define     Timer1_CLK_Select(n)    do{if(n == 0) T1x12 = 0, T1_CT = 0; \if(n == 1) T1x12 = 1, T1_CT = 0; \if(n == 2) T1_CT = 1; \}while(0)#define       Timer1_CLK_Output(n)    T1CLKO = n /* T1 溢出脉冲在T1脚输出使能 */
#define     Timer1_Run(n)                   (n==0?(TR1 = 0):(TR1 = 1))              /* 定时器1计数使能 */
#define     Timer1_Stop()                   TR1 = 0                /* 禁止定时器1计数 */
#define     T1_Load(n)                      TH1 = (n) / 256,   TL1 = (n) % 256//========================================================================
//                             定时器2设置
//========================================================================/* 0,1: 定时器2用做定时器, 12T/1T; 2: 定时器2用做计数器   */
#define     Timer2_CLK_Select(n)    do{if(n == 0) T2x12 = 0, T2_CT = 0; \if(n == 1) T2x12 = 1, T2_CT = 0; \if(n == 2) T2_CT = 1; \}while(0)#define       Timer2_CLK_Output(n)    T2CLKO = n /* T2 溢出脉冲在T2脚输出使能 */
#define     Timer2_Run(n)                   (n==0?(T2R = 0):(T2R = 1))      /* 定时器2计数使能 */
#define     Timer2_Stop()                   T2R = 0        /* 禁止定时器2计数 */
#define     T2_Load(n)                      T2H = (n) / 256,   T2L = (n) % 256//========================================================================
//                             定时器3设置
//========================================================================/* 0,1: 定时器3用做定时器, 12T/1T; 2: 定时器3用做计数器   */
#define     Timer3_CLK_Select(n)    do{if(n == 0) T3x12 = 0, T3_CT = 0; \if(n == 1) T3x12 = 1, T3_CT = 0; \if(n == 2) T3_CT = 1; \}while(0)#define       Timer3_CLK_Output(n)    T3CLKO = n             /* T3 溢出脉冲在T3脚输出使能 */
#define     Timer3_Run(n)                   (n==0?(T3R = 0):(T3R = 1))  /* 定时器3计数使能 */
#define     Timer3_Stop()                   T3R = 0    /* 禁止定时器3计数 */
#define     T3_Load(n)                      T3H = (n) / 256,   T3L = (n) % 256//========================================================================
//                             定时器4设置
//========================================================================/* 0,1: 定时器4用做定时器, 12T/1T; 2: 定时器4用做计数器   */
#define     Timer4_CLK_Select(n)    do{if(n == 0) T4x12 = 0, T4_CT = 0; \if(n == 1) T4x12 = 1, T4_CT = 0; \if(n == 2) T4_CT = 1; \}while(0)#define       Timer4_CLK_Output(n)    T4CLKO = n /* T4 溢出脉冲在T4脚输出使能 */
#define     Timer4_Run(n)                   (n==0?(T4R = 0):(T4R = 1))  /* 定时器4计数使能 */
#define     Timer4_Stop()                   T4R = 0    /* 禁止定时器4计数 */
#define     T4_Load(n)                      T4H = (n) / 256,   T4L = (n) % 256

以定时器0为例子,我们可以用Timer0_Run(0)或者Timer0_Stop()让定时器0停止计数,调用Timer0_Run(1)重新开始计数。相同的,关闭和开启中断也是一样的:

//========================================================================
//                              定时器中断设置
//========================================================================#define   Timer0_Interrupt(n)     (n==0?(ET0 = 0):(ET0 = 1))              /* Timer0中断使能 */
#define     Timer1_Interrupt(n)     (n==0?(ET1 = 0):(ET1 = 1))              /* Timer1中断使能 */
#define     Timer2_Interrupt(n)     (n==0?(ET2 = 0):(ET2 = 1))              /* Timer2中断使能 */
#define     Timer3_Interrupt(n)     (n==0?(ET3 = 0):(ET3 = 1))              /* Timer3中断使能 */
#define     Timer4_Interrupt(n)     (n==0?(ET4 = 0):(ET4 = 1))              /* Timer4中断使能 */

因为这次的程序比较简单,例程就不放在资源了

stc32G库函数(二)——定时器相关推荐

  1. 【SDL】SDL学习笔记二 定时器

    定时器相关API(SDL_timer.h):   1. Uint32 SDL_GetTicks(): 获取从SDL库初始化(定时器模块初始化)开始到当前的运行时间(ms);   2. Uint64 S ...

  2. STM32通用定时器(原理、结构体、库函数、定时器中断每秒闪烁一次灯) —— 时钟源、分频值、重装载值

    参考:stm32定时器与定时器中断 作者:打酱油的 发布时间: 2021-04-11 01:04:09 网址:https://blog.csdn.net/weixin_46098612/article ...

  3. STC32G库函数(五)——ADC检测反推电源电压

    首先先看一下STC32G系列单片机内部的ADC功能 STC32G系列的单片机有15条ADC测量通道,同时ADC_VRef+为外部电压参考电源,所以利用ADC测量电源电压有两种方案.第一是先利用稳压电源 ...

  4. stm8s 定时器1 延时_STM8S_库函数_定时器自动装载TIM1

    大家好,我是单片机爱好者-MCU起航.这里说下使用库函数方式控制STM8S103F3P6片上的定时器1,也就是TIM1,这是个高级定时器. 首先,咱们看一下STM8S103F3P6上有几个定时器,打开 ...

  5. php常用库函数(二)

    http://www.cnblogs.com/dreamhome/archive/2011/05/04/2037011.html <?php //======================== ...

  6. STM32 CubeMx(二)定时器中断和PWM呼吸灯

    STM32 CubeMx(一)时钟树配置与GPIO输入输出 文章目录 1.定时器 1.1 定时器概念 1.2 定时器分类 1.3 定时器功能 1.4 配置过程和编写代码 1.5 代码分享 2.PWM产 ...

  7. 定时器计数器实验C语言程序,实验二 单片机定时器和计数器编程

    仲恺农业工程学院实验报告纸 信息学院 (院.系)专业班组单片机原理及接口技术课实验二单片机定时器/计数器编程 一.实验目的 1.掌握单片机定时器/计数器的工作方式: 2.掌握单片机定时器/计数器的编程 ...

  8. STM32入门笔记(02):定时器之定时器中断、输入捕获和PWM输出(SPL库函数版)

    目录 定时器 8个定时器 定时器功能 定时器中断 常用通用定时器的寄存器 定时器中断实验目的: 定时器库函数及步骤 实验程序讲解 PWM 简介 STM32 PWM工作过程 PWM模式1 与 PWM模式 ...

  9. STM32F103mini教程通用定时器

    一.通用定时器的基本原理 1.三种STM32定时器区别 2.通用定时器功能特点描述 (1)STM32 的通用 TIMx (TIM2.TIM3.TIM4 和 TIM5)定时器功能特点包括: ①位于低速的 ...

最新文章

  1. springAOP的设计和实现(一)
  2. linux安装部署apache+subversion+jsvnadmin
  3. 币氪共识指数排行榜0910
  4. flume流程之http-memory-hdfs
  5. 常见RFID卡片介绍、破解思路 及 Proxmark3简介
  6. 西门子STEP7、博图里的数据块(DB)编址规则
  7. libiconv android编译,NDK编译经常使用开源库-libiconv
  8. 技术分析:细说3D投影机技术原理
  9. iView admin网站后台管理系统模板v2.5.0
  10. 华为m2青春版android7,7吋巨屏跨界之作 华为揽阅M2青春版评测
  11. 大数据技术技能分析大赛——第一章 python数据分析概述
  12. 嵌入式Linux热点分享网络(四)
  13. 国际多币种移动平台:换汇+支付(Wise/Revolut)
  14. 中国传媒大学计算机与网络安全,黄玮 - 中国传媒大学 - 计算机与网络空间安全学院...
  15. word破解文档保护
  16. 树莓派之DHT11传感器
  17. JAVA基础6.51——多态的概述(1)
  18. java中... 用法
  19. 网站多次切换服务器ip,站群多ip服务器怎么切换ip?
  20. AI聊天机器人接口制作php,使用图灵api创建微信聊天机器人_php技巧

热门文章

  1. 完全背包问题(师从yxc,闫氏Dp)
  2. python Exception happened during processing of request from( 127.0.0.1 xxx) error [10053]
  3. html轮播鼠标悬停效果,jQuery图片轮播加悬停效果
  4. 打卡赠书 | 养成一个思考习惯
  5. 一顿操作猛如虎,细说MySQL索引的区别
  6. iic的SDA引脚偶尔有毛刺(尖峰)是怎么回事。
  7. BUUCTF web(三)
  8. 批量识别PDF/OFD/PNG/JPG电子发票到EXCEL
  9. 有效学习的6个方法学习方法
  10. GSM Channel Mode Modify和Channel Mode Modify Acknowledge信令