智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 2417|回复: 4
打印 上一主题 下一主题

为什么场中断只进了一次???

[复制链接]

4

主题

12

帖子

0

精华

高级会员

Rank: 4

积分
866
威望
530
贡献
140
兑换币
35
注册时间
2011-7-22
在线时间
98 小时
跳转到指定楼层
1#
发表于 2012-12-26 15:46:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include "exti.h"
#include "stdio.h"
#include "uart.h"
#include "led.h"
#include "dma.h"
extern u8 ImageBuf[ROW][COL]; //图像数据
extern FLAG_Type camera_status;
u8 p=0;
////////////////////////////////////
//函数名:EXIT_Init
//功  能:exit初始化
//说  明:port    io端口号PTA,PTB,PTC,PTD,PTE
//        index   引脚号0~31的数,视芯片针脚数而定
//        irqc    中断触发类型设置
// EXTI_IRQ_DISABLE      //进制外部中断
// EXTI_IRQ_DMA_RE       //DMA上升沿触发
// EXTI_IRQ_DMA_FE       //DMA下降沿触发
// EXTI_IRQ_DNA_EE       //DMA上升或下降沿触发
// EXTI_IRQ_LZ           //逻辑0状态触发
// EXTI_IRQ_RE           //上升沿触发
// EXTI_IRQ_FE           //下降沿触发
// EXTI_IRQ_EE           //上升或下降沿触发
// EXTI_IRQ_LO           //逻辑1触发
///////////////////////////////////
void EXTI_Init(GPIO_Type *port,u8 index,u8 irqc)
{
    PORT_Type *p ;
switch((uint32_t)port)
  {
   case PTA_BASE:p=PORTA;SIM->SCGC5|=SIM_SCGC5_PORTA_MASK;NVIC_EnableIRQ(PORTA_IRQn);break; //开启PORTA口使能时钟,在设置前首先开启使能时钟参见k10手册268页,开启内核接受中断,函数来自core_cm4.h
   case PTB_BASE:p=PORTB;SIM->SCGC5|=SIM_SCGC5_PORTB_MASK;NVIC_EnableIRQ(PORTB_IRQn);break; //开启PORTB口使能时钟
   case PTC_BASE:p=PORTC;SIM->SCGC5|=SIM_SCGC5_PORTC_MASK;NVIC_EnableIRQ(PORTC_IRQn);break; //开启PORTC口使能时钟
   case PTD_BASE:p=PORTD;SIM->SCGC5|=SIM_SCGC5_PORTD_MASK;NVIC_EnableIRQ(PORTD_IRQn);break; //开启PORTD口使能时钟
   case PTE_BASE:p=PORTE;SIM->SCGC5|=SIM_SCGC5_PORTE_MASK;NVIC_EnableIRQ(PORTE_IRQn);break; //开启PORTE口使能时钟
   default : break;
  }  
p->PCR[index]&=~(PORT_PCR_PS_MASK);  // 配置为下拉电阻
p->PCR[index]|=PORT_PCR_PE_MASK;      
p->PCR[index]&=~PORT_PCR_MUX_MASK;   //配置为GPIO功能  
p->PCR[index]|=PORT_PCR_MUX(1);        
port->PDDR&=~(1<<index);            //配置对应引脚
p->PCR[index]|=PORT_PCR_IRQC(irqc);//外部中断触发设置 参考k10手册238页
}
////////////////////////////////////////////
//函数名:PORTA_IRQHandler
//功  能:PORTA 外部中断服务
void PORTA_IRQHandler(void)
{
u8 i=31;
for(i=31;i>0;i--)  //判断哪个引脚的中断发生,i表示哪个引脚发生的中断
{
   if((PORTA->ISFR>>i)==1)break;
}
if(i==12) HREF_Interrupt();
}
////////////////////////////////////////////
//函数名:PORTC_IRQHandler
//功  能:PORTC 外部中断服务
void PORTC_IRQHandler(void)
{
u8 i=31;
for(i=31;i>0;i--)  //判断哪个引脚的中断发生,i表示哪个引脚发生的中断
{
   if((PORTC->ISFR>>i)==1)break;
}
if(i==18) VSYN_Interrupt();
}
////////////////////////////////////////////
//函数名:VSYN_Interrupt
//功  能:场中断处理函数
///////////////////////////////////////////
void VSYN_Interrupt(void)
{
  PORTA->ISFR |=(1<<12);//just clear the flag of HERF interrupt
  //PORTC->ISFR |=(1<<18);//just clear the flag of HERF interrupt

//begin to collect data during the odd field
if(camera_status.field_number%2!=0)
{
  //DMA_Init(0,50,0x400FF0D0u,u32 da,1,0,0,1,0,1,100);//初始化DMA.
  DMA_Init(0,50,(u32)&(PTD->PDIR),(u32)ImageBuf,1,0,0,1,0,1,COL);
  //选择CH0,触发源PTB,源地址PDIR,目的地址 ImageBuf,1每次读一字节,0每次传送源地址不变 0主循环之后源目的地址不变
  //1每次写目的地址加一 0表示主循环后目的地址不变 1选择正常模式 COL表示主循环次数为100次  禁止DMA硬件请求
  PORTA->PCR[12]|=PORT_PCR_IRQC(EXTI_IRQ_RE);//open the HERF interrupt
  camera_status.line_number       = 0;//clear line counter
  camera_status.vertic_syn_parity_flag  = 1;//set   parity flag
}
else//begin to process the data during the even field
  {
  DMA0->CERQ|=DMA_CERQ_CERQ(0);// DMA0请求禁止
  camera_status.finish_flag        = 1;
  PORTA->PCR[12]&=0XFFF0FFFF;//close the HERF interrupt
    PORTC->PCR[18]&=0XFFF0FFFF;//close the VSYN interrupt
  camera_status.vertic_syn_parity_flag  = 0;//even field
}
camera_status.field_number++;//the fact field number
}
//**************函数名HREF_Interrupt()**************//
//**************功  能?行中断处理函数**************//
void HREF_Interrupt(void)
{
PORTA->ISFR |=(1<<12);//just clear the flag of HERF interrupt
for(camera_status.line_number=0;camera_status.line_number<(5*ROW);camera_status.line_number++)
{
//   if((camera_status.line_number<12) ||(camera_status.line_number>200))
//   { return;}
//   else
//   {
   if(camera_status.line_number%5==0)     //隔五行 采一次
    {
     DMA0->SERQ|=DMA_SERQ_SERQ(0);   //是所需要的行再打开DMA请求使能
//      for(camera_status.column_number=0;camera_status.column_number<COL;camera_status.column_number++)
//      {
//       ImageBuf[camera_status.line_number][camera_status.column_number]=(PTD->PDIR);
//      }
    }
// }
}
//if(camera_status.line_number>=39) camera_status.line_number = 39;
}
//*********函数名:DMA0_IRQHandler*************//
//*********功  能:DMA0中断服务函数************//
void DMA0_IRQHandler(void)
{
//DMA0->SERQ|=DMA_SERQ_SERQ(0); //DMA0请求使能
DMA0->CERQ|=DMA_CERQ_CERQ(0); // DMA0请求禁止
DMA0->CINT|=DMA_CINT_CINT(0); //  清DMA中断标志
}

38

主题

1651

帖子

0

精华

功勋会员

Rank: 10Rank: 10Rank: 10

积分
8770
威望
4444
贡献
2638
兑换币
1818
注册时间
2010-12-29
在线时间
844 小时
2#
发表于 2012-12-26 15:56:53 | 只看该作者
清中断标志位没?放在相应的页没?
回复 支持 反对

使用道具 举报

4

主题

12

帖子

0

精华

高级会员

Rank: 4

积分
866
威望
530
贡献
140
兑换币
35
注册时间
2011-7-22
在线时间
98 小时
3#
 楼主| 发表于 2012-12-26 16:45:14 | 只看该作者
每个都清了,放在相应的页是什么意思?
回复 支持 反对

使用道具 举报

24

主题

603

帖子

1

精华

跨届大侠

西点君

Rank: 10Rank: 10Rank: 10

积分
8838

活跃会员奖章优秀会员奖章论坛元老奖章在线王奖章资源大师奖章

威望
3135
贡献
3875
兑换币
1580
注册时间
2011-5-9
在线时间
914 小时
4#
发表于 2012-12-26 17:22:33 | 只看该作者
是否清了中断标志位
回复 支持 反对

使用道具 举报

0

主题

11

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
493
威望
250
贡献
87
兑换币
74
注册时间
2012-3-4
在线时间
78 小时
毕业学校
山东工商学院
5#
发表于 2013-1-2 10:02:45 | 只看该作者
我的也是  场中断执行完后 禁止中断进行   就好了 行中断也是 哎 我的图像直接不变
回复 支持 反对

使用道具 举报

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

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-6-3 04:38 , Processed in 0.122867 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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