STM32F103RCT6中断

本文详细介绍了如何通过中断技术在STM32平台使用TIM2定时器进行1秒定时,包括时钟配置、定时器初始化、中断设置和中断服务函数编写。通过实例演示了如何设置TIM2的ARR和PSC参数以实现精确计时。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这次我们尝试使用中断进行定时。

具体步骤为:

①能定时器时钟。
RCC_APB1PeriphClockCmd();
②  初始化定时器,配置ARR,PSC。
TIM_TimeBaseInit();
③开启定时器中断,配置NVIC。
void TIM_ITConfig();
NVIC_Init();
④使能定时器。
TIM_Cmd();
⑥编写中断服务函数。
TIMx_IRQHandler();

首先我们设置一下TIM,结构体TIM_TimeBaseInitTypeDef中有五个元素,其中除了TIM_RepetitionCounter只能用于TIM1和TIM8之外,其他四个都需要设置。

void TIM2_init(u16 arr, u16 psc)
{
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;

	TIM_TimeBaseInitStruct.TIM_Period = arr;//重装载值
	TIM_TimeBaseInitStruct.TIM_Prescaler = psc;//预分频系数
	TIM_TimeBaseInitStruct.TIM_ClockDivision = 0;
	TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;

	TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStruct);
	TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
	TIM_Cmd(TIM2,ENABLE);
}

接下来设置NVIC,

    NVIC_InitTypeDef NVIC_InitStruct;
    NVIC_InitStruct.NVIC_IRQChannel = TIM2_IRQn;
	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 2;
	NVIC_InitStruct.NVIC_IRQChannelSubPriority = 2;
	NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStruct);

将两部分合在一起,

void TIM2_Init(u16 arr,u16 psc)
{
	NVIC_InitTypeDef NVIC_InitStruct;
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;

	TIM_TimeBaseInitStruct.TIM_Period = arr;//重装载值
	TIM_TimeBaseInitStruct.TIM_Prescaler = psc;//预分频系数
	TIM_TimeBaseInitStruct.TIM_ClockDivision = 0;
	TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;

	NVIC_InitStruct.NVIC_IRQChannel = TIM2_IRQn;
	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 2;
	NVIC_InitStruct.NVIC_IRQChannelSubPriority = 2;
	NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
	
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
	TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStruct);
	TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
	TIM_Cmd(TIM2,ENABLE);
	NVIC_Init(&NVIC_InitStruct);
}

然后需要设置中断服务函数,我们在启动文件中找到TIM2口对应的中断服务函数的函数名,复制过来,

void TIM2_IRQHandler(void)   //TIM2中断
{
	static u8 i = 0;
	if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源 更新中断
		{
			switch(i)
			{
				case 0:GPIO_ResetBits(LED_GPIO_PORT, LED_GPIO_PIN);i++;break;
				case 1:GPIO_SetBits(LED_GPIO_PORT, LED_GPIO_PIN);i=0;break;
			}
			TIM_ClearITPendingBit(TIM2, TIM_IT_Update);  //清除TIMx的中断待处理位:TIM 中断源 
			
		}
}

这样,每发生一次中断都会使LED灯改变状态。我们想要设置时间是1s,那么我们要如何在主函数中填写函数TIM2_Init()的两个参数呢,通过手册我们可以知道,时间的计算方式为

((psc+1)*(arr+1))/fck

其中fck是频率,比如72MHz对应的fck就是72000000。所以当我们填入arr=9999, psc=7199时,定时就是1s

int main()
{
	LED_GPIO_Config();
	TIM2_Init(9999,7199);
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	while(1);
}

实验现象:小灯每一秒改变一次状态

### STM32F103RCT6 中断函数使用教程 对于STM32F103RCT6单片机而言,在实现定时器中断功能时,需遵循一系列特定的操作流程来确保硬件资源被合理配置并正常工作。 初始化过程中涉及到启用外设时钟操作,这通过调用`RCC_APB1PeriphClockCmd()`完成,该命令用于激活连接到APB1总线上的设备电源供应,从而允许后续对外设行访问和设置[^1]。 随后入定时器的基础设定阶段,即利用`TIM_TimeBaseInit()`接口指定自动重装载寄存器(ARR)以及预分频系数(PSC),这两个参数共同决定了计数周期长度与频率分辨率,而影响最终产生的脉冲宽度调制信号特性或其他基于时间间隔的应用需求。 为了响应由定时事件触发的异常情况,还需执行两步关键动作:一是借助`TIM_ITConfig()`打开相应的中断请求通道;二是依靠`NVIC_Init()`结构体成员变量定制全局嵌套向量中断控制器(NVIC)的行为模式——比如优先级级别分配等重要属性,以此保障不同种类外部刺激之间能够有序竞争CPU处理权。 当一切准备工作就绪之后,则可通过发出`TIM_Cmd(TIMx, ENABLE)`指令启动目标定时装置开始运作,并等待预期条件达成后跳转至预先定义好的ISR入口地址处继续执行自定义逻辑程序片段。 下面给出一段完整的C语言源码作为实例展示如何构建上述提及的功能模块: ```c #include "stm32f1xx.h" void TIM_Config(void){ // 使能定时器时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); // 定义定时器基础参数 TIM_TimeBaseInitTypeDef timer_init; timer_init.TIM_Period = 999; /* 自动重载值 */ timer_init.TIM_Prescaler = 7199; /* 预分频值 */ timer_init.TIM_ClockDivision = 0; timer_init.TIM_CounterMode = TIM_CounterMode_Up; // 初始化定时器 TIM_TimeBaseInit(TIM2,&timer_init); // 开启更新中断 TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE); // 设置NVIC NVIC_InitTypeDef nvic_init; nvic_init.NVIC_IRQChannel = TIM2_IRQn; nvic_init.NVIC_IRQChannelPreemptionPriority = 0; nvic_init.NVIC_IRQChannelSubPriority = 1; nvic_init.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&nvic_init); // 启动定时器 TIM_Cmd(TIM2, ENABLE); } // 编写中断服务函数 void TIM2_IRQHandler(void){ if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET){ // 清除标志位 TIM_ClearITPendingBit(TIM2, TIM_IT_Update); // 用户代码... } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值