[STM32F103标准库]嵌入式模拟平台通用定时器TIM3模拟实验
本次实验用到嵌入式仿真教学实验平台:嵌入式仿真实验教学平台
DMA野火文档传送门:(文章理论部分出处)31. TIM—基本定时器 — [野火]STM32库开发实战指南——基于野火指南者开发板 文档
定时器分类
STM32F1 系列中,除了互联型的产品,共有 8个定时器,分为基本定时器,通用定时器和高级定时器。 基本定时器 TIM6 和 TIM7 是一个 16位的只能向上计数的定时器,只能定时,没有外部 IO。 通用定时器 TIM2/3/4/5是一个 16位的可以向上/下计数的定时器,可以定时,可以输出比较,可以输入捕捉, 每个定时器有四个外部IO。高级定时器 TIM1/8是一个 16位的可以向上/下计数的定时器,可以定时,可以输出比较, 可以输入捕捉,还可以有三相电机互补输出信号,每个定时器有8 个外部 IO。更加具体的分类详情见图 定时器分类 。

我们本次实验需用模拟用到的定时器为通用定时器TIM3,需要实现的实验目的为设置TIM3的定时周期,再通过中断实现LED每一秒的亮灭。原理请看野火文档,不做赘述。
在STM32F103系列单片机中,TIM3挂在APB1时钟,频率为36Mhz。如果想要设置1s进入中断服务函数,需要满足 36Mhz/(arr+1)/(psc+1) = 1; 本次实验 我们配置arr=9999,psc=3599。
结构体配置如下
TIM_TimeBaseStructure.TIM_Period = (10000-1);
TIM_TimeBaseStructure.TIM_Prescaler =(3600-1);
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM3.C以及TIM3.H文档如下
#include "stm32f10x.h"
#include "stm32f10x_rcc.h"
#include "sys.h"
#include "pwm.h"
#include "stm32f10x_conf.h"
// 初始化 TIM3
void TIM3_Init(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能
TIM_TimeBaseStructure.TIM_Period = (10000-1);
TIM_TimeBaseStructure.TIM_Prescaler =(3600-1);
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; // TIM向上计数模式
//TIM_TimeBaseStructure.TIM_RepetitionCounter = 8; // 高级定时器才有不用管
// 可用于超长时间定时中断
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
TIM_ITConfig( // 使能或者失能指定的TIM中断
TIM3, // TIM1
TIM_IT_Update, // TIM 中断源
ENABLE // 使能
);
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; // TIM3 中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; // 先占优先级0级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; // 响应优先级3级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
TIM_Cmd(TIM3, ENABLE); //使能TIMx外设
}
#ifndef __TIM_H
#define __TIM_H
#include "sys.h"
// 初始化定时器1
void TIM3_Init(void);
// 初始化定时器2
#endif
主函数代码如下:
/**
******************************************************************************
* @ 名称 STM32 学习模板
* @ 版本 STD 库 V3.5.0
* @ 描述 适用于嵌入式虚拟仿真平台
*
* @ 注意 本程序只供学习使用
******************************************************************************
*/
#include "key.h"
#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "sys.h"
#include "stm32f10x_conf.h"
#include "delay.h"
#include "led.h"
#include "tim.h"
#include
int main(void)
{
LED_Init();//LED初始化
KEY_Init();//按键初始化
TIM3_Init();//TIM初始化
while(1)
{
// if(KEY_ON == Key_Scan(GPIOA,GPIO_Pin_9))//读取按键PA9电平
// {
// LED = !LED;
// }
}
}
// void EXTI0_IRQHandler()
// {
// // 确保是EXTI_Line0触发的中断
// if (EXTI_GetITStatus(EXTI_Line0) != RESET)
// {
// // 20ms消抖(避免抖动)
// delay_ms(20);
// // 再次确认PA0按键按下(高电平)
// if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == KEY_ON)
// {
// // LED翻转(用定义好的宏)
// LED = !LED;
// }
// // 清除中断标志位(必须!否则会反复触发中断)
// EXTI_ClearITPendingBit(EXTI_Line0);
// }
// }
void TIM3_IRQHandler(void)
{
if ( TIM_GetITStatus( TIM3, TIM_IT_Update) != RESET ) {
LED = !LED;
TIM_ClearITPendingBit(TIM3 , TIM_FLAG_Update);
}
}
运行结果如下 可以看到LED以1S的频率实现亮灭








