#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "ov7620.h"
#include "timer.h"
#include "dma.h"
#include "led.h"
#include "LCD.h"
///初始化引脚PA1,PA6,PA11,PB0~7
void GPIO_INT()
{
RCC->APB2ENR |=1<<3; //使能PORTB时钟
GPIOB->CRL &=0x00000000;
GPIOB->CRL |=0x88888888; //PB0~7设置为浮空输入
RCC->APB2ENR |=1<<2; //使能PORTA时钟
GPIOA->CRH&=0XFFF0FFFF;
GPIOA->CRH|=0X00080000; //PA12输入
GPIOA->ODR|=1<<12; //PA12上拉
GPIOA->CRL &=0xF0FFFF0F;
GPIOA->CRL |=0x08000080; //PA1,PA6设置为浮空输入
GPIOA->ODR|=0<<1; //PA1下拉
GPIOA->ODR|=0<<6; //PA6下拉
}
//外部中断0服务程序
//初始化PA13,PD2为中断输入.
void EXTIX_Init(void)
{
EXTI_InitTypeDef EXTI_InitStructure;
JTAG_Set(0X02); //关闭JTAG和SWD JTAG_SWD_DISABLE=0X02
//GPIOA.1中断线以及中断初始化配置
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource1); //配置引脚与中断的连接
EXTI_InitStructure.EXTI_Line=EXTI_Line1; //修改点
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; //上升沿触发
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure); //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器
//GPIOA.12中断线以及中断初始化配置
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource12); //配置引脚与中断的连接
EXTI_InitStructure.EXTI_Line=EXTI_Line12; //修改点
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿触发
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure); //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器
MY_NVIC_Init(2,1,EXTI1_IRQn,2); //抢占2,子优先级1,组2
MY_NVIC_Init(2,2,EXTI15_10_IRQn,2); //抢占2,子优先级2,组2
EXTI->IMR&=0<<1; // 关闭line BIT1上的中断
EXTI->EMR&=0<<1; // 屏蔽line BIT1上的中断
}
//串口数据发送
//u8 szm; //行数
void CLHS_sj(void)
{
u8 m,i;
while(USART_RX_STA&0X80==0);
USART1->DR= 0X00; //协议码
while ((USART1->SR&0X40)==0);
USART1->DR= 0Xff;
while ((USART1->SR&0X40)==0);
USART1->DR= 0X01;
while ((USART1->SR&0X40)==0);
USART1->DR= 0X00;
while ((USART1->SR&0X40)==0);
for(i=0;i<40;i++)
{
for(m=0;m<120;m++)
{
USART1->DR=ov7620_Buf
[m];
while((USART1->SR&0X40)==0); //等待发送结束
}
}
}
u8 kaishizd;
u8 ghs; //采样的隔行数
u8 HANGSHUJU; //行的数据
//外部中断12 服务程序
void EXTI15_10_IRQHandler()
{
if(EXTI_GetITStatus(EXTI_Line12) != RESET)
{ LED1=~LED1;
// HANGSHUJU=0;
EXTI->IMR|=1<<1; // 开启line BIT1上的中断
EXTI->EMR|=1<<1; // 开启line BIT1上的中断
EXTI->IMR&=0<<12;// 关闭line BIT12上的中断
EXTI->EMR&=0<<12;// 屏蔽line BIT12上的中断
EXTI->R=1<<12;
}
}
void EXTI1_IRQHandler()
{
if(EXTI_GetITStatus(EXTI_Line1) != RESET)
{ HANGSHUJU++;
// LED0=~LED0;
if(HANGSHUJU>0||HANGSHUJU<53) ghs=4;
if(HANGSHUJU>52||HANGSHUJU<181) ghs=6;
if(HANGSHUJU>180||HANGSHUJU<240) ghs=12;
if(HANGSHUJU==240)
{ LED0=~LED0;
CLHS_sj();
EXTI->IMR&=0<<1;// 关闭line BIT1上的中断
EXTI->EMR&=0<<1;// 屏蔽line BIT1上的中断
EXTI->IMR|=1<<12;// 开启line BIT12上的中断
EXTI->EMR|=1<<12;// 开启line BIT12上的中断
}
if(HANGSHUJU%ghs==0)
{
MYDMA_Enable(DMA1_Channel6);
}
EXTI->R=1<<1;
}
}
u8 hdsj; //采集的行数目
u16 ov7620_Buf[40][120]; //第一数组
//u8 baochun; //用于数据保存
u8 SHUODING; //锁定用于判断数组
//DMA1的各通道配置
//从存储器->外设模式/8位数据宽度/存储器增量模式
//DMA_CHXMA通道CHX
//cpar:外设地址
//cmar:存储器地址
//cndtr:数据传输器
void MYDMA_Config(DMA_Channel_TypeDef*DMA_CHx)
{ u32 DR_Base; //做缓冲器,不知道为什么非要不可
RCC->AHBENR|=1<<0; //开启DMA1时钟
__nop(); //等待 DMA1 时钟稳定
__nop(); //经测试最少 2 个 nop
__nop();
DR_Base=OV7620_DATA;
DMA_CHx->CPAR=DR_Base; //DMA1 外设地址
DMA_CHx->CMAR=(u32)ov7620_Buf[0]; //DMA1, 存储器地址
DMA_CHx->CNDTR=240; //DMA1,传输数据量
DMA_CHx->CCR=0X00000000; //复位
DMA_CHx->CCR|=0<<4; //从外设器件读数据
DMA_CHx->CCR|=0<<5; //普通模式
DMA_CHx->CCR|=0<<6; //外设地址非增量模式
DMA_CHx->CCR|=1<<7; //存储器增量模式
DMA_CHx->CCR|=1<<8; //外设数据宽度为16位
DMA_CHx->CCR|=1<<10; //存储器数据宽度16位
DMA_CHx->CCR|=1<<13; //高优先级
DMA_CHx->CCR|=0<<14; //非存储器到存储器模式
// DMA_CHx->CCR|=1<<5; //循环模式
DMA_CHx->CCR|=1<<1; //传输完成中断使能
// DMA_CHx->CCR|=1<<0; //开启DMA传输
MY_NVIC_Init(1,1,DMA1_Channel6_IRQn,1);//抢占2,子优先级1,组1
}
//DMA中断函数
void DMA1_Channel6_IRQHandler()
{
KAISHI(DMA1_Channel6);
}
//开启一次DMA传输
void MYDMA_Enable(DMA_Channel_TypeDef*DMA_CHx)
{
TIM3->DIER|=1<<9; //捕获比较1事件的DMA请求使能
DMA_CHx->CCR|=1<<0; //开启DMA传输
}
//从新设定目的寄存器
void KAISHI(DMA_Channel_TypeDef*DMA_CHx)
{
DMA_CHx->CCR&=~(1<<0); //关闭DMA传输
hdsj++;
if(hdsj>39)
hdsj=0;
DMA_CHx->CNDTR=120 ; //DMA1,传输数据量
DMA_CHx->CMAR=(u32)ov7620_Buf[hdsj]; //DMA1, 存储器地址
}
EXTI->EMR&=0<<1; // 屏蔽line BIT1上的中断
改为:
EXTI->IMR&=~(1<<1); // 关闭line BIT1上的中断
EXTI->EMR&=~(1<<1); // 屏蔽line BIT1上的中断
一周热门 更多>