打印

求助:STM32 F103VC TIM时钟疑问

[复制链接]
3090|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
leshak|  楼主 | 2012-11-7 21:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
用的是STM32 F103VC,主函数MAIN中开了TIM3和TIM4。单开TIM3系统正常,如果开TIM3和TIM4,系统死机。
程序架构如下:
int main(void)
{.....
TIM3();
....
TIM4();
while(1);
}

下面是TIM3和TIM4的配置,定时时钟72M,TIM4用于大约6秒的定时,下计数,产生中断后让系统睡眠...

TIM3()
{
TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能
TIM_TimeBaseStructure.TIM_Period = 2000; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值  计数到5000为500ms
TIM_TimeBaseStructure.TIM_Prescaler =(7200-1); //设置用来作为TIMx时钟频率除数的预分频值  10Khz的计数频率  
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //

TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位

TIM_ITConfig( TIM3, TIM_IT_Update  |  TIM_IT_Trigger, 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外设
        }




TIM4()
{
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); //时钟使能

TIM_TimeBaseStructure.TIM_Period = 10000; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值  计数到5000为500ms

TIM_TimeBaseStructure.TIM_Prescaler =(720-1); //设置用来作为TIMx时钟频率除数的预分频值  10Khz的计数频率  

TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim

TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式

TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);

TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位

TIM_ITConfig(  //使能或者失能指定的TIM中断
  TIM4, //TIM4
  TIM_IT_Update  |  //TIM 中断源
  TIM_IT_Trigger,   //TIM 触发中断源
  ENABLE  //使能
  );

NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;  //TIM3中断

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;  //先占优先级2级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;  //从优先级2级

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能

NVIC_Init(&NVIC_InitStructure);  //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器

TIM_Cmd(TIM4, ENABLE);  //使能TIMx外设
}


麻烦哪位朋友能看下并且提示下,谢谢了。
沙发
IJK| | 2012-11-8 09:46 | 只看该作者
“TIM4用于大约6秒的定时,下计数,产生中断后让系统睡眠”

系统睡眠,从症状看就类似于死机。

使用特权

评论回复
板凳
leshak|  楼主 | 2012-11-8 12:09 | 只看该作者
TIM4设置了大约6秒才产生中断,在中断函数才进入睡眠的,现在是一开机,系统就死了。。。。。

使用特权

评论回复
地板
IJK| | 2012-11-8 14:46 | 只看该作者
TIM4设置了大约6秒才产生中断,在中断函数才进入睡眠的,现在是一开机,系统就死了。。。。。
leshak 发表于 2012-11-8 12:09


这好办,“在中断函数才进入睡眠” 改为在中断函数里翻转1个GPIO引脚(可以接到LED上),看怎么样

使用特权

评论回复
5
leshak|  楼主 | 2012-11-8 19:47 | 只看该作者
好的,先试验下看看:)

使用特权

评论回复
6
leshak|  楼主 | 2012-11-9 11:14 | 只看该作者
本帖最后由 leshak 于 2012-11-9 11:15 编辑

找到定时错误了,TIM中断函数参数写错了。现在开机后大约6秒进入睡眠模式。:)
往下做的时候遇到这样一个问题,准备设计成:开机6秒后睡眠------按PA0把机器关机( PA0对应的EXTI0_IRQHandler函数中会把控制系统电源的EN PIN给关掉达到关机)
疑问:
开机6秒后睡眠了,按PA0没反应.....
如果让系统直接进入睡眠,按PA0可以实现把机器给关掉....

查看中断的配置和PA0 外部中断的配置貌似没发现什么问题,是不是TIM4的中断和PA0的中断有冲突,就是TIM4产生中断之后,不能实现PA0的中断?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

101

主题

522

帖子

4

粉丝