?? lpld_gpio_dma.c
字號:
/*
* 測試硬件平臺: LPLD_K60 Card
* 版權所有: 北京拉普蘭德電子技術有限公司
* 網絡銷售: http://laplenden.taobao.com
* 公司門戶: http://www.lpld.cn
*
* 說明: 本工程基于Kintis K60開源底層開發包開發,
* 所有開源驅動代碼均在"LPLD"文件夾下,調用說明見文檔[#LPLD-003-N]
*
* 文件名: LPLD_GPIO_DMA.c
* 用途: 增強型DMA與GPIO模塊綜合例程,用于數字攝像頭采集
* OV系列數字攝像頭均可使用
*
* LPLD_K60 Card 硬件配置說明:
* 攝像頭位數據位 - PortD0~7
* PCLK - PortC0
* 行中斷 - PortB0
* 場中斷 - PortB3
* 圖像數據輸出 - K60串口5,波特率115200,每幅圖幀頭發0x01
*
*/
#include "common.h"
#include "HAL_eDMA.h"
#include "HAL_GPIO.h"
#include "uart.h"
#define H 200
#define V 150
#define PHOTO_SIZE H*V
void portb_isr(void);
void GPIO_Init(void);
void dma1_isr(void);
/********************************************************************/
LPLD_eDMA_Cfg_t User_Def_DMA_Init; //聲明DMA初始化結構體
uint8_t Pix_Data[PHOTO_SIZE]; //采集50行 200列的圖像數據
uint8_t V_Cnt; //行采集計數
uint8_t Field_Over; //場采集完成標志
uint8_t Is_SendPhoto; //圖像發送標志
void main (void)
{
int i;
DisableInterrupts;
//變量初始化
for(i=0;i<PHOTO_SIZE;i++)
{
Pix_Data[i]=0;
}
V_Cnt=0; //行計數
Field_Over=1; //場開始標志位
Is_SendPhoto=1; //從串口發送圖像
//IO口初始化
GPIO_Init();
//DMA初始化結構體賦值
User_Def_DMA_Init.Channelx =DMA_CH1; //設置為通道1
User_Def_DMA_Init.Peri_DmaReq =PORTC_DMAREQ; //IO C 產生DMA請求
User_Def_DMA_Init.Minor_loop_Length =H; //主循環次數
User_Def_DMA_Init.Source_Addr =(uint32_t)&GPIOD_PDIR; //設置源地址
User_Def_DMA_Init.Dest_Addr =(uint32_t)Pix_Data; //目的地址為Pix_Data的首地址
User_Def_DMA_Init.Dma_irqc =1; //采集結束觸發中斷
User_Def_DMA_Init.isr_func =dma1_isr; //自定義通道1中斷服務子程序
//初始化DMA模塊
LPLD_DMA_Init(&User_Def_DMA_Init);
EnableInterrupts;
enable_irq (88); //PORTB 中斷 PB3產生場中斷和PB0產生行中斷
while(1)
{
if(Is_SendPhoto)
{
//先發送一場圖像的幀頭0x01
uart_putchar(UART5_BASE_PTR,0x01);
for(i=0;i<PHOTO_SIZE;i++)
{
if(Pix_Data[i]==0x01)Pix_Data[i]++;
uart_putchar(UART5_BASE_PTR,Pix_Data[i]);
}
}
}
}
/********************************************************************/
void GPIO_Init(void)
{
LPLD_GPIO_Init(PORTD_BASE_PTR,0,0,2,0); //選擇IO D作為數據口
LPLD_GPIO_Init(PORTD_BASE_PTR,1,0,2,0);
LPLD_GPIO_Init(PORTD_BASE_PTR,2,0,2,0);
LPLD_GPIO_Init(PORTD_BASE_PTR,3,0,2,0);
LPLD_GPIO_Init(PORTD_BASE_PTR,4,0,2,0);
LPLD_GPIO_Init(PORTD_BASE_PTR,5,0,2,0);
LPLD_GPIO_Init(PORTD_BASE_PTR,6,0,2,0);
LPLD_GPIO_Init(PORTD_BASE_PTR,7,0,2,0);
LPLD_GPIO_Init(PORTC_BASE_PTR,0,0,2,1); // 選擇PTC0作為觸發端
// 配置成輸入下拉電阻的模式
// DMA上升沿觸發
LPLD_GPIO_Init(PORTB_BASE_PTR,0,0,2,9); // 選擇PTB0作為行中斷
// 配置成輸入下拉電阻的模式
// IO上升沿中斷
LPLD_GPIO_Init(PORTB_BASE_PTR,3,0,2,9); // 選擇PTB1作為場中斷
// 配置成輸入下拉電阻的模式
// IO上升沿中斷
LPLD_GPIO_SetIsr(PORTB_BASE_PTR, portb_isr); //設置PortB口的自定義中斷服務子程序
}
/********************************************************************
函數名稱:portb_isr
函數描述:IOB雙邊沿觸發產生的中斷請求
產中斷產生采集信號開始信號
___
___| |_________________________________________________________
用于采集攝像頭的行中斷,HREF 信號如下
________________________
________| |_______________________________
|->有效數據,啟動DMA, |->一行數據采集完畢,
函數輸入量:無
函數輸入量:無
********************************************************************/
void portb_isr(void)
{
if((PORTB_ISFR & 0x00000001) && !Field_Over)
{
LPLD_DMA_Start(1,1); //使能通道1 DMA 請求
V_Cnt++;
}
else if(PORTB_ISFR & 0x00000008)
{
LPLD_DMA_Init(&User_Def_DMA_Init); //初始化DMA模塊
V_Cnt=0; //行采集計數清零
Field_Over=0; //場采集完成清零
}
}
void dma1_isr(void)
{
if(V_Cnt==V)
{
Field_Over=1; //場采集完成置位
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -