【MT32F006】MT32F006之Timer定时

本文最后修改时间:2026年09月10日

一、本节简介

本文介绍如何使用MT32F006的定时器,例如定时1小时。

二、实验平台

库版本:V1.0.0

编译软件:MDK5.37

硬件平台:MT32F006开发板(主芯片MT32F006)

仿真器:JLINK

三、版权声明

1)作者:甜甜的大香瓜

2)声明:喝水不忘挖井人,转载请注明出处。

3)本文出处:原创连载资料《简单粗暴学MT32F006》

四、实验前提

1、在进行本文步骤前,请先阅读以下章节:

1)《简单粗暴学MT32F006》的"第一章和第二章"章节。

2、在进行本文步骤前,请先实现以下章节:

暂无

五、基础知识

暂无

六、硬件原理

暂无

七、实验步骤

1 、编写并添加驱动

1 )编写驱动GUA_Timer.c(存放在"......\Projects\MT006_StdPeriph_Templates\GUA")

|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| //********************************************************************** //name: GUA_Timer.c //introduce: 定时器驱动 //author: 甜甜的大香瓜 //email: 897503845@qq.com //shop: opengua.taobao.com //changetime: 2026.06.16 //********************************************************************** #include "mt006.h" #include "GUA_Timer.h" /*********************变量************************/ volatile GUA_U32 gGUA_Timer_Count = 0; //********************************************************************** //name: GUA_Timer_GetTick //introduce: 获取当前时间 //parameter: none //return: 返回值每1代表10ms //author: 甜甜的大香瓜 //email: 897503845@qq.com //shop: opengua.taobao.com //changetime: 2026.06.16 //********************************************************************** GUA_U32 GUA_Timer_GetTick(void) { return gGUA_Timer_Count; } //********************************************************************** //name: GUA_Timer_Config //introduce: 生成一个定时器 //parameter: Channel:Timer_Channel_0,Timer_Channel_1,Timer_Channel_2,Timer_Channel_3 // us:定时器时间,单位为微秒 1~us_max(这里可以走0xffff步,每步1us) //return: none //author: 甜甜的大香瓜 //email: 897503845@qq.com //shop: opengua.taobao.com //changetime: 2026.06.16 //********************************************************************** void GUA_Timer_Config(GUA_U32 Channel, GUA_U32 us) { TIMER_InitTypeDef TIMER_InitStructure; uint64_t temp, us_max = (uint64_t)0xFFFF * (uint64_t)(TIMER_GetPrescale() + 1) * (uint64_t)1000000 / (uint64_t)RCC_GetClocksFreq(RCC_CLOCKFREQ_SYSAHBCLK); //越界处理 if (us > us_max) us = (GUA_U32)us_max; TIMER_InitStructure.TIMER_Channel = Channel; //通道 TIMER_InitStructure.TIMER_Dir = TIMER_DIR_INCREASE; //向上计数 temp = (uint64_t)RCC_GetClocksFreq(RCC_CLOCKFREQ_SYSAHBCLK) * (uint64_t)us / (uint64_t)1000000; temp /= (uint64_t)(TIMER_GetPrescale() + 1); TIMER_InitStructure.TIMER_MatchValue = (uint16_t)(temp - 1); TIMER_InitStructure.TIMER_MatchAction = TIMER_MatchAction_HOLD; //TC与MR匹配时,输出管脚MAT电平不变 TIMER_InitStructure.TIMER_MatchConfig = TIMER_MatchConfig_RESET_TC; //TC与MR匹配时,复位TC TIMER_Init(&TIMER_InitStructure); //初始化 if (Channel == Timer_Channel_0) TIMER_ITConfig(TIMER_IT_MR0I, ENABLE); else if (Channel == Timer_Channel_1) TIMER_ITConfig(TIMER_IT_MR1I, ENABLE); else if (Channel == Timer_Channel_2) TIMER_ITConfig(TIMER_IT_MR2I, ENABLE); else //if (Channel == Timer_Channel_3) TIMER_ITConfig(TIMER_IT_MR3I, ENABLE); TIMER_Cmd(Channel, ENABLE); } //********************************************************************** //name: GUA_Timer_Init //introduce: 定时器初始化 //parameter: none //return: none //author: 甜甜的大香瓜 //email: 897503845@qq.com //shop: opengua.taobao.com //changetime: 2026.06.16 //********************************************************************** void GUA_Timer_Init(void) { //开TIMER的时钟 RCC_APBPeriphClockCmd(RCC_AHBCLKCTRL_TIMER0, ENABLE); //复位TIMER配置 TIMER_DeInit(); //预分频96-1是1Mhz(1us)、96000-1是1khz(1ms)、96000000-1是1hz(1s),但寄存器最多只有16位(65535) TIMER_SetPrescale(96 - 1); //开中断 NVIC_EnableIRQ(TIMER0_IRQn); } |

2 )编写驱动头文件GUA_ Timer.h

(存放在"......\Projects\MT006_StdPeriph_Templates\GUA")

|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| //********************************************************************** //name: GUA_Timer.h //introduce: 定时器驱动的头文件 //author: 甜甜的大香瓜 //email: 897503845@qq.com //shop: opengua.taobao.com //changetime: 2026.06.16 //********************************************************************** #ifndef GUA_TIMER_H #define GUA_TIMER_H /*********************宏定义************************/ //类型宏 #ifndef GUA_C typedef char GUA_C; #endif #ifndef GUA_U8 typedef unsigned char GUA_U8; #endif #ifndef GUA_8 typedef signed char GUA_8; #endif #ifndef GUA_U16 typedef unsigned short GUA_U16; #endif #ifndef GUA_16 typedef signed short GUA_16; #endif #ifndef GUA_U32 typedef unsigned long GUA_U32; #endif #ifndef GUA_32 typedef signed long GUA_32; #endif extern volatile GUA_U32 gGUA_Timer_Count; /*********************外部函数声明************************/ extern GUA_U32 GUA_Timer_GetTick(void); extern void GUA_Timer_Config(GUA_U32 Channel, GUA_U32 us); extern void GUA_Timer_Stop(GUA_U32 Channel); extern void GUA_Timer_Init(void); #endif |

3 )工程中添加驱动文件

4 )在MDK设置中添加驱动源文件路径

2 、添加库的驱动

1)添加库的驱动文件(为了方便一次性都添加进来,已有则不用添加)

2 )添加库的驱动头文件(mt006_conf.h 中)(为了方便一次性都添加进来,已有则不用添加)

3 、在应用层中调用

1 )添加驱动头文件(main.c中)

|------------------------|
| #include "GUA_Timer.h" |

2 )添加初始化代码(main.c的main函数中)

|----------------------------------------------------------------------------------------------|
| //开定时器 GUA_Timer_Init(); GUA_Timer_Config(Timer_Channel_0, 10000); //通道0,1us*10000=10ms一次中断 |

3 )添加测试代码(main.c的main函数的while轮询中)

|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| //刚插上usb的第一次要确认充多久电 if(gGUA_ChargeCheck_Read == GUA_CHARGE_CHECK_STATUS_NO_CHARGE) { //从0开始计数,避免过载 gGUA_Timer_Count = 0; gGUA_CurrentTime = 0; //电量<30% 1格以内 充电2小时 if(stGUA_Data.Battery < GUA_ADC_BATTERY_PERCENT_30) { gGUA_ChargeTime = 720000; //100为1秒,2小时 //gGUA_ChargeTime = 2000; //20秒 gGUA_ChargeCheck_Read = GUA_CHARGE_CHECK_STATUS_CHARGING; //正在充电 } //30%<=电量<70% 2格 充电1.5小时 else if((stGUA_Data.Battery >= GUA_ADC_BATTERY_PERCENT_30)&&(stGUA_Data.Battery < GUA_ADC_BATTERY_PERCENT_70)) { gGUA_ChargeTime = 540000; //100为1秒,1.5小时 //gGUA_ChargeTime = 1500; //15秒 gGUA_ChargeCheck_Read = GUA_CHARGE_CHECK_STATUS_CHARGING; //正在充电 } //70%<=电量<100% 3格 充电1小时 else if((stGUA_Data.Battery >= GUA_ADC_BATTERY_PERCENT_70)&&(stGUA_Data.Battery < GUA_ADC_BATTERY_PERCENT_100)) { gGUA_ChargeTime = 360000; //100为1秒,1小时 //gGUA_ChargeTime = 1000; //10秒 gGUA_ChargeCheck_Read = GUA_CHARGE_CHECK_STATUS_CHARGING; //正在充电 } //100%<=电量 不充 else { gGUA_ChargeCheck_Read = GUA_CHARGE_CHECK_STATUS_CHARGE_FULL; //已充满 } } //当计数值相等时充满电 if(gGUA_ChargeTime <= gGUA_CurrentTime) { stGUA_Data.Battery = GUA_ADC_BATTERY_PERCENT_100; //充满先填个理论电压,避免拔掉时显示lo bat gGUA_ChargeCheck_Read = GUA_CHARGE_CHECK_STATUS_CHARGE_FULL; //已充满 //为了不再重复执行,数值拉开 gGUA_CurrentTime = 0; gGUA_ChargeTime = 0xffffffff; //保存数据 GUA_Flash_Control(GUA_FLASH_CONTROL_WRITE); } |

仅供参考,是香瓜的项目代码

八、注意事项

暂无

九、实验结果

暂无

相关推荐
吠品6 小时前
智谱开源 ZCode 之后,真正的考试才开始
单片机·嵌入式硬件·1024程序员节
小李不想当小白10 小时前
SPI通信外设与W25Q64 (硬件SPI)(STM32标准库学习笔记)
笔记·stm32·单片机·嵌入式硬件·学习·嵌入式
LCG米10 小时前
STM32驱动W5500以太网模块实测:TCP吞吐瓶颈定位、TX指针回绕陷阱与断线重连保活落地
stm32·单片机·嵌入式硬件·tcp/ip
创界工坊工作室12 小时前
63-基于STC89C52霍尔传感器的智能化电能表设计
stm32·单片机·嵌入式硬件·51单片机·proteus
智购科技自动售货机厂家13 小时前
让AI经营自动售货机:从Project Vend看工具权限与业务规则~YH
大数据·服务器·单片机·嵌入式硬件·深度学习
Zwawa14 小时前
从 printf 到曲线:把数据送上 VOFA+
c语言·单片机·嵌入式
意法半导体STM3214 小时前
【官方原创】LAT6048 如何扩大MP2的A35核和M33核共享内存
stm32·单片机·嵌入式硬件·内存映射·stm32mp2
en.en..15 小时前
STM32(F429)启动模式与两种烧录方式
stm32·单片机·嵌入式硬件
单片机仿真设计15 小时前
基于 51 单片机的数字温度计(DS18B20+LCD1602+Proteus 仿真,支持阈值可调声光报警)
单片机·嵌入式硬件·proteus·课设
芝士爱沙拉16 小时前
原生内置agent智能开发能力的MCU IDE-MounRiver Studio
ide·单片机·嵌入式硬件