OpenEdv-开源电子网

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

我把原子哥的FATFS实验的代码移植到STM32F4上,为什么跳进TIM2中断出不来?

[复制链接]

41

主题

99

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
283
金钱
283
注册时间
2013-8-1
在线时间
0 小时
发表于 2013-8-5 21:14:59 | 显示全部楼层 |阅读模式
    我把NVIC的TIM2中断使能关闭还是进入TIM2_IRQHandler()函数不出来。查了一下,说中断服务函数处理的时间过长,导致中断出不来,我设置了分频系数更大,可是还是不行。 我的主频是168MHz的 。  
这是usmart.c 里的代码:
 #if USMART_ENTIMX_SCAN==1
//下面这两个函数,非USMART函数,放到这里,仅仅方便移植. 
//定时器2中断服务程序  
void TIM2_IRQHandler(void)
{          
if(TIM2->SR&0X0001)//溢出中断
{
usmart_dev.scan();//执行usmart扫描              
}   
TIM2->SR&=~(1<<0);//清除中断标志位    
}
//使能定时器2,使能中断.
void Timer2_Init(u16 arr,uint_32 psc)
{
RCC->APB1ENR|=1<<0;//TIM2时钟使能    
  TIM2->ARR=1000;  //设定计数器自动重装值  
TIM2->SC=168000;  //预分频器7200,得到10Khz的计数时钟
//这两个东东要同时设置才可以使用中断
TIM2->DIER|=1<<0;   //允许更新中断
TIM2->DIER|=1<<6;   //允许触发中断
     
TIM2->CR1|=0x01;    //使能定时器2
 // MY_NVIC_Init(3,3,TIM2_IRQn,2);//抢占3,子优先级3,组2(组2中优先级最低的)  
}
#endif

还有我把SYS.c里的部分代码页修改了的
void MY_NVIC_Init(u8 NVIC_PreemptionPriority,u8 NVIC_SubPriority,u8 NVIC_Channel,u8 NVIC_Group)  
u32 temp;
u8 IPRADDR=NVIC_Channel/4;  //每组只能存4个,得到组地址 
u8 IPROFFSET=NVIC_Channel%4;//在组内的偏移
IPROFFSET=IPROFFSET*8+4;    //得到偏移的确切位置
MY_NVIC_PriorityGroupConfig(NVIC_Group);//设置分组
temp=NVIC_PreemptionPriority<<(4-NVIC_Group);  
temp|=NVIC_SubPriority&(0x0f>>NVIC_Group);
temp&=0xf;//取低四位

if(NVIC_Channel<32)NVIC->ISER[0]|=1<<NVIC_Channel;//使能中断位(要清除的话,相反操作就OK)
else NVIC->ISER[1]|=1<<(NVIC_Channel-32);    
  NVIC->IP[IPRADDR]|=temp<<IPROFFSET;//设置响应优先级和抢断优先级           
}

//外部中断配置函数
//只针对GPIOA~G;不包括PVD,RTC和USB唤醒这三个
//参数:
//GPIOx:0~6,代表GPIOA~G
//BITx:需要使能的位;
//TRIM:触发模式,1,下升沿;2,上降沿;3,任意电平触发
//该函数一次只能配置1个IO口,多个IO口,需多次调用
//该函数会自动开启对应中断,以及屏蔽线      
void Ex_NVIC_Config(u8 GPIOx,u8 BITx,u8 TRIM) 
{
u8 EXTADDR;
u8 EXTOFFSET;
EXTADDR=BITx/4;//得到中断寄存器组的编号
EXTOFFSET=(BITx%4)*4;
  
RCC->APB2ENR|=0x01;//使能io复用时钟

  SYSCFG->EXTICR[EXTADDR]&=~(0x000F<<EXTOFFSET);//清除原来设置!!!
  SYSCFG->EXTICR[EXTADDR]|=GPIOx<<EXTOFFSET;//EXTI.BITx映射到GPIOx.BITx
//自动设置
EXTI->IMR|=1<<BITx;//  开启line BITx上的中断
//EXTI->EMR|=1<<BITx;//不屏蔽line BITx上的事件 (如果不屏蔽这句,在硬件上是可以的,但是在软件仿真的时候无法进入中断!)
  if(TRIM&0x01)EXTI->FTSR|=1<<BITx;//line BITx上事件下降沿触发
if(TRIM&0x02)EXTI->RTSR|=1<<BITx;//line BITx上事件上升降沿触发
}

    

        串口我使用的是usart3。
        还有一个细节是,串口初始化函数是自己写的,昨天调通了的。但是单片机复位没有出现串口把数据发送出来。


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2013-8-5 22:36:22 | 显示全部楼层
回复【楼主位】yongyooh:
---------------------------------
你现在的TIM2中断服务函数很精简了啊,你吧usmart.scan屏蔽掉再试试,看看能不能出来?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-22 16:34

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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