OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4081|回复: 11

STM32(例程)定时器中断实验里面的代码有疑问,求教!

[复制链接]

5

主题

20

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2016-8-1
在线时间
4 小时
发表于 2016-8-9 19:48:36 | 显示全部楼层 |阅读模式
1金钱
这个是timer.c的代码,用于定义各种main.c中需要使用的函数
#include "timer.h"
#include "led.h"

void TIM3_Int_Init(u16 arr,u16 psc)
{
        TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
       
        TIM_TimeBaseStructure.TIM_Period = arr;
        TIM_TimeBaseStructure.TIM_Prescaler = psc;
        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
        TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);
        TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);
       
        NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);
        TIM_Cmd(TIM3,ENABLE);
}
void TIM3_IRQHandler(void)
{
        if(TIM_GetITStatus(TIM3,TIM_IT_Update) != RESET)
        {
                TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
                LED1 = !LED1;
        }
}

然后,这个是main.c函数,用来实现定时器中断的功能
#include "led.h"
#include "delay.h"
#include "sys.h"
#include "beep.h"
#include "key.h"
#include "usart.h"
#include "exti.h"
#include "wdg.h"
#include "timer.h"

int main(void)
{
        delay_init();
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
        uart_init(115200);
        LED_Init();
        TIM3_Int_Init(4999,7199);
        while(1)
        {
                LED0 = !LED0;
                delay_ms(200);
        }
}

main.c文件中根本没有IRQHandler这个函数啊,而且在main.c文件中调用的各种函数里面也没有IRQHandler这个函数的嵌套,但是运行结果还是有IRQHandler中LED1状态的翻转。我想问的是这个函数是在哪里被调用的?或者是在哪里被嵌套到main.c文件中的TIM3_Int_Init()函数中的?感激不尽!

最佳答案

查看完整内容[请看2#楼]

看你这样问,好像对中断不是怎么了解啊,你的这个程序是在TIM3初始化的时候,开启了TIM3的定时器,并且使能了TIM3的更新中断,这样你的TIM3就会根据内部时钟一直计数,当计数到一个数值的时候,内部就会产生TIM3的更新中断,这样你的程序内部中断机制就会去调用TIM3_IRQHandler这个函数,这个函数是在启动文件里面写死在一个位置,如下图
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

5

主题

103

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
235
金钱
235
注册时间
2014-11-26
在线时间
25 小时
发表于 2016-8-9 19:48:37 | 显示全部楼层
看你这样问,好像对中断不是怎么了解啊,你的这个程序是在TIM3初始化的时候,开启了TIM3的定时器,并且使能了TIM3的更新中断,这样你的TIM3就会根据内部时钟一直计数,当计数到一个数值的时候,内部就会产生TIM3的更新中断,这样你的程序内部中断机制就会去调用TIM3_IRQHandler这个函数,这个函数是在启动文件里面写死在一个位置,如下图
8X`Q8]S(0BCTKQG(DV76IXQ.png
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
7
金钱
7
注册时间
2016-8-9
在线时间
0 小时
发表于 2016-8-9 21:13:01 | 显示全部楼层
IRQHandler这个是中断服务子程序,STM32的中断服务子程序一般都写在it.c文件下,这个函数是其对应的中断到来的时候就转曲执行该函数,执行完之后恢复现场,主函数下面继续执行,也就是当你定时器定时的时间到了,就会触发更新事件的中断,而不需要你人为的在程序里面嵌套。
回复

使用道具 举报

5

主题

20

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2016-8-1
在线时间
4 小时
 楼主| 发表于 2016-8-9 21:43:48 | 显示全部楼层
应梦先森 发表于 2016-8-9 21:13
IRQHandler这个是中断服务子程序,STM32的中断服务子程序一般都写在it.c文件下,这个函数是其对应的中断到 ...

那我在timer.c中对TIM3_IRQHandler的定义仅仅是指定了该函数对计时器3有效是吧?
因为我看例程里面都是让我自己新建一个文件然后往里面写IRQHandler的代码而不是直接#include
回复

使用道具 举报

5

主题

20

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2016-8-1
在线时间
4 小时
 楼主| 发表于 2016-8-10 01:06:33 | 显示全部楼层
1376115749 发表于 2016-8-9 19:48
看你这样问,好像对中断不是怎么了解啊,你的这个程序是在TIM3初始化的时候,开启了TIM3的定时器,并且使能 ...

那么我在timer.c中定义的TIM3_IRQHandler是使能TIM3的更新中断?还是指定了这个程序中我要调用的是TIM3
回复

使用道具 举报

7

主题

43

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
204
金钱
204
注册时间
2016-6-30
在线时间
49 小时
发表于 2016-8-10 09:09:43 来自手机 | 显示全部楼层
定时器溢出,灯状态反转。看寄存器版本容易看懂多了
回复

使用道具 举报

7

主题

43

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
204
金钱
204
注册时间
2016-6-30
在线时间
49 小时
发表于 2016-8-10 09:15:07 来自手机 | 显示全部楼层
用定时器比用延时好处就提体现了,while里面可以执行其他
回复

使用道具 举报

6

主题

110

帖子

0

精华

高级会员

Rank: 4

积分
553
金钱
553
注册时间
2014-10-23
在线时间
195 小时
发表于 2016-8-10 10:29:02 | 显示全部楼层
巨魔Punk 发表于 2016-8-9 21:43
那我在timer.c中对TIM3_IRQHandler的定义仅仅是指定了该函数对计时器3有效是吧?
因为我看例程里面都是 ...

定时器的中断函数的定义是官方给的。你开启了定时器,并且开启了相关中断,然后自己写中断服务函数。
回复

使用道具 举报

5

主题

103

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
235
金钱
235
注册时间
2014-11-26
在线时间
25 小时
发表于 2016-8-10 18:58:56 | 显示全部楼层
巨魔Punk 发表于 2016-8-10 01:06
那么我在timer.c中定义的TIM3_IRQHandler是使能TIM3的更新中断?还是指定了这个程序中我要调用的是TIM3

建议你了解一下中断的处理机制吧
回复

使用道具 举报

5

主题

20

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2016-8-1
在线时间
4 小时
 楼主| 发表于 2016-8-11 14:32:16 | 显示全部楼层
卡塔之魂 发表于 2016-8-10 10:29
定时器的中断函数的定义是官方给的。你开启了定时器,并且开启了相关中断,然后自己写中断服务函数。

哦哦!你说的这个我感觉懂了
回复

使用道具 举报

5

主题

20

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2016-8-1
在线时间
4 小时
 楼主| 发表于 2016-8-11 14:32:31 | 显示全部楼层
1376115749 发表于 2016-8-10 18:58
建议你了解一下中断的处理机制吧

谢谢!
回复

使用道具 举报

5

主题

20

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2016-8-1
在线时间
4 小时
 楼主| 发表于 2016-8-11 14:32:59 | 显示全部楼层
qq243380211 发表于 2016-8-10 09:09
定时器溢出,灯状态反转。看寄存器版本容易看懂多了

刚开始学习不都是看库函数嘛,我就先从库函数开始看了。。。。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-8 04:36

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表