OpenEdv-开源电子网

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

STM32F030C8定时器进不了中断,代码如下,求教

[复制链接]

1

主题

7

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2015-5-24
在线时间
0 小时
发表于 2015-9-10 16:19:28 | 显示全部楼层 |阅读模式
5金钱
我用的是STM32F030C8
发现定时器进不了中断,查找原因未果,在此求教!
下面的我的代码:

定时器配置:
[mw_shl_code=c,true]void Tim3_Config(uint32_t period, uint16_t PrescalerValue) { NVIC_InitTypeDef NVIC_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; /* TIM3 clock enable */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); /* Enable the TIM3 global Interrupt */ NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; NVIC_InitStructure.NVIC_IRQChannelPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); /* Time base configuration */ TIM_DeInit(TIM3); TIM_TimeBaseStructure.TIM_Period = period; TIM_TimeBaseStructure.TIM_Prescaler = PrescalerValue; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseStructure.TIM_RepetitionCounter = period; TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); TIM_ClearFlag(TIM3, TIM_FLAG_Update); /* TIM IT enable */ TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE); /* TIM enable counter */ TIM_Cmd(TIM3, ENABLE); } [/mw_shl_code]
中断函数:
[mw_shl_code=c,true]void TIM3_IRQHandler(void) { if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) { TIM_ClearITPendingBit(TIM3, TIM_IT_Update ); printf("timer interrupt!\r\n"); } }[/mw_shl_code]
使用的库是STM32F0xx_StdPeriph_Lib_V1.5.0
startup_stm32f030.s中关于中断的定义有TIM3_IRQHandler,如下: [mw_shl_code=c,true]

[/mw_shl_code] [mw_shl_code=c,true]工程编译正常,下载正常,串口正常,但是就是进不了定时器中断(串口收不到中断中的字符串),请问问题出在哪?谢谢![/mw_shl_code]

最佳答案

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

#include "includes.h" void TIM3_NvicConfig(void) {     NVIC_InitTypeDef         NVIC_InitStructure;     /*  TIM14 ?D????ì×éè??*/     NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;     NVIC_InitStructure.NVIC_IRQChannelPriority =& ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

10

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1839
金钱
1839
注册时间
2014-6-27
在线时间
982 小时
发表于 2015-9-10 16:19:29 | 显示全部楼层
#include "includes.h"

void TIM3_NvicConfig(void)
{
    NVIC_InitTypeDef         NVIC_InitStructure;
    /*  TIM14 ?D????ì×éè??*/
    NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
}
/* TIM14 for delay */
void TIM3_BaseConfig(void)
{
    TIM_TimeBaseInitTypeDef     TIM_TimeBaseInitStructure;        
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //open TIM3 clock.    
    
    TIM_TimeBaseInitStructure.TIM_Prescaler = 0; //48000000 / (47999 + 1) = 1000Hz. 1Ms.
    TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInitStructure.TIM_Period = 3199;
    TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
    TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
    TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStructure); //TIM14, ??1ms?D??ò?′?.
    
    TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);
    TIM_Cmd(TIM3, ENABLE);
}
/*((1+TIM_Prescaler )/72M)*(1+TIM_Period )=((1+35999)/72M)*(1+2000)=1?? (?á1??as)*/ 
void TIM3_Init(void)
{
     TIM3_NvicConfig();
    TIM3_BaseConfig();
}

void TIM3_IRQHandler(void)
{
    if(TIM_GetITStatus(TIM3, TIM_IT_Update) == SET)
    {        
            
        TIM_ClearITPendingBit(TIM3, TIM_IT_Update);//??3y?D??±ê??    


    }

}
这个可以用,你试试。
回复

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2015-5-24
在线时间
0 小时
 楼主| 发表于 2015-9-10 16:28:51 | 显示全部楼层
上面忘记说了,我调用定时器初始化函数如下:
 Tim3_Config(1000, SystemCoreClock/1000 - 1);
其中SystemCoreClock为库文件system_stm32f0xx.c中定义的
uint32_t SystemCoreClock    = 48000000;
回复

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2015-5-24
在线时间
0 小时
 楼主| 发表于 2015-9-10 16:36:26 | 显示全部楼层
回复【2楼】TinyBoy:
---------------------------------
你好,谢谢你的回答,为什么我试了你的代码还是不行呢?
回复

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2015-5-24
在线时间
0 小时
 楼主| 发表于 2015-9-10 16:43:25 | 显示全部楼层
回复【2楼】TinyBoy:
---------------------------------
void TIM3_IRQHandler(void)
请问你的中断函数是写在stm32f0xx_it.c 中的吗?还有什么需要注意的吗?
回复

使用道具 举报

10

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1839
金钱
1839
注册时间
2014-6-27
在线时间
982 小时
发表于 2015-9-10 16:50:59 | 显示全部楼层
回复【5楼】zealeric:
---------------------------------
这个无妨,只有你的工程只出现一个void TIM3_IRQHandler(void) 就行了,在哪里看个人习惯。你自己改下进入中断的间隔时间,建议不要太短,中断里面尽量不要加有死循环的代码。
回复

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2015-5-24
在线时间
0 小时
 楼主| 发表于 2015-9-21 09:09:46 | 显示全部楼层
回复【6楼】TinyBoy:
---------------------------------
非常感谢你的热心解答,问题找到了,配置没问题,问题在于,我的工程是作为APP使用的,程序未对中断向量表设置偏移,导致无法中断!
希望看到的网友也要注意此问题哦
回复

使用道具 举报

2

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
66
金钱
66
注册时间
2016-6-12
在线时间
13 小时
发表于 2017-8-11 10:59:25 | 显示全部楼层
你好,我现在用的定时器代码和你的一样,也是进不去中断,这里提到的原因“我的工程是作为APP使用的,程序未对中断向量表设置偏移,导致无法中断!”,这个要怎么配置啊?
回复

使用道具 举报

24

主题

157

帖子

0

精华

高级会员

Rank: 4

积分
523
金钱
523
注册时间
2016-1-7
在线时间
131 小时
发表于 2018-1-9 14:23:34 | 显示全部楼层
zealeric 发表于 2015-9-21 09:09
回复【6楼】TinyBoy:
---------------------------------
非常感谢你的热心解答,问题找到了,配置没问题, ...

请问是怎么解决的啊QQ1964439971
回复

使用道具 举报

24

主题

157

帖子

0

精华

高级会员

Rank: 4

积分
523
金钱
523
注册时间
2016-1-7
在线时间
131 小时
发表于 2018-1-9 14:24:08 | 显示全部楼层
旅行者 发表于 2017-8-11 10:59
你好,我现在用的定时器代码和你的一样,也是进不去中断,这里提到的原因“我的工程是作为APP使用的,程序 ...

你的这个问题应该解决了吧,请问是怎么解决的啊QQ196439971
回复

使用道具 举报

24

主题

157

帖子

0

精华

高级会员

Rank: 4

积分
523
金钱
523
注册时间
2016-1-7
在线时间
131 小时
发表于 2018-1-12 11:58:48 | 显示全部楼层
问题解决了
回复

使用道具 举报

2

主题

474

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6545
金钱
6545
注册时间
2018-6-27
在线时间
551 小时
发表于 2018-12-2 11:51:01 | 显示全部楼层
学习学习,学习学习。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-22 16:03

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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