diff --git a/Example/1-ADC_Demo/Libraries/doc/version.txt b/Example/1-ADC_Demo/Libraries/doc/version.txt index b85cd50..a42bc58 100644 --- a/Example/1-ADC_Demo/Libraries/doc/version.txt +++ b/Example/1-ADC_Demo/Libraries/doc/version.txt @@ -1,9 +1,17 @@ V1.0.0 - 初始版本 + 初始版本 V1.0.1 对总钻风摄像头的场中断进行修改,判断标志位为0才采集下一幅图像,避免出现访问冲突 修改SPI初始化中的错误,引用了固定的SPI2基地址 修复STM中无法使用STM1的问题 - 修复gtm pwm中最大占空比只有GTM_ATOM0_PWM_DUTY_MAX设置有效的问题 \ No newline at end of file + 修复gtm pwm中最大占空比只有GTM_ATOM0_PWM_DUTY_MAX设置有效的问题 + +V1.0.2 + 修改模拟IIC默认延时时间为20 + 添加 需要特别注意P20_2是不能用于输出的,仅仅只有输入的功能 注意事项 + 将摄像头采集DMA改为link传输,可以大大降低DMA中断次数 + 修改默认的软件IIC引脚定义 + 将6050等 需要用到软件IIC的模块,在初始化函数中默认调用模拟IIC初始化 + 添加小钻风驱动程序 \ No newline at end of file diff --git a/Example/1-ADC_Demo/Libraries/seekfree_libraries/common/common.c b/Example/1-ADC_Demo/Libraries/seekfree_libraries/common/common.c index 0460d15..ac42b19 100644 --- a/Example/1-ADC_Demo/Libraries/seekfree_libraries/common/common.c +++ b/Example/1-ADC_Demo/Libraries/seekfree_libraries/common/common.c @@ -22,7 +22,7 @@ #include "SysSe/Bsp/Bsp.h" #include "common.h" -uint8 camera_type; +uint8 camera_type; //摄像头型号 1:总钻风 2:凌瞳(暂未支持)3:小钻风 diff --git a/Example/1-ADC_Demo/Libraries/seekfree_libraries/common/common.h b/Example/1-ADC_Demo/Libraries/seekfree_libraries/common/common.h index fe7ec63..13d03cd 100644 --- a/Example/1-ADC_Demo/Libraries/seekfree_libraries/common/common.h +++ b/Example/1-ADC_Demo/Libraries/seekfree_libraries/common/common.h @@ -111,7 +111,7 @@ typedef enum //枚 #include -extern uint8 camera_type; +extern uint8 camera_type; //摄像头型号 1:总钻风 2:凌瞳(暂未支持)3:小钻风 void get_clk(void); diff --git a/Example/1-ADC_Demo/Libraries/seekfree_libraries/headfile.h b/Example/1-ADC_Demo/Libraries/seekfree_libraries/headfile.h index 0e8024f..e11bd83 100644 --- a/Example/1-ADC_Demo/Libraries/seekfree_libraries/headfile.h +++ b/Example/1-ADC_Demo/Libraries/seekfree_libraries/headfile.h @@ -62,6 +62,7 @@ #include "SEEKFREE_L3G4200D.h" #include "SEEKFREE_WIRELESS.h" #include "SEEKFREE_IPS200_PARALLEL8.h" +#include "SEEKFREE_7725.h" #endif diff --git a/Example/1-ADC_Demo/Libraries/seekfree_libraries/zf_eru_dma.c b/Example/1-ADC_Demo/Libraries/seekfree_libraries/zf_eru_dma.c index f7aab10..86c0158 100644 --- a/Example/1-ADC_Demo/Libraries/seekfree_libraries/zf_eru_dma.c +++ b/Example/1-ADC_Demo/Libraries/seekfree_libraries/zf_eru_dma.c @@ -21,9 +21,18 @@ #include "IfxDma_Dma.h" #include "IfxScuEru.h" #include "isr_config.h" +#include "zf_assert.h" #include "zf_eru_dma.h" +typedef struct +{ + Ifx_DMA_CH IFX_ALIGN(256) linked_list[8];//DMA链表 + IfxDma_Dma_Channel channel; //DMA通道句柄 +}DMA_LINK; + + +DMA_LINK dma_link_list; //------------------------------------------------------------------------------------------------------------------- // @brief eru触发dma初始化 @@ -36,7 +45,7 @@ // @return void // Sample usage: //------------------------------------------------------------------------------------------------------------------- -void eru_dma_init(IfxDma_ChannelId dma_ch, uint8 *source_addr, uint8 *destination_addr, ERU_PIN_enum eru_pin, TRIGGER_enum trigger, uint16 dma_count) +uint8 eru_dma_init(IfxDma_ChannelId dma_ch, uint8 *source_addr, uint8 *destination_addr, ERU_PIN_enum eru_pin, TRIGGER_enum trigger, uint16 dma_count) { IfxDma_Dma_Channel dmaChn; //eru触发DMA通道号 在eru文件中设置eru的优先级,即为触发的通道 @@ -51,27 +60,85 @@ void eru_dma_init(IfxDma_ChannelId dma_ch, uint8 *source_addr, uint8 *destinatio IfxDma_Dma_ChannelConfig cfg; IfxDma_Dma_initChannelConfig(&cfg, &dma); - cfg.transferCount = dma_count; + uint8 list_num, i; + uint16 single_channel_dma_count; + + ZF_ASSERT(!(dma_count%8));//传输次数必须为8的倍数 + + + list_num = 1; + single_channel_dma_count = dma_count / list_num; + if(16384 < single_channel_dma_count) + { + while(TRUE) + { + single_channel_dma_count = dma_count / list_num; + if((single_channel_dma_count <= 16384) && !(dma_count % list_num)) + { + break; + } + list_num++; + if(list_num > 8) ZF_ASSERT(FALSE); + } + } + + + if(1 == list_num) + { + cfg.shadowControl = IfxDma_ChannelShadow_none; + cfg.operationMode = IfxDma_ChannelOperationMode_single; + cfg.shadowAddress = 0; + } + else + { + cfg.shadowControl = IfxDma_ChannelShadow_linkedList; + cfg.operationMode = IfxDma_ChannelOperationMode_continuous; + cfg.shadowAddress = IFXCPU_GLB_ADDR_DSPR(IfxCpu_getCoreId(), (unsigned)&dma_link_list.linked_list[1]); + } + cfg.requestMode = IfxDma_ChannelRequestMode_oneTransferPerRequest; cfg.moveSize = IfxDma_ChannelMoveSize_8bit; + cfg.busPriority = IfxDma_ChannelBusPriority_high; - cfg.busPriority = IfxDma_ChannelBusPriority_high; - - cfg.sourceAddress = (unsigned)(source_addr); + cfg.sourceAddress = IFXCPU_GLB_ADDR_DSPR(IfxCpu_getCoreId(), source_addr); cfg.sourceAddressCircularRange = IfxDma_ChannelIncrementCircular_none; cfg.sourceCircularBufferEnabled = TRUE; - cfg.destinationAddress = IFXCPU_GLB_ADDR_DSPR(IfxCpu_getCoreId(), destination_addr); cfg.destinationAddressIncrementStep = IfxDma_ChannelIncrementStep_1; - cfg.operationMode = IfxDma_ChannelOperationMode_single; - cfg.channelId = (IfxDma_ChannelId)dma_ch; - cfg.hardwareRequestEnabled = TRUE; - cfg.channelInterruptEnabled = TRUE; + cfg.channelId = (IfxDma_ChannelId)dma_ch; + cfg.hardwareRequestEnabled = FALSE; + cfg.channelInterruptEnabled = TRUE; cfg.channelInterruptPriority = ERU_DMA_INT_PRIO; cfg.channelInterruptTypeOfService = (IfxSrc_Tos)ERU_DMA_INT_SERVICE; + + + cfg.destinationAddress = IFXCPU_GLB_ADDR_DSPR(IfxCpu_getCoreId(), destination_addr); + + cfg.transferCount = single_channel_dma_count; + IfxDma_Dma_initChannel(&dmaChn, &cfg); + + if(1 < list_num) + { + i = 0; + while(i < list_num) + { + cfg.destinationAddress = IFXCPU_GLB_ADDR_DSPR(IfxCpu_getCoreId(), destination_addr + single_channel_dma_count * i); + if(i == (list_num - 1)) cfg.shadowAddress = IFXCPU_GLB_ADDR_DSPR(IfxCpu_getCoreId(), (unsigned)&dma_link_list.linked_list[0]); + else cfg.shadowAddress = IFXCPU_GLB_ADDR_DSPR(IfxCpu_getCoreId(), (unsigned)&dma_link_list.linked_list[i+1]); + cfg.transferCount = single_channel_dma_count; + + IfxDma_Dma_initLinkedListEntry((void *)&dma_link_list.linked_list[i], &cfg); + i++; + } + } + + + IfxDma_Dma_getSrcPointer(&dma_link_list.channel)->B.CLRR = 1; + + return list_num; } diff --git a/Example/1-ADC_Demo/Libraries/seekfree_libraries/zf_eru_dma.h b/Example/1-ADC_Demo/Libraries/seekfree_libraries/zf_eru_dma.h index 50667ad..faef169 100644 --- a/Example/1-ADC_Demo/Libraries/seekfree_libraries/zf_eru_dma.h +++ b/Example/1-ADC_Demo/Libraries/seekfree_libraries/zf_eru_dma.h @@ -29,9 +29,9 @@ #define CLEAR_DMA_FLAG(dma_ch) IfxDma_clearChannelInterrupt(&MODULE_DMA, dma_ch); -#define DMA_SET_DESTINATION(dma_ch, destination_addr) IfxDma_setChannelDestinationAddress(&MODULE_DMA, dma_ch, (void *)destination_addr) +#define DMA_SET_DESTINATION(dma_ch, destination_addr) IfxDma_setChannelDestinationAddress(&MODULE_DMA, dma_ch, (void *)IFXCPU_GLB_ADDR_DSPR(IfxCpu_getCoreId(), destination_addr)) -void eru_dma_init(IfxDma_ChannelId dma_ch, uint8 *source_addr, uint8 *destination_addr, ERU_PIN_enum eru_pin, TRIGGER_enum trigger, uint16 dma_count); +uint8 eru_dma_init(IfxDma_ChannelId dma_ch, uint8 *source_addr, uint8 *destination_addr, ERU_PIN_enum eru_pin, TRIGGER_enum trigger, uint16 dma_count); void dma_stop(IfxDma_ChannelId dma_ch); void dma_start(IfxDma_ChannelId dma_ch); diff --git a/Example/1-ADC_Demo/Libraries/seekfree_libraries/zf_gpio.c b/Example/1-ADC_Demo/Libraries/seekfree_libraries/zf_gpio.c index 3c937cf..1d2466c 100644 --- a/Example/1-ADC_Demo/Libraries/seekfree_libraries/zf_gpio.c +++ b/Example/1-ADC_Demo/Libraries/seekfree_libraries/zf_gpio.c @@ -60,6 +60,7 @@ Ifx_P* get_port(PIN_enum pin) // @param pinmode 引脚配置(可设置参数由zf_gpio.h文件内GPIOMODE_enum枚举值确定) // @return void // Sample usage: gpio_init(P00_0, GPO, 1, PUSHPULL);//P00_0初始化为GPIO功能、输出模式、输出高电平、推挽输出 +// @note 需要特别注意P20_2是不能用于输出的,仅仅只有输入的功能 //------------------------------------------------------------------------------------------------------------------- void gpio_init(PIN_enum pin, GPIODIR_enum dir, uint8 dat, GPIOMODE_enum pinmode) { diff --git a/Example/1-ADC_Demo/Libraries/seekfree_libraries/zf_gpio.h b/Example/1-ADC_Demo/Libraries/seekfree_libraries/zf_gpio.h index cfbd666..e3d144f 100644 --- a/Example/1-ADC_Demo/Libraries/seekfree_libraries/zf_gpio.h +++ b/Example/1-ADC_Demo/Libraries/seekfree_libraries/zf_gpio.h @@ -38,6 +38,15 @@ typedef enum // 枚 #define GET_PORT_IN_ADDR(pin) (uint8 *)(&IfxPort_getAddress((IfxPort_Index)(pin/32))->IN + pin%32/8) + + +//需要特别注意P20_2是不能用于输出的,仅仅只有输入的功能 +//需要特别注意P20_2是不能用于输出的,仅仅只有输入的功能 +//需要特别注意P20_2是不能用于输出的,仅仅只有输入的功能 + + + + //------------------------------------------------------ //通用GPIO操作 void gpio_init(PIN_enum pin, GPIODIR_enum dir, uint8 dat, GPIOMODE_enum pinconf); diff --git a/Example/1-ADC_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.c b/Example/1-ADC_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.c new file mode 100644 index 0000000..806b8d9 --- /dev/null +++ b/Example/1-ADC_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.c @@ -0,0 +1,262 @@ +/********************************************************************************************************************* + * COPYRIGHT NOTICE + * Copyright (c) 2020,逐飞科技 + * All rights reserved. + * 技术讨论QQ群:三群:824575535 + * + * 以下所有内容版权均属逐飞科技所有,未经允许不得用于商业用途, + * 欢迎各位使用并传播本程序,修改内容时必须保留逐飞科技的版权声明。 + * + * @file main + * @company 成都逐飞科技有限公司 + * @author 逐飞科技(QQ3184284598) + * @version 查看doc内version文件 版本说明 + * @Software tasking v6.3r1 + * @Target core TC264D + * @Taobao https://seekfree.taobao.com/ + * @date 2020-3-23 + * @note + 接线定义: + ------------------------------------ + 模块管脚 单片机管脚 + SDA 查看SEEKFREE_IIC文件内的SEEKFREE_SDA宏定义 + SCL 查看SEEKFREE_IIC文件内的SEEKFREE_SCL宏定义 + 场中断(VSY) 查看SEEKFREE_OV7725.h文件中的OV7725_VSYNC_PIN宏定义 + 行中断(HREF) 未使用,因此不接 + 像素中断(PCLK) 查看SEEKFREE_OV7725.h文件中的OV7725_PCLK_PIN宏定义 + 数据口(D0-D7) 查看SEEKFREE_OV7725.h文件中的OV7725_DATA_PIN宏定义 + ------------------------------------ + + 默认分辨率是 160*120 + 默认FPS 50帧 + ********************************************************************************************************************/ + + +#include "IfxDma.h" +#include "IfxScuEru.h" +#include "zf_stm_systick.h" +#include "zf_gpio.h" +#include "zf_eru.h" +#include "zf_eru_dma.h" +#include "SEEKFREE_IIC.h" +#include "SEEKFREE_7725.h" + + + +IFX_ALIGN(4) uint8 image_bin[OV7725_H][OV7725_W/8]; //定义存储接收图像的数组 +uint8 image_dec[OV7725_H][OV7725_W]; + +uint8 ov7725_idcode = 0; + +//------------------------------------------------------------------------------------------------------------------- +// @brief 小钻风摄像头内部寄存器初始化(内部使用,用户无需调用) +// @param NULL +// @return uint8 返回0则出错,返回1则成功 +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +uint8 ov7725_reg_init(void) +{ + simiic_delay_set(500); + simiic_write_reg ( OV7725_DEV_ADD, OV7725_COM7, 0x80 ); //复位摄像头 + systick_delay_ms(STM0, 50); + ov7725_idcode = simiic_read_reg( OV7725_DEV_ADD, OV7725_VER ,SCCB); + if( ov7725_idcode != OV7725_ID ) return 0; //校验摄像头ID号 + + //ID号确认无误 然后配置寄存器 + simiic_write_reg(OV7725_DEV_ADD, OV7725_COM4 , 0xC1); + simiic_write_reg(OV7725_DEV_ADD, OV7725_CLKRC , 0x01); + simiic_write_reg(OV7725_DEV_ADD, OV7725_COM2 , 0x03); + simiic_write_reg(OV7725_DEV_ADD, OV7725_COM3 , 0xD0); + simiic_write_reg(OV7725_DEV_ADD, OV7725_COM7 , 0x40); + simiic_write_reg(OV7725_DEV_ADD, OV7725_COM8 , 0xCE); //0xCE:关闭自动曝光 0xCF:开启自动曝光 + simiic_write_reg(OV7725_DEV_ADD, OV7725_HSTART , 0x3F); + simiic_write_reg(OV7725_DEV_ADD, OV7725_HSIZE , 0x50); + simiic_write_reg(OV7725_DEV_ADD, OV7725_VSTRT , 0x03); + simiic_write_reg(OV7725_DEV_ADD, OV7725_VSIZE , 0x78); + simiic_write_reg(OV7725_DEV_ADD, OV7725_HREF , 0x00); + simiic_write_reg(OV7725_DEV_ADD, OV7725_SCAL0 , 0x0A); + simiic_write_reg(OV7725_DEV_ADD, OV7725_AWB_Ctrl0 , 0xE0); + simiic_write_reg(OV7725_DEV_ADD, OV7725_DSPAuto , 0xff); + simiic_write_reg(OV7725_DEV_ADD, OV7725_DSP_Ctrl2 , 0x0C); + simiic_write_reg(OV7725_DEV_ADD, OV7725_DSP_Ctrl3 , 0x00); + simiic_write_reg(OV7725_DEV_ADD, OV7725_DSP_Ctrl4 , 0x00); + + if(OV7725_W == 80) simiic_write_reg(OV7725_DEV_ADD, OV7725_HOutSize , 0x14); + else if(OV7725_W == 160) simiic_write_reg(OV7725_DEV_ADD, OV7725_HOutSize , 0x28); + else if(OV7725_W == 240) simiic_write_reg(OV7725_DEV_ADD, OV7725_HOutSize , 0x3c); + else if(OV7725_W == 320) simiic_write_reg(OV7725_DEV_ADD, OV7725_HOutSize , 0x50); + + if(OV7725_H == 60) simiic_write_reg(OV7725_DEV_ADD, OV7725_VOutSize , 0x1E); + else if(OV7725_H == 120) simiic_write_reg(OV7725_DEV_ADD, OV7725_VOutSize , 0x3c); + else if(OV7725_H == 180) simiic_write_reg(OV7725_DEV_ADD, OV7725_VOutSize , 0x5a); + else if(OV7725_H == 240) simiic_write_reg(OV7725_DEV_ADD, OV7725_VOutSize , 0x78); + + simiic_write_reg(OV7725_DEV_ADD, OV7725_REG28 , 0x01); + simiic_write_reg(OV7725_DEV_ADD, OV7725_EXHCH , 0x10); + simiic_write_reg(OV7725_DEV_ADD, OV7725_EXHCL , 0x1F); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM1 , 0x0c); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM2 , 0x16); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM3 , 0x2a); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM4 , 0x4e); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM5 , 0x61); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM6 , 0x6f); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM7 , 0x7b); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM8 , 0x86); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM9 , 0x8e); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM10 , 0x97); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM11 , 0xa4); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM12 , 0xaf); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM13 , 0xc5); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM14 , 0xd7); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM15 , 0xe8); + simiic_write_reg(OV7725_DEV_ADD, OV7725_SLOP , 0x20); + simiic_write_reg(OV7725_DEV_ADD, OV7725_LC_RADI , 0x00); + simiic_write_reg(OV7725_DEV_ADD, OV7725_LC_COEF , 0x13); + simiic_write_reg(OV7725_DEV_ADD, OV7725_LC_XC , 0x08); + simiic_write_reg(OV7725_DEV_ADD, OV7725_LC_COEFB , 0x14); + simiic_write_reg(OV7725_DEV_ADD, OV7725_LC_COEFR , 0x17); + simiic_write_reg(OV7725_DEV_ADD, OV7725_LC_CTR , 0x05); + simiic_write_reg(OV7725_DEV_ADD, OV7725_BDBase , 0x99); + simiic_write_reg(OV7725_DEV_ADD, OV7725_BDMStep , 0x03); + simiic_write_reg(OV7725_DEV_ADD, OV7725_SDE , 0x04); + simiic_write_reg(OV7725_DEV_ADD, OV7725_BRIGHT , 0x00); + simiic_write_reg(OV7725_DEV_ADD, OV7725_CNST , 0x40); + simiic_write_reg(OV7725_DEV_ADD, OV7725_SIGN , 0x06); + simiic_write_reg(OV7725_DEV_ADD, OV7725_UVADJ0 , 0x11); + simiic_write_reg(OV7725_DEV_ADD, OV7725_UVADJ1 , 0x02); + + + simiic_delay_set(SIMIIC_DELAY_TIME);//修改为默认的20 + return 1; + + +} + + + + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 小钻风摄像头采集程序初始化(内部使用,用户无需调用) +// @param NULL +// @return void +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +void ov7725_port_init(void) +{ + uint8 i; + camera_type = 3;//设置连接摄像头类型 + + //摄像头采集初始化 + //初始化 数据引脚 + for(i=0; i<8; i++) + { + gpio_init((PIN_enum)(OV7725_DATA_PIN+i), GPI, 0, PULLUP); + } + eru_dma_init(OV7725_DMA_CH, GET_PORT_IN_ADDR(OV7725_DATA_PIN), image_bin[0], OV7725_PCLK_PIN, FALLING, OV7725_DMA_NUM); + eru_init(OV7725_VSYNC_PIN, FALLING); //初始化场中断,并设置为下降沿触发中断 + +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 小钻风摄像头初始化(调用之后设置好相关中断函数即可采集图像) +// @param NULL +// @return 0 +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +uint8 ov7725_init(void) +{ + simiic_init(); + ov7725_reg_init(); //摄像头寄存器配置 + ov7725_port_init(); //摄像头中断引脚及DMA配置 + return 0; +} + + + + +uint8 ov7725_finish_flag = 0; +//------------------------------------------------------------------------------------------------------------------- +// @brief 小钻风摄像头场中断 +// @param NULL +// @return void +// @since v1.0 +// Sample usage: 此函数在isr.c中被eru(GPIO中断)中断调用 +//------------------------------------------------------------------------------------------------------------------- +void ov7725_vsync(void) +{ + CLEAR_GPIO_FLAG(OV7725_VSYNC_PIN); + + if(!ov7725_finish_flag)//查看图像数组是否使用完毕,如果未使用完毕则不开始采集,避免出现访问冲突 + { + DMA_SET_DESTINATION(OV7725_DMA_CH, image_bin[0]); + dma_start(OV7725_DMA_CH); + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 小钻风摄像头DMA完成中断 +// @param NULL +// @return void +// @since v1.0 +// Sample usage: 此函数在isr.c中被dma中断调用 +//------------------------------------------------------------------------------------------------------------------- +void ov7725_dma(void) +{ + CLEAR_DMA_FLAG(OV7725_DMA_CH); + ov7725_finish_flag = 1; + dma_stop(OV7725_DMA_CH); +} + + + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 小钻风摄像头数据解压函数 +// @param *data1 源地址 +// @param *data2 目的地址 +// @return void +// @since v1.0 +// Sample usage: Image_Decompression(da1,dat2[0]);//将一维数组dat1的内容解压到二维数组dat2里. +//------------------------------------------------------------------------------------------------------------------- +void image_decompression(uint8 *data1,uint8 *data2) +{ + uint8 temp[2] = {0,255}; + uint16 lenth = OV7725_SIZE; + uint8 i = 8; + + + while(lenth--) + { + i = 8; + while(i--) + { + *data2++ = temp[(*data1 >> i) & 0x01]; + } + data1++; + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 小钻风摄像头未解压图像发送至上位机查看图像 +// @param *imgaddr 压缩图像数据地址 +// @param *imgsize 图像大小(直接填写OV7725_SIZE) +// @return void +// @since v1.0 +// Sample usage: 调用该函数前请先初始化uart2 +//------------------------------------------------------------------------------------------------------------------- +void seekfree_sendimg_7725(UARTN_enum uartn) +{ + uart_putchar(uartn, 0x00);uart_putchar(uartn, 0xff);uart_putchar(uartn, 0x01);uart_putchar(uartn, 0x01);//发送四个字节命令 + uart_putbuff(uartn, image_bin[0], OV7725_SIZE); //再发送图像 +} + + + + diff --git a/Example/1-ADC_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.h b/Example/1-ADC_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.h new file mode 100644 index 0000000..e513250 --- /dev/null +++ b/Example/1-ADC_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.h @@ -0,0 +1,243 @@ +/********************************************************************************************************************* + * COPYRIGHT NOTICE + * Copyright (c) 2020,逐飞科技 + * All rights reserved. + * 技术讨论QQ群:三群:824575535 + * + * 以下所有内容版权均属逐飞科技所有,未经允许不得用于商业用途, + * 欢迎各位使用并传播本程序,修改内容时必须保留逐飞科技的版权声明。 + * + * @file main + * @company 成都逐飞科技有限公司 + * @author 逐飞科技(QQ3184284598) + * @version 查看doc内version文件 版本说明 + * @Software tasking v6.3r1 + * @Target core TC264D + * @Taobao https://seekfree.taobao.com/ + * @date 2020-3-23 + * @note + 接线定义: + ------------------------------------ + 模块管脚 单片机管脚 + SDA 查看SEEKFREE_IIC文件内的SEEKFREE_SDA宏定义 + SCL 查看SEEKFREE_IIC文件内的SEEKFREE_SCL宏定义 + 场中断(VSY) 查看SEEKFREE_OV7725.h文件中的OV7725_VSYNC_PIN宏定义 + 行中断(HREF) 未使用,因此不接 + 像素中断(PCLK) 查看SEEKFREE_OV7725.h文件中的OV7725_PCLK_PIN宏定义 + 数据口(D0-D7) 查看SEEKFREE_OV7725.h文件中的OV7725_DATA_PIN宏定义 + ------------------------------------ + + 默认分辨率是 160*120 + 默认FPS 50帧 + ********************************************************************************************************************/ + + + +#ifndef _SEEKFREE_7725_h +#define _SEEKFREE_7725_h + +#include "common.h" +#include "IfxDma_cfg.h" +#include "zf_uart.h" + + +//摄像头ID号 +#define OV7725_ID 0x21 + +//摄像头寄存器 +#define OV7725_GAIN 0x00 +#define OV7725_BLUE 0x01 +#define OV7725_RED 0x02 +#define OV7725_GREEN 0x03 +#define OV7725_BAVG 0x05 +#define OV7725_GAVG 0x06 +#define OV7725_RAVG 0x07 +#define OV7725_AECH 0x08 +#define OV7725_COM2 0x09 +#define OV7725_PID 0x0A +#define OV7725_VER 0x0B +#define OV7725_COM3 0x0C +#define OV7725_COM4 0x0D +#define OV7725_COM5 0x0E +#define OV7725_COM6 0x0F +#define OV7725_AEC 0x10 +#define OV7725_CLKRC 0x11 +#define OV7725_COM7 0x12 +#define OV7725_COM8 0x13 +#define OV7725_COM9 0x14 +#define OV7725_COM10 0x15 +#define OV7725_REG16 0x16 +#define OV7725_HSTART 0x17 +#define OV7725_HSIZE 0x18 +#define OV7725_VSTRT 0x19 +#define OV7725_VSIZE 0x1A +#define OV7725_PSHFT 0x1B +#define OV7725_MIDH 0x1C +#define OV7725_MIDL 0x1D +#define OV7725_LAEC 0x1F +#define OV7725_COM11 0x20 +#define OV7725_BDBase 0x22 +#define OV7725_BDMStep 0x23 +#define OV7725_AEW 0x24 +#define OV7725_AEB 0x25 +#define OV7725_VPT 0x26 +#define OV7725_REG28 0x28 +#define OV7725_HOutSize 0x29 +#define OV7725_EXHCH 0x2A +#define OV7725_EXHCL 0x2B +#define OV7725_VOutSize 0x2C +#define OV7725_ADVFL 0x2D +#define OV7725_ADVFH 0x2E +#define OV7725_YAVE 0x2F +#define OV7725_LumHTh 0x30 +#define OV7725_LumLTh 0x31 +#define OV7725_HREF 0x32 +#define OV7725_DM_LNL 0x33 +#define OV7725_DM_LNH 0x34 +#define OV7725_ADoff_B 0x35 +#define OV7725_ADoff_R 0x36 +#define OV7725_ADoff_Gb 0x37 +#define OV7725_ADoff_Gr 0x38 +#define OV7725_Off_B 0x39 +#define OV7725_Off_R 0x3A +#define OV7725_Off_Gb 0x3B +#define OV7725_Off_Gr 0x3C +#define OV7725_COM12 0x3D +#define OV7725_COM13 0x3E +#define OV7725_COM14 0x3F +#define OV7725_COM16 0x41 +#define OV7725_TGT_B 0x42 +#define OV7725_TGT_R 0x43 +#define OV7725_TGT_Gb 0x44 +#define OV7725_TGT_Gr 0x45 +#define OV7725_LC_CTR 0x46 +#define OV7725_LC_XC 0x47 +#define OV7725_LC_YC 0x48 +#define OV7725_LC_COEF 0x49 +#define OV7725_LC_RADI 0x4A +#define OV7725_LC_COEFB 0x4B +#define OV7725_LC_COEFR 0x4C +#define OV7725_FixGain 0x4D +#define OV7725_AREF1 0x4F +#define OV7725_AREF6 0x54 +#define OV7725_UFix 0x60 +#define OV7725_VFix 0x61 +#define OV7725_AWBb_blk 0x62 +#define OV7725_AWB_Ctrl0 0x63 +#define OV7725_DSP_Ctrl1 0x64 +#define OV7725_DSP_Ctrl2 0x65 +#define OV7725_DSP_Ctrl3 0x66 +#define OV7725_DSP_Ctrl4 0x67 +#define OV7725_AWB_bias 0x68 +#define OV7725_AWBCtrl1 0x69 +#define OV7725_AWBCtrl2 0x6A +#define OV7725_AWBCtrl3 0x6B +#define OV7725_AWBCtrl4 0x6C +#define OV7725_AWBCtrl5 0x6D +#define OV7725_AWBCtrl6 0x6E +#define OV7725_AWBCtrl7 0x6F +#define OV7725_AWBCtrl8 0x70 +#define OV7725_AWBCtrl9 0x71 +#define OV7725_AWBCtrl10 0x72 +#define OV7725_AWBCtrl11 0x73 +#define OV7725_AWBCtrl12 0x74 +#define OV7725_AWBCtrl13 0x75 +#define OV7725_AWBCtrl14 0x76 +#define OV7725_AWBCtrl15 0x77 +#define OV7725_AWBCtrl16 0x78 +#define OV7725_AWBCtrl17 0x79 +#define OV7725_AWBCtrl18 0x7A +#define OV7725_AWBCtrl19 0x7B +#define OV7725_AWBCtrl20 0x7C +#define OV7725_AWBCtrl21 0x7D +#define OV7725_GAM1 0x7E +#define OV7725_GAM2 0x7F +#define OV7725_GAM3 0x80 +#define OV7725_GAM4 0x81 +#define OV7725_GAM5 0x82 +#define OV7725_GAM6 0x83 +#define OV7725_GAM7 0x84 +#define OV7725_GAM8 0x85 +#define OV7725_GAM9 0x86 +#define OV7725_GAM10 0x87 +#define OV7725_GAM11 0x88 +#define OV7725_GAM12 0x89 +#define OV7725_GAM13 0x8A +#define OV7725_GAM14 0x8B +#define OV7725_GAM15 0x8C +#define OV7725_SLOP 0x8D +#define OV7725_DNSTh 0x8E +#define OV7725_EDGE0 0x8F +#define OV7725_EDGE1 0x90 +#define OV7725_DNSOff 0x91 +#define OV7725_EDGE2 0x92 +#define OV7725_EDGE3 0x93 +#define OV7725_MTX1 0x94 +#define OV7725_MTX2 0x95 +#define OV7725_MTX3 0x96 +#define OV7725_MTX4 0x97 +#define OV7725_MTX5 0x98 +#define OV7725_MTX6 0x99 +#define OV7725_MTX_Ctrl 0x9A +#define OV7725_BRIGHT 0x9B +#define OV7725_CNST 0x9C +#define OV7725_UVADJ0 0x9E +#define OV7725_UVADJ1 0x9F +#define OV7725_SCAL0 0xA0 +#define OV7725_SCAL1 0xA1 +#define OV7725_SCAL2 0xA2 +#define OV7725_SDE 0xA6 +#define OV7725_USAT 0xA7 +#define OV7725_VSAT 0xA8 +#define OV7725_HUECOS 0xA9 +#define OV7725_HUESIN 0xAA +#define OV7725_SIGN 0xAB +#define OV7725_DSPAuto 0xAC + + +#define OV7725_DEV_ADD 0x42>>1 + + +//配置摄像头参数 +#define OV7725_W 160 //定义摄像头图像宽度 可设置参数 80 160 240 320 +#define OV7725_H 120 //定义摄像头图像高度 可设置参数 60 120 180 240 +#define OV7725_SIZE (OV7725_W * OV7725_H/8 ) //图像占用空间大小 +#define OV7725_DMA_NUM (OV7725_SIZE) //一副图像DMA采集次数 + + +//-------------------------------------------------------------------------------------------------- +//引脚配置 +//-------------------------------------------------------------------------------------------------- +#define OV7725_VSYNC_PIN ERU_CH3_REQ6_P02_0 //场中断引脚 可选范围参考ERU_PIN_enum枚举 不可与像素引脚选择为同一个通道,或者是共用中断的通道 + //例如场中断选择ERU_CH3 那么像素引脚就不能选择ERU_CH7,因为3和7的中断是共用的。 + +#define OV7725_DATA_PIN P00_0 //定义D0数据引脚 假设D0定义为P00_0 那么D1所使用的引脚则为P00_1,依次类推 + //可设置参数P00_0、P02_0、P15_0,不能设置为其他参数 + +#define OV7725_PCLK_PIN ERU_CH2_REQ14_P02_1 //定义像素时钟引脚 可选范围参考ERU_PIN_enum枚举 不可与场中断引脚选择为同一个通道,或者是共用中断的通道 + //例如场中断选择ERU_CH3 那么像素引脚就不能选择ERU_CH7,因为3和7的中断是共用的。 + +#define OV7725_DMA_CH IfxDma_ChannelId_5 //定义使用的DMA通道 0-47可选 通道号越大优先级越低 + //修改此处之后,需要修改对应的ERU中断优先级,例如此处设置为IfxDma_ChannelId_5则对应的ERU中断优先级应该设置为5 + + + +extern uint8 image_bin[OV7725_H][OV7725_W/8]; //定义存储接收图像的数组 +extern uint8 image_dec[OV7725_H][OV7725_W]; //图像解压后的数组 + +extern uint8 ov7725_finish_flag; //图像采集完成标志位 + + +//函数声明 +uint8 ov7725_init(void); +void ov7725_vsync(void); +void ov7725_dma(void); +void image_decompression(uint8 *data1,uint8 *data2); +void seekfree_sendimg_7725(UARTN_enum uartn); + + + +#endif + + + diff --git a/Example/1-ADC_Demo/Libraries/seekfree_peripheral/SEEKFREE_ICM20602.c b/Example/1-ADC_Demo/Libraries/seekfree_peripheral/SEEKFREE_ICM20602.c index 095f9e3..5d167c9 100644 --- a/Example/1-ADC_Demo/Libraries/seekfree_peripheral/SEEKFREE_ICM20602.c +++ b/Example/1-ADC_Demo/Libraries/seekfree_peripheral/SEEKFREE_ICM20602.c @@ -68,6 +68,7 @@ void icm20602_self1_check(void) //------------------------------------------------------------------------------------------------------------------- void icm20602_init(void) { + simiic_init(); systick_delay_ms(STM0, 10); //上电延时 //检测 diff --git a/Example/1-ADC_Demo/Libraries/seekfree_peripheral/SEEKFREE_IIC.c b/Example/1-ADC_Demo/Libraries/seekfree_peripheral/SEEKFREE_IIC.c index 196fd57..f56a41a 100644 --- a/Example/1-ADC_Demo/Libraries/seekfree_peripheral/SEEKFREE_IIC.c +++ b/Example/1-ADC_Demo/Libraries/seekfree_peripheral/SEEKFREE_IIC.c @@ -50,7 +50,7 @@ uint8 IIC_num; // -static uint16 simiic_delay_time=100; //ICM等传感器应设置为100 +static uint16 simiic_delay_time = SIMIIC_DELAY_TIME; //ICM等传感器应设置为20 //------------------------------------------------------------------------------------------------------------------- diff --git a/Example/1-ADC_Demo/Libraries/seekfree_peripheral/SEEKFREE_IIC.h b/Example/1-ADC_Demo/Libraries/seekfree_peripheral/SEEKFREE_IIC.h index 293a02a..6a9c1e3 100644 --- a/Example/1-ADC_Demo/Libraries/seekfree_peripheral/SEEKFREE_IIC.h +++ b/Example/1-ADC_Demo/Libraries/seekfree_peripheral/SEEKFREE_IIC.h @@ -34,8 +34,12 @@ -#define SEEKFREE_SCL P13_0 //定义SCL引脚 可任意更改为其他IO -#define SEEKFREE_SDA P13_1 //定义SDA引脚 可任意更改为其他IO +#define SEEKFREE_SCL P02_3 //定义SCL引脚 可任意更改为其他IO +#define SEEKFREE_SDA P02_2 //定义SDA引脚 可任意更改为其他IO + + +#define SIMIIC_DELAY_TIME 20 + typedef enum IIC //DAC模块 { diff --git a/Example/1-ADC_Demo/Libraries/seekfree_peripheral/SEEKFREE_L3G4200D.c b/Example/1-ADC_Demo/Libraries/seekfree_peripheral/SEEKFREE_L3G4200D.c index 0f0c23a..5deb7d3 100644 --- a/Example/1-ADC_Demo/Libraries/seekfree_peripheral/SEEKFREE_L3G4200D.c +++ b/Example/1-ADC_Demo/Libraries/seekfree_peripheral/SEEKFREE_L3G4200D.c @@ -65,6 +65,7 @@ void l3g4200d_self_check(void) //------------------------------------------------------------------------------------------------------------------- void l3g4200d_init(void) { + simiic_init(); systick_delay_ms(STM0, 50); l3g4200d_self_check(); diff --git a/Example/1-ADC_Demo/Libraries/seekfree_peripheral/SEEKFREE_MMA8451.c b/Example/1-ADC_Demo/Libraries/seekfree_peripheral/SEEKFREE_MMA8451.c index c200427..8a5eec4 100644 --- a/Example/1-ADC_Demo/Libraries/seekfree_peripheral/SEEKFREE_MMA8451.c +++ b/Example/1-ADC_Demo/Libraries/seekfree_peripheral/SEEKFREE_MMA8451.c @@ -68,6 +68,7 @@ void mma8451_self_check(void) //------------------------------------------------------------------------------------------------------------------- uint8 mma845x_init(void) { + simiic_init(); systick_delay_ms(STM0, 50); mma8451_self_check(); diff --git a/Example/1-ADC_Demo/Libraries/seekfree_peripheral/SEEKFREE_MPU6050.c b/Example/1-ADC_Demo/Libraries/seekfree_peripheral/SEEKFREE_MPU6050.c index 0317aa0..686550d 100644 --- a/Example/1-ADC_Demo/Libraries/seekfree_peripheral/SEEKFREE_MPU6050.c +++ b/Example/1-ADC_Demo/Libraries/seekfree_peripheral/SEEKFREE_MPU6050.c @@ -71,6 +71,7 @@ void mpu6050_self1_check(void) //------------------------------------------------------------------------------------------------------------------- void mpu6050_init(void) { + simiic_init(); systick_delay_ms(STM0, 100); //上电延时 mpu6050_self1_check(); diff --git a/Example/1-ADC_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.c b/Example/1-ADC_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.c index 014b435..05f181f 100644 --- a/Example/1-ADC_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.c +++ b/Example/1-ADC_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.c @@ -38,7 +38,6 @@ #include "zf_gpio.h" #include "zf_eru.h" #include "zf_eru_dma.h" -#include "stdio.h" #include "SEEKFREE_MT9V03X.h" @@ -49,6 +48,8 @@ uint8 receive[3]; uint8 receive_num = 0; vuint8 uart_receive_flag; +uint8 link_list_num; + //需要配置到摄像头的数据 int16 MT9V03X_CFG[CONFIG_FINISH][2]= { @@ -305,7 +306,7 @@ void mt9v03x_init(void) gpio_init((PIN_enum)(MT9V03X_DATA_PIN+i), GPI, 0, PULLUP); } - eru_dma_init(MT9V03X_DMA_CH, GET_PORT_IN_ADDR(MT9V03X_DATA_PIN), mt9v03x_image[0], MT9V03X_PCLK_PIN, RISING, MT9V03X_W); + link_list_num = eru_dma_init(MT9V03X_DMA_CH, GET_PORT_IN_ADDR(MT9V03X_DATA_PIN), mt9v03x_image[0], MT9V03X_PCLK_PIN, RISING, MT9V03X_W*MT9V03X_H); eru_init(MT9V03X_VSYNC_PIN, FALLING); //初始化场中断,并设置为下降沿触发中断 restoreInterrupts(interrupt_state); @@ -313,7 +314,6 @@ void mt9v03x_init(void) uint8 mt9v03x_finish_flag = 0; //一场图像采集完成标志位 -uint8 now_col; //当前正在采集的行 //------------------------------------------------------------------------------------------------------------------- // @brief MT9V03X摄像头场中断 // @param NULL @@ -324,16 +324,15 @@ uint8 now_col; // void mt9v03x_vsync(void) { CLEAR_GPIO_FLAG(MT9V03X_VSYNC_PIN); - now_col = 0; + if(!mt9v03x_finish_flag)//查看图像数组是否使用完毕,如果未使用完毕则不开始采集,避免出现访问冲突 { - DMA_SET_DESTINATION(MT9V03X_DMA_CH, (void *)&mt9v03x_image[0]); dma_start(MT9V03X_DMA_CH); } } - +uint8 mt9v03x_dma_int_num; //当前DMA中断次数 //------------------------------------------------------------------------------------------------------------------- // @brief MT9V03X摄像头DMA完成中断 // @param NULL @@ -344,16 +343,15 @@ void mt9v03x_vsync(void) void mt9v03x_dma(void) { CLEAR_DMA_FLAG(MT9V03X_DMA_CH); + mt9v03x_dma_int_num++; - now_col++; - - if(MT9V03X_H > now_col) - { - dma_start(MT9V03X_DMA_CH); - } - else + if(mt9v03x_dma_int_num >= link_list_num) { + //采集完成 + mt9v03x_dma_int_num = 0; mt9v03x_finish_flag = 1;//一副图像从采集开始到采集结束耗时3.8MS左右(50FPS、188*120分辨率) + dma_stop(MT9V03X_DMA_CH); + } } diff --git a/Example/1-ADC_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.h b/Example/1-ADC_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.h index a29edd2..0c8a785 100644 --- a/Example/1-ADC_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.h +++ b/Example/1-ADC_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.h @@ -63,9 +63,7 @@ //例如场中断选择ERU_CH3 那么像素引脚就不能选择ERU_CH7,因为3和7的中断是共用的。 #define MT9V03X_DMA_CH IfxDma_ChannelId_5 //定义使用的DMA通道 0-47可选 通道号越大优先级越低 - //修改此处之后,需要修改对应的ERU中断优先级,例如此处设置为IfxDma_ChannelId_5则对应的ERU中断优先级应该设置为5 - - + //摄像头命令枚举 typedef enum { diff --git a/Example/1-ADC_Demo/USER/isr.c b/Example/1-ADC_Demo/USER/isr.c index 15666f2..c6376b0 100644 --- a/Example/1-ADC_Demo/USER/isr.c +++ b/Example/1-ADC_Demo/USER/isr.c @@ -98,7 +98,8 @@ IFX_INTERRUPT(eru_ch3_ch7_isr, ERU_CH3_CH7_INT_SERVICE, ERU_CH3_CH7_INT_PRIO) if(GET_GPIO_FLAG(ERU_CH3_REQ6_P02_0))//通道3中断 { CLEAR_GPIO_FLAG(ERU_CH3_REQ6_P02_0); - if(1 == camera_type)mt9v03x_vsync(); + if (1 == camera_type) mt9v03x_vsync(); + else if (3 == camera_type) ov7725_vsync(); } if(GET_GPIO_FLAG(ERU_CH7_REQ16_P15_1))//通道7中断 @@ -113,7 +114,8 @@ IFX_INTERRUPT(eru_ch3_ch7_isr, ERU_CH3_CH7_INT_SERVICE, ERU_CH3_CH7_INT_PRIO) IFX_INTERRUPT(dma_ch5_isr, ERU_DMA_INT_SERVICE, ERU_DMA_INT_PRIO) { - if(1 == camera_type) mt9v03x_dma(); + if (1 == camera_type) mt9v03x_dma(); + else if (3 == camera_type) ov7725_dma(); } diff --git a/Example/10-Interrupt_Priority_Set_Demo/Libraries/doc/version.txt b/Example/10-Interrupt_Priority_Set_Demo/Libraries/doc/version.txt index b85cd50..a42bc58 100644 --- a/Example/10-Interrupt_Priority_Set_Demo/Libraries/doc/version.txt +++ b/Example/10-Interrupt_Priority_Set_Demo/Libraries/doc/version.txt @@ -1,9 +1,17 @@ V1.0.0 - 初始版本 + 初始版本 V1.0.1 对总钻风摄像头的场中断进行修改,判断标志位为0才采集下一幅图像,避免出现访问冲突 修改SPI初始化中的错误,引用了固定的SPI2基地址 修复STM中无法使用STM1的问题 - 修复gtm pwm中最大占空比只有GTM_ATOM0_PWM_DUTY_MAX设置有效的问题 \ No newline at end of file + 修复gtm pwm中最大占空比只有GTM_ATOM0_PWM_DUTY_MAX设置有效的问题 + +V1.0.2 + 修改模拟IIC默认延时时间为20 + 添加 需要特别注意P20_2是不能用于输出的,仅仅只有输入的功能 注意事项 + 将摄像头采集DMA改为link传输,可以大大降低DMA中断次数 + 修改默认的软件IIC引脚定义 + 将6050等 需要用到软件IIC的模块,在初始化函数中默认调用模拟IIC初始化 + 添加小钻风驱动程序 \ No newline at end of file diff --git a/Example/10-Interrupt_Priority_Set_Demo/Libraries/seekfree_libraries/common/common.c b/Example/10-Interrupt_Priority_Set_Demo/Libraries/seekfree_libraries/common/common.c index 0460d15..ac42b19 100644 --- a/Example/10-Interrupt_Priority_Set_Demo/Libraries/seekfree_libraries/common/common.c +++ b/Example/10-Interrupt_Priority_Set_Demo/Libraries/seekfree_libraries/common/common.c @@ -22,7 +22,7 @@ #include "SysSe/Bsp/Bsp.h" #include "common.h" -uint8 camera_type; +uint8 camera_type; //摄像头型号 1:总钻风 2:凌瞳(暂未支持)3:小钻风 diff --git a/Example/10-Interrupt_Priority_Set_Demo/Libraries/seekfree_libraries/common/common.h b/Example/10-Interrupt_Priority_Set_Demo/Libraries/seekfree_libraries/common/common.h index fe7ec63..13d03cd 100644 --- a/Example/10-Interrupt_Priority_Set_Demo/Libraries/seekfree_libraries/common/common.h +++ b/Example/10-Interrupt_Priority_Set_Demo/Libraries/seekfree_libraries/common/common.h @@ -111,7 +111,7 @@ typedef enum //枚 #include -extern uint8 camera_type; +extern uint8 camera_type; //摄像头型号 1:总钻风 2:凌瞳(暂未支持)3:小钻风 void get_clk(void); diff --git a/Example/10-Interrupt_Priority_Set_Demo/Libraries/seekfree_libraries/headfile.h b/Example/10-Interrupt_Priority_Set_Demo/Libraries/seekfree_libraries/headfile.h index 0e8024f..e11bd83 100644 --- a/Example/10-Interrupt_Priority_Set_Demo/Libraries/seekfree_libraries/headfile.h +++ b/Example/10-Interrupt_Priority_Set_Demo/Libraries/seekfree_libraries/headfile.h @@ -62,6 +62,7 @@ #include "SEEKFREE_L3G4200D.h" #include "SEEKFREE_WIRELESS.h" #include "SEEKFREE_IPS200_PARALLEL8.h" +#include "SEEKFREE_7725.h" #endif diff --git a/Example/10-Interrupt_Priority_Set_Demo/Libraries/seekfree_libraries/zf_eru_dma.c b/Example/10-Interrupt_Priority_Set_Demo/Libraries/seekfree_libraries/zf_eru_dma.c index f7aab10..86c0158 100644 --- a/Example/10-Interrupt_Priority_Set_Demo/Libraries/seekfree_libraries/zf_eru_dma.c +++ b/Example/10-Interrupt_Priority_Set_Demo/Libraries/seekfree_libraries/zf_eru_dma.c @@ -21,9 +21,18 @@ #include "IfxDma_Dma.h" #include "IfxScuEru.h" #include "isr_config.h" +#include "zf_assert.h" #include "zf_eru_dma.h" +typedef struct +{ + Ifx_DMA_CH IFX_ALIGN(256) linked_list[8];//DMA链表 + IfxDma_Dma_Channel channel; //DMA通道句柄 +}DMA_LINK; + + +DMA_LINK dma_link_list; //------------------------------------------------------------------------------------------------------------------- // @brief eru触发dma初始化 @@ -36,7 +45,7 @@ // @return void // Sample usage: //------------------------------------------------------------------------------------------------------------------- -void eru_dma_init(IfxDma_ChannelId dma_ch, uint8 *source_addr, uint8 *destination_addr, ERU_PIN_enum eru_pin, TRIGGER_enum trigger, uint16 dma_count) +uint8 eru_dma_init(IfxDma_ChannelId dma_ch, uint8 *source_addr, uint8 *destination_addr, ERU_PIN_enum eru_pin, TRIGGER_enum trigger, uint16 dma_count) { IfxDma_Dma_Channel dmaChn; //eru触发DMA通道号 在eru文件中设置eru的优先级,即为触发的通道 @@ -51,27 +60,85 @@ void eru_dma_init(IfxDma_ChannelId dma_ch, uint8 *source_addr, uint8 *destinatio IfxDma_Dma_ChannelConfig cfg; IfxDma_Dma_initChannelConfig(&cfg, &dma); - cfg.transferCount = dma_count; + uint8 list_num, i; + uint16 single_channel_dma_count; + + ZF_ASSERT(!(dma_count%8));//传输次数必须为8的倍数 + + + list_num = 1; + single_channel_dma_count = dma_count / list_num; + if(16384 < single_channel_dma_count) + { + while(TRUE) + { + single_channel_dma_count = dma_count / list_num; + if((single_channel_dma_count <= 16384) && !(dma_count % list_num)) + { + break; + } + list_num++; + if(list_num > 8) ZF_ASSERT(FALSE); + } + } + + + if(1 == list_num) + { + cfg.shadowControl = IfxDma_ChannelShadow_none; + cfg.operationMode = IfxDma_ChannelOperationMode_single; + cfg.shadowAddress = 0; + } + else + { + cfg.shadowControl = IfxDma_ChannelShadow_linkedList; + cfg.operationMode = IfxDma_ChannelOperationMode_continuous; + cfg.shadowAddress = IFXCPU_GLB_ADDR_DSPR(IfxCpu_getCoreId(), (unsigned)&dma_link_list.linked_list[1]); + } + cfg.requestMode = IfxDma_ChannelRequestMode_oneTransferPerRequest; cfg.moveSize = IfxDma_ChannelMoveSize_8bit; + cfg.busPriority = IfxDma_ChannelBusPriority_high; - cfg.busPriority = IfxDma_ChannelBusPriority_high; - - cfg.sourceAddress = (unsigned)(source_addr); + cfg.sourceAddress = IFXCPU_GLB_ADDR_DSPR(IfxCpu_getCoreId(), source_addr); cfg.sourceAddressCircularRange = IfxDma_ChannelIncrementCircular_none; cfg.sourceCircularBufferEnabled = TRUE; - cfg.destinationAddress = IFXCPU_GLB_ADDR_DSPR(IfxCpu_getCoreId(), destination_addr); cfg.destinationAddressIncrementStep = IfxDma_ChannelIncrementStep_1; - cfg.operationMode = IfxDma_ChannelOperationMode_single; - cfg.channelId = (IfxDma_ChannelId)dma_ch; - cfg.hardwareRequestEnabled = TRUE; - cfg.channelInterruptEnabled = TRUE; + cfg.channelId = (IfxDma_ChannelId)dma_ch; + cfg.hardwareRequestEnabled = FALSE; + cfg.channelInterruptEnabled = TRUE; cfg.channelInterruptPriority = ERU_DMA_INT_PRIO; cfg.channelInterruptTypeOfService = (IfxSrc_Tos)ERU_DMA_INT_SERVICE; + + + cfg.destinationAddress = IFXCPU_GLB_ADDR_DSPR(IfxCpu_getCoreId(), destination_addr); + + cfg.transferCount = single_channel_dma_count; + IfxDma_Dma_initChannel(&dmaChn, &cfg); + + if(1 < list_num) + { + i = 0; + while(i < list_num) + { + cfg.destinationAddress = IFXCPU_GLB_ADDR_DSPR(IfxCpu_getCoreId(), destination_addr + single_channel_dma_count * i); + if(i == (list_num - 1)) cfg.shadowAddress = IFXCPU_GLB_ADDR_DSPR(IfxCpu_getCoreId(), (unsigned)&dma_link_list.linked_list[0]); + else cfg.shadowAddress = IFXCPU_GLB_ADDR_DSPR(IfxCpu_getCoreId(), (unsigned)&dma_link_list.linked_list[i+1]); + cfg.transferCount = single_channel_dma_count; + + IfxDma_Dma_initLinkedListEntry((void *)&dma_link_list.linked_list[i], &cfg); + i++; + } + } + + + IfxDma_Dma_getSrcPointer(&dma_link_list.channel)->B.CLRR = 1; + + return list_num; } diff --git a/Example/10-Interrupt_Priority_Set_Demo/Libraries/seekfree_libraries/zf_eru_dma.h b/Example/10-Interrupt_Priority_Set_Demo/Libraries/seekfree_libraries/zf_eru_dma.h index 50667ad..faef169 100644 --- a/Example/10-Interrupt_Priority_Set_Demo/Libraries/seekfree_libraries/zf_eru_dma.h +++ b/Example/10-Interrupt_Priority_Set_Demo/Libraries/seekfree_libraries/zf_eru_dma.h @@ -29,9 +29,9 @@ #define CLEAR_DMA_FLAG(dma_ch) IfxDma_clearChannelInterrupt(&MODULE_DMA, dma_ch); -#define DMA_SET_DESTINATION(dma_ch, destination_addr) IfxDma_setChannelDestinationAddress(&MODULE_DMA, dma_ch, (void *)destination_addr) +#define DMA_SET_DESTINATION(dma_ch, destination_addr) IfxDma_setChannelDestinationAddress(&MODULE_DMA, dma_ch, (void *)IFXCPU_GLB_ADDR_DSPR(IfxCpu_getCoreId(), destination_addr)) -void eru_dma_init(IfxDma_ChannelId dma_ch, uint8 *source_addr, uint8 *destination_addr, ERU_PIN_enum eru_pin, TRIGGER_enum trigger, uint16 dma_count); +uint8 eru_dma_init(IfxDma_ChannelId dma_ch, uint8 *source_addr, uint8 *destination_addr, ERU_PIN_enum eru_pin, TRIGGER_enum trigger, uint16 dma_count); void dma_stop(IfxDma_ChannelId dma_ch); void dma_start(IfxDma_ChannelId dma_ch); diff --git a/Example/10-Interrupt_Priority_Set_Demo/Libraries/seekfree_libraries/zf_gpio.c b/Example/10-Interrupt_Priority_Set_Demo/Libraries/seekfree_libraries/zf_gpio.c index 3c937cf..1d2466c 100644 --- a/Example/10-Interrupt_Priority_Set_Demo/Libraries/seekfree_libraries/zf_gpio.c +++ b/Example/10-Interrupt_Priority_Set_Demo/Libraries/seekfree_libraries/zf_gpio.c @@ -60,6 +60,7 @@ Ifx_P* get_port(PIN_enum pin) // @param pinmode 引脚配置(可设置参数由zf_gpio.h文件内GPIOMODE_enum枚举值确定) // @return void // Sample usage: gpio_init(P00_0, GPO, 1, PUSHPULL);//P00_0初始化为GPIO功能、输出模式、输出高电平、推挽输出 +// @note 需要特别注意P20_2是不能用于输出的,仅仅只有输入的功能 //------------------------------------------------------------------------------------------------------------------- void gpio_init(PIN_enum pin, GPIODIR_enum dir, uint8 dat, GPIOMODE_enum pinmode) { diff --git a/Example/10-Interrupt_Priority_Set_Demo/Libraries/seekfree_libraries/zf_gpio.h b/Example/10-Interrupt_Priority_Set_Demo/Libraries/seekfree_libraries/zf_gpio.h index cfbd666..e3d144f 100644 --- a/Example/10-Interrupt_Priority_Set_Demo/Libraries/seekfree_libraries/zf_gpio.h +++ b/Example/10-Interrupt_Priority_Set_Demo/Libraries/seekfree_libraries/zf_gpio.h @@ -38,6 +38,15 @@ typedef enum // 枚 #define GET_PORT_IN_ADDR(pin) (uint8 *)(&IfxPort_getAddress((IfxPort_Index)(pin/32))->IN + pin%32/8) + + +//需要特别注意P20_2是不能用于输出的,仅仅只有输入的功能 +//需要特别注意P20_2是不能用于输出的,仅仅只有输入的功能 +//需要特别注意P20_2是不能用于输出的,仅仅只有输入的功能 + + + + //------------------------------------------------------ //通用GPIO操作 void gpio_init(PIN_enum pin, GPIODIR_enum dir, uint8 dat, GPIOMODE_enum pinconf); diff --git a/Example/10-Interrupt_Priority_Set_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.c b/Example/10-Interrupt_Priority_Set_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.c new file mode 100644 index 0000000..806b8d9 --- /dev/null +++ b/Example/10-Interrupt_Priority_Set_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.c @@ -0,0 +1,262 @@ +/********************************************************************************************************************* + * COPYRIGHT NOTICE + * Copyright (c) 2020,逐飞科技 + * All rights reserved. + * 技术讨论QQ群:三群:824575535 + * + * 以下所有内容版权均属逐飞科技所有,未经允许不得用于商业用途, + * 欢迎各位使用并传播本程序,修改内容时必须保留逐飞科技的版权声明。 + * + * @file main + * @company 成都逐飞科技有限公司 + * @author 逐飞科技(QQ3184284598) + * @version 查看doc内version文件 版本说明 + * @Software tasking v6.3r1 + * @Target core TC264D + * @Taobao https://seekfree.taobao.com/ + * @date 2020-3-23 + * @note + 接线定义: + ------------------------------------ + 模块管脚 单片机管脚 + SDA 查看SEEKFREE_IIC文件内的SEEKFREE_SDA宏定义 + SCL 查看SEEKFREE_IIC文件内的SEEKFREE_SCL宏定义 + 场中断(VSY) 查看SEEKFREE_OV7725.h文件中的OV7725_VSYNC_PIN宏定义 + 行中断(HREF) 未使用,因此不接 + 像素中断(PCLK) 查看SEEKFREE_OV7725.h文件中的OV7725_PCLK_PIN宏定义 + 数据口(D0-D7) 查看SEEKFREE_OV7725.h文件中的OV7725_DATA_PIN宏定义 + ------------------------------------ + + 默认分辨率是 160*120 + 默认FPS 50帧 + ********************************************************************************************************************/ + + +#include "IfxDma.h" +#include "IfxScuEru.h" +#include "zf_stm_systick.h" +#include "zf_gpio.h" +#include "zf_eru.h" +#include "zf_eru_dma.h" +#include "SEEKFREE_IIC.h" +#include "SEEKFREE_7725.h" + + + +IFX_ALIGN(4) uint8 image_bin[OV7725_H][OV7725_W/8]; //定义存储接收图像的数组 +uint8 image_dec[OV7725_H][OV7725_W]; + +uint8 ov7725_idcode = 0; + +//------------------------------------------------------------------------------------------------------------------- +// @brief 小钻风摄像头内部寄存器初始化(内部使用,用户无需调用) +// @param NULL +// @return uint8 返回0则出错,返回1则成功 +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +uint8 ov7725_reg_init(void) +{ + simiic_delay_set(500); + simiic_write_reg ( OV7725_DEV_ADD, OV7725_COM7, 0x80 ); //复位摄像头 + systick_delay_ms(STM0, 50); + ov7725_idcode = simiic_read_reg( OV7725_DEV_ADD, OV7725_VER ,SCCB); + if( ov7725_idcode != OV7725_ID ) return 0; //校验摄像头ID号 + + //ID号确认无误 然后配置寄存器 + simiic_write_reg(OV7725_DEV_ADD, OV7725_COM4 , 0xC1); + simiic_write_reg(OV7725_DEV_ADD, OV7725_CLKRC , 0x01); + simiic_write_reg(OV7725_DEV_ADD, OV7725_COM2 , 0x03); + simiic_write_reg(OV7725_DEV_ADD, OV7725_COM3 , 0xD0); + simiic_write_reg(OV7725_DEV_ADD, OV7725_COM7 , 0x40); + simiic_write_reg(OV7725_DEV_ADD, OV7725_COM8 , 0xCE); //0xCE:关闭自动曝光 0xCF:开启自动曝光 + simiic_write_reg(OV7725_DEV_ADD, OV7725_HSTART , 0x3F); + simiic_write_reg(OV7725_DEV_ADD, OV7725_HSIZE , 0x50); + simiic_write_reg(OV7725_DEV_ADD, OV7725_VSTRT , 0x03); + simiic_write_reg(OV7725_DEV_ADD, OV7725_VSIZE , 0x78); + simiic_write_reg(OV7725_DEV_ADD, OV7725_HREF , 0x00); + simiic_write_reg(OV7725_DEV_ADD, OV7725_SCAL0 , 0x0A); + simiic_write_reg(OV7725_DEV_ADD, OV7725_AWB_Ctrl0 , 0xE0); + simiic_write_reg(OV7725_DEV_ADD, OV7725_DSPAuto , 0xff); + simiic_write_reg(OV7725_DEV_ADD, OV7725_DSP_Ctrl2 , 0x0C); + simiic_write_reg(OV7725_DEV_ADD, OV7725_DSP_Ctrl3 , 0x00); + simiic_write_reg(OV7725_DEV_ADD, OV7725_DSP_Ctrl4 , 0x00); + + if(OV7725_W == 80) simiic_write_reg(OV7725_DEV_ADD, OV7725_HOutSize , 0x14); + else if(OV7725_W == 160) simiic_write_reg(OV7725_DEV_ADD, OV7725_HOutSize , 0x28); + else if(OV7725_W == 240) simiic_write_reg(OV7725_DEV_ADD, OV7725_HOutSize , 0x3c); + else if(OV7725_W == 320) simiic_write_reg(OV7725_DEV_ADD, OV7725_HOutSize , 0x50); + + if(OV7725_H == 60) simiic_write_reg(OV7725_DEV_ADD, OV7725_VOutSize , 0x1E); + else if(OV7725_H == 120) simiic_write_reg(OV7725_DEV_ADD, OV7725_VOutSize , 0x3c); + else if(OV7725_H == 180) simiic_write_reg(OV7725_DEV_ADD, OV7725_VOutSize , 0x5a); + else if(OV7725_H == 240) simiic_write_reg(OV7725_DEV_ADD, OV7725_VOutSize , 0x78); + + simiic_write_reg(OV7725_DEV_ADD, OV7725_REG28 , 0x01); + simiic_write_reg(OV7725_DEV_ADD, OV7725_EXHCH , 0x10); + simiic_write_reg(OV7725_DEV_ADD, OV7725_EXHCL , 0x1F); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM1 , 0x0c); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM2 , 0x16); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM3 , 0x2a); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM4 , 0x4e); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM5 , 0x61); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM6 , 0x6f); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM7 , 0x7b); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM8 , 0x86); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM9 , 0x8e); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM10 , 0x97); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM11 , 0xa4); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM12 , 0xaf); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM13 , 0xc5); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM14 , 0xd7); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM15 , 0xe8); + simiic_write_reg(OV7725_DEV_ADD, OV7725_SLOP , 0x20); + simiic_write_reg(OV7725_DEV_ADD, OV7725_LC_RADI , 0x00); + simiic_write_reg(OV7725_DEV_ADD, OV7725_LC_COEF , 0x13); + simiic_write_reg(OV7725_DEV_ADD, OV7725_LC_XC , 0x08); + simiic_write_reg(OV7725_DEV_ADD, OV7725_LC_COEFB , 0x14); + simiic_write_reg(OV7725_DEV_ADD, OV7725_LC_COEFR , 0x17); + simiic_write_reg(OV7725_DEV_ADD, OV7725_LC_CTR , 0x05); + simiic_write_reg(OV7725_DEV_ADD, OV7725_BDBase , 0x99); + simiic_write_reg(OV7725_DEV_ADD, OV7725_BDMStep , 0x03); + simiic_write_reg(OV7725_DEV_ADD, OV7725_SDE , 0x04); + simiic_write_reg(OV7725_DEV_ADD, OV7725_BRIGHT , 0x00); + simiic_write_reg(OV7725_DEV_ADD, OV7725_CNST , 0x40); + simiic_write_reg(OV7725_DEV_ADD, OV7725_SIGN , 0x06); + simiic_write_reg(OV7725_DEV_ADD, OV7725_UVADJ0 , 0x11); + simiic_write_reg(OV7725_DEV_ADD, OV7725_UVADJ1 , 0x02); + + + simiic_delay_set(SIMIIC_DELAY_TIME);//修改为默认的20 + return 1; + + +} + + + + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 小钻风摄像头采集程序初始化(内部使用,用户无需调用) +// @param NULL +// @return void +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +void ov7725_port_init(void) +{ + uint8 i; + camera_type = 3;//设置连接摄像头类型 + + //摄像头采集初始化 + //初始化 数据引脚 + for(i=0; i<8; i++) + { + gpio_init((PIN_enum)(OV7725_DATA_PIN+i), GPI, 0, PULLUP); + } + eru_dma_init(OV7725_DMA_CH, GET_PORT_IN_ADDR(OV7725_DATA_PIN), image_bin[0], OV7725_PCLK_PIN, FALLING, OV7725_DMA_NUM); + eru_init(OV7725_VSYNC_PIN, FALLING); //初始化场中断,并设置为下降沿触发中断 + +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 小钻风摄像头初始化(调用之后设置好相关中断函数即可采集图像) +// @param NULL +// @return 0 +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +uint8 ov7725_init(void) +{ + simiic_init(); + ov7725_reg_init(); //摄像头寄存器配置 + ov7725_port_init(); //摄像头中断引脚及DMA配置 + return 0; +} + + + + +uint8 ov7725_finish_flag = 0; +//------------------------------------------------------------------------------------------------------------------- +// @brief 小钻风摄像头场中断 +// @param NULL +// @return void +// @since v1.0 +// Sample usage: 此函数在isr.c中被eru(GPIO中断)中断调用 +//------------------------------------------------------------------------------------------------------------------- +void ov7725_vsync(void) +{ + CLEAR_GPIO_FLAG(OV7725_VSYNC_PIN); + + if(!ov7725_finish_flag)//查看图像数组是否使用完毕,如果未使用完毕则不开始采集,避免出现访问冲突 + { + DMA_SET_DESTINATION(OV7725_DMA_CH, image_bin[0]); + dma_start(OV7725_DMA_CH); + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 小钻风摄像头DMA完成中断 +// @param NULL +// @return void +// @since v1.0 +// Sample usage: 此函数在isr.c中被dma中断调用 +//------------------------------------------------------------------------------------------------------------------- +void ov7725_dma(void) +{ + CLEAR_DMA_FLAG(OV7725_DMA_CH); + ov7725_finish_flag = 1; + dma_stop(OV7725_DMA_CH); +} + + + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 小钻风摄像头数据解压函数 +// @param *data1 源地址 +// @param *data2 目的地址 +// @return void +// @since v1.0 +// Sample usage: Image_Decompression(da1,dat2[0]);//将一维数组dat1的内容解压到二维数组dat2里. +//------------------------------------------------------------------------------------------------------------------- +void image_decompression(uint8 *data1,uint8 *data2) +{ + uint8 temp[2] = {0,255}; + uint16 lenth = OV7725_SIZE; + uint8 i = 8; + + + while(lenth--) + { + i = 8; + while(i--) + { + *data2++ = temp[(*data1 >> i) & 0x01]; + } + data1++; + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 小钻风摄像头未解压图像发送至上位机查看图像 +// @param *imgaddr 压缩图像数据地址 +// @param *imgsize 图像大小(直接填写OV7725_SIZE) +// @return void +// @since v1.0 +// Sample usage: 调用该函数前请先初始化uart2 +//------------------------------------------------------------------------------------------------------------------- +void seekfree_sendimg_7725(UARTN_enum uartn) +{ + uart_putchar(uartn, 0x00);uart_putchar(uartn, 0xff);uart_putchar(uartn, 0x01);uart_putchar(uartn, 0x01);//发送四个字节命令 + uart_putbuff(uartn, image_bin[0], OV7725_SIZE); //再发送图像 +} + + + + diff --git a/Example/10-Interrupt_Priority_Set_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.h b/Example/10-Interrupt_Priority_Set_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.h new file mode 100644 index 0000000..e513250 --- /dev/null +++ b/Example/10-Interrupt_Priority_Set_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.h @@ -0,0 +1,243 @@ +/********************************************************************************************************************* + * COPYRIGHT NOTICE + * Copyright (c) 2020,逐飞科技 + * All rights reserved. + * 技术讨论QQ群:三群:824575535 + * + * 以下所有内容版权均属逐飞科技所有,未经允许不得用于商业用途, + * 欢迎各位使用并传播本程序,修改内容时必须保留逐飞科技的版权声明。 + * + * @file main + * @company 成都逐飞科技有限公司 + * @author 逐飞科技(QQ3184284598) + * @version 查看doc内version文件 版本说明 + * @Software tasking v6.3r1 + * @Target core TC264D + * @Taobao https://seekfree.taobao.com/ + * @date 2020-3-23 + * @note + 接线定义: + ------------------------------------ + 模块管脚 单片机管脚 + SDA 查看SEEKFREE_IIC文件内的SEEKFREE_SDA宏定义 + SCL 查看SEEKFREE_IIC文件内的SEEKFREE_SCL宏定义 + 场中断(VSY) 查看SEEKFREE_OV7725.h文件中的OV7725_VSYNC_PIN宏定义 + 行中断(HREF) 未使用,因此不接 + 像素中断(PCLK) 查看SEEKFREE_OV7725.h文件中的OV7725_PCLK_PIN宏定义 + 数据口(D0-D7) 查看SEEKFREE_OV7725.h文件中的OV7725_DATA_PIN宏定义 + ------------------------------------ + + 默认分辨率是 160*120 + 默认FPS 50帧 + ********************************************************************************************************************/ + + + +#ifndef _SEEKFREE_7725_h +#define _SEEKFREE_7725_h + +#include "common.h" +#include "IfxDma_cfg.h" +#include "zf_uart.h" + + +//摄像头ID号 +#define OV7725_ID 0x21 + +//摄像头寄存器 +#define OV7725_GAIN 0x00 +#define OV7725_BLUE 0x01 +#define OV7725_RED 0x02 +#define OV7725_GREEN 0x03 +#define OV7725_BAVG 0x05 +#define OV7725_GAVG 0x06 +#define OV7725_RAVG 0x07 +#define OV7725_AECH 0x08 +#define OV7725_COM2 0x09 +#define OV7725_PID 0x0A +#define OV7725_VER 0x0B +#define OV7725_COM3 0x0C +#define OV7725_COM4 0x0D +#define OV7725_COM5 0x0E +#define OV7725_COM6 0x0F +#define OV7725_AEC 0x10 +#define OV7725_CLKRC 0x11 +#define OV7725_COM7 0x12 +#define OV7725_COM8 0x13 +#define OV7725_COM9 0x14 +#define OV7725_COM10 0x15 +#define OV7725_REG16 0x16 +#define OV7725_HSTART 0x17 +#define OV7725_HSIZE 0x18 +#define OV7725_VSTRT 0x19 +#define OV7725_VSIZE 0x1A +#define OV7725_PSHFT 0x1B +#define OV7725_MIDH 0x1C +#define OV7725_MIDL 0x1D +#define OV7725_LAEC 0x1F +#define OV7725_COM11 0x20 +#define OV7725_BDBase 0x22 +#define OV7725_BDMStep 0x23 +#define OV7725_AEW 0x24 +#define OV7725_AEB 0x25 +#define OV7725_VPT 0x26 +#define OV7725_REG28 0x28 +#define OV7725_HOutSize 0x29 +#define OV7725_EXHCH 0x2A +#define OV7725_EXHCL 0x2B +#define OV7725_VOutSize 0x2C +#define OV7725_ADVFL 0x2D +#define OV7725_ADVFH 0x2E +#define OV7725_YAVE 0x2F +#define OV7725_LumHTh 0x30 +#define OV7725_LumLTh 0x31 +#define OV7725_HREF 0x32 +#define OV7725_DM_LNL 0x33 +#define OV7725_DM_LNH 0x34 +#define OV7725_ADoff_B 0x35 +#define OV7725_ADoff_R 0x36 +#define OV7725_ADoff_Gb 0x37 +#define OV7725_ADoff_Gr 0x38 +#define OV7725_Off_B 0x39 +#define OV7725_Off_R 0x3A +#define OV7725_Off_Gb 0x3B +#define OV7725_Off_Gr 0x3C +#define OV7725_COM12 0x3D +#define OV7725_COM13 0x3E +#define OV7725_COM14 0x3F +#define OV7725_COM16 0x41 +#define OV7725_TGT_B 0x42 +#define OV7725_TGT_R 0x43 +#define OV7725_TGT_Gb 0x44 +#define OV7725_TGT_Gr 0x45 +#define OV7725_LC_CTR 0x46 +#define OV7725_LC_XC 0x47 +#define OV7725_LC_YC 0x48 +#define OV7725_LC_COEF 0x49 +#define OV7725_LC_RADI 0x4A +#define OV7725_LC_COEFB 0x4B +#define OV7725_LC_COEFR 0x4C +#define OV7725_FixGain 0x4D +#define OV7725_AREF1 0x4F +#define OV7725_AREF6 0x54 +#define OV7725_UFix 0x60 +#define OV7725_VFix 0x61 +#define OV7725_AWBb_blk 0x62 +#define OV7725_AWB_Ctrl0 0x63 +#define OV7725_DSP_Ctrl1 0x64 +#define OV7725_DSP_Ctrl2 0x65 +#define OV7725_DSP_Ctrl3 0x66 +#define OV7725_DSP_Ctrl4 0x67 +#define OV7725_AWB_bias 0x68 +#define OV7725_AWBCtrl1 0x69 +#define OV7725_AWBCtrl2 0x6A +#define OV7725_AWBCtrl3 0x6B +#define OV7725_AWBCtrl4 0x6C +#define OV7725_AWBCtrl5 0x6D +#define OV7725_AWBCtrl6 0x6E +#define OV7725_AWBCtrl7 0x6F +#define OV7725_AWBCtrl8 0x70 +#define OV7725_AWBCtrl9 0x71 +#define OV7725_AWBCtrl10 0x72 +#define OV7725_AWBCtrl11 0x73 +#define OV7725_AWBCtrl12 0x74 +#define OV7725_AWBCtrl13 0x75 +#define OV7725_AWBCtrl14 0x76 +#define OV7725_AWBCtrl15 0x77 +#define OV7725_AWBCtrl16 0x78 +#define OV7725_AWBCtrl17 0x79 +#define OV7725_AWBCtrl18 0x7A +#define OV7725_AWBCtrl19 0x7B +#define OV7725_AWBCtrl20 0x7C +#define OV7725_AWBCtrl21 0x7D +#define OV7725_GAM1 0x7E +#define OV7725_GAM2 0x7F +#define OV7725_GAM3 0x80 +#define OV7725_GAM4 0x81 +#define OV7725_GAM5 0x82 +#define OV7725_GAM6 0x83 +#define OV7725_GAM7 0x84 +#define OV7725_GAM8 0x85 +#define OV7725_GAM9 0x86 +#define OV7725_GAM10 0x87 +#define OV7725_GAM11 0x88 +#define OV7725_GAM12 0x89 +#define OV7725_GAM13 0x8A +#define OV7725_GAM14 0x8B +#define OV7725_GAM15 0x8C +#define OV7725_SLOP 0x8D +#define OV7725_DNSTh 0x8E +#define OV7725_EDGE0 0x8F +#define OV7725_EDGE1 0x90 +#define OV7725_DNSOff 0x91 +#define OV7725_EDGE2 0x92 +#define OV7725_EDGE3 0x93 +#define OV7725_MTX1 0x94 +#define OV7725_MTX2 0x95 +#define OV7725_MTX3 0x96 +#define OV7725_MTX4 0x97 +#define OV7725_MTX5 0x98 +#define OV7725_MTX6 0x99 +#define OV7725_MTX_Ctrl 0x9A +#define OV7725_BRIGHT 0x9B +#define OV7725_CNST 0x9C +#define OV7725_UVADJ0 0x9E +#define OV7725_UVADJ1 0x9F +#define OV7725_SCAL0 0xA0 +#define OV7725_SCAL1 0xA1 +#define OV7725_SCAL2 0xA2 +#define OV7725_SDE 0xA6 +#define OV7725_USAT 0xA7 +#define OV7725_VSAT 0xA8 +#define OV7725_HUECOS 0xA9 +#define OV7725_HUESIN 0xAA +#define OV7725_SIGN 0xAB +#define OV7725_DSPAuto 0xAC + + +#define OV7725_DEV_ADD 0x42>>1 + + +//配置摄像头参数 +#define OV7725_W 160 //定义摄像头图像宽度 可设置参数 80 160 240 320 +#define OV7725_H 120 //定义摄像头图像高度 可设置参数 60 120 180 240 +#define OV7725_SIZE (OV7725_W * OV7725_H/8 ) //图像占用空间大小 +#define OV7725_DMA_NUM (OV7725_SIZE) //一副图像DMA采集次数 + + +//-------------------------------------------------------------------------------------------------- +//引脚配置 +//-------------------------------------------------------------------------------------------------- +#define OV7725_VSYNC_PIN ERU_CH3_REQ6_P02_0 //场中断引脚 可选范围参考ERU_PIN_enum枚举 不可与像素引脚选择为同一个通道,或者是共用中断的通道 + //例如场中断选择ERU_CH3 那么像素引脚就不能选择ERU_CH7,因为3和7的中断是共用的。 + +#define OV7725_DATA_PIN P00_0 //定义D0数据引脚 假设D0定义为P00_0 那么D1所使用的引脚则为P00_1,依次类推 + //可设置参数P00_0、P02_0、P15_0,不能设置为其他参数 + +#define OV7725_PCLK_PIN ERU_CH2_REQ14_P02_1 //定义像素时钟引脚 可选范围参考ERU_PIN_enum枚举 不可与场中断引脚选择为同一个通道,或者是共用中断的通道 + //例如场中断选择ERU_CH3 那么像素引脚就不能选择ERU_CH7,因为3和7的中断是共用的。 + +#define OV7725_DMA_CH IfxDma_ChannelId_5 //定义使用的DMA通道 0-47可选 通道号越大优先级越低 + //修改此处之后,需要修改对应的ERU中断优先级,例如此处设置为IfxDma_ChannelId_5则对应的ERU中断优先级应该设置为5 + + + +extern uint8 image_bin[OV7725_H][OV7725_W/8]; //定义存储接收图像的数组 +extern uint8 image_dec[OV7725_H][OV7725_W]; //图像解压后的数组 + +extern uint8 ov7725_finish_flag; //图像采集完成标志位 + + +//函数声明 +uint8 ov7725_init(void); +void ov7725_vsync(void); +void ov7725_dma(void); +void image_decompression(uint8 *data1,uint8 *data2); +void seekfree_sendimg_7725(UARTN_enum uartn); + + + +#endif + + + diff --git a/Example/10-Interrupt_Priority_Set_Demo/Libraries/seekfree_peripheral/SEEKFREE_ICM20602.c b/Example/10-Interrupt_Priority_Set_Demo/Libraries/seekfree_peripheral/SEEKFREE_ICM20602.c index 095f9e3..5d167c9 100644 --- a/Example/10-Interrupt_Priority_Set_Demo/Libraries/seekfree_peripheral/SEEKFREE_ICM20602.c +++ b/Example/10-Interrupt_Priority_Set_Demo/Libraries/seekfree_peripheral/SEEKFREE_ICM20602.c @@ -68,6 +68,7 @@ void icm20602_self1_check(void) //------------------------------------------------------------------------------------------------------------------- void icm20602_init(void) { + simiic_init(); systick_delay_ms(STM0, 10); //上电延时 //检测 diff --git a/Example/10-Interrupt_Priority_Set_Demo/Libraries/seekfree_peripheral/SEEKFREE_IIC.c b/Example/10-Interrupt_Priority_Set_Demo/Libraries/seekfree_peripheral/SEEKFREE_IIC.c index 196fd57..f56a41a 100644 --- a/Example/10-Interrupt_Priority_Set_Demo/Libraries/seekfree_peripheral/SEEKFREE_IIC.c +++ b/Example/10-Interrupt_Priority_Set_Demo/Libraries/seekfree_peripheral/SEEKFREE_IIC.c @@ -50,7 +50,7 @@ uint8 IIC_num; // -static uint16 simiic_delay_time=100; //ICM等传感器应设置为100 +static uint16 simiic_delay_time = SIMIIC_DELAY_TIME; //ICM等传感器应设置为20 //------------------------------------------------------------------------------------------------------------------- diff --git a/Example/10-Interrupt_Priority_Set_Demo/Libraries/seekfree_peripheral/SEEKFREE_IIC.h b/Example/10-Interrupt_Priority_Set_Demo/Libraries/seekfree_peripheral/SEEKFREE_IIC.h index 293a02a..6a9c1e3 100644 --- a/Example/10-Interrupt_Priority_Set_Demo/Libraries/seekfree_peripheral/SEEKFREE_IIC.h +++ b/Example/10-Interrupt_Priority_Set_Demo/Libraries/seekfree_peripheral/SEEKFREE_IIC.h @@ -34,8 +34,12 @@ -#define SEEKFREE_SCL P13_0 //定义SCL引脚 可任意更改为其他IO -#define SEEKFREE_SDA P13_1 //定义SDA引脚 可任意更改为其他IO +#define SEEKFREE_SCL P02_3 //定义SCL引脚 可任意更改为其他IO +#define SEEKFREE_SDA P02_2 //定义SDA引脚 可任意更改为其他IO + + +#define SIMIIC_DELAY_TIME 20 + typedef enum IIC //DAC模块 { diff --git a/Example/10-Interrupt_Priority_Set_Demo/Libraries/seekfree_peripheral/SEEKFREE_L3G4200D.c b/Example/10-Interrupt_Priority_Set_Demo/Libraries/seekfree_peripheral/SEEKFREE_L3G4200D.c index 0f0c23a..5deb7d3 100644 --- a/Example/10-Interrupt_Priority_Set_Demo/Libraries/seekfree_peripheral/SEEKFREE_L3G4200D.c +++ b/Example/10-Interrupt_Priority_Set_Demo/Libraries/seekfree_peripheral/SEEKFREE_L3G4200D.c @@ -65,6 +65,7 @@ void l3g4200d_self_check(void) //------------------------------------------------------------------------------------------------------------------- void l3g4200d_init(void) { + simiic_init(); systick_delay_ms(STM0, 50); l3g4200d_self_check(); diff --git a/Example/10-Interrupt_Priority_Set_Demo/Libraries/seekfree_peripheral/SEEKFREE_MMA8451.c b/Example/10-Interrupt_Priority_Set_Demo/Libraries/seekfree_peripheral/SEEKFREE_MMA8451.c index c200427..8a5eec4 100644 --- a/Example/10-Interrupt_Priority_Set_Demo/Libraries/seekfree_peripheral/SEEKFREE_MMA8451.c +++ b/Example/10-Interrupt_Priority_Set_Demo/Libraries/seekfree_peripheral/SEEKFREE_MMA8451.c @@ -68,6 +68,7 @@ void mma8451_self_check(void) //------------------------------------------------------------------------------------------------------------------- uint8 mma845x_init(void) { + simiic_init(); systick_delay_ms(STM0, 50); mma8451_self_check(); diff --git a/Example/10-Interrupt_Priority_Set_Demo/Libraries/seekfree_peripheral/SEEKFREE_MPU6050.c b/Example/10-Interrupt_Priority_Set_Demo/Libraries/seekfree_peripheral/SEEKFREE_MPU6050.c index 0317aa0..686550d 100644 --- a/Example/10-Interrupt_Priority_Set_Demo/Libraries/seekfree_peripheral/SEEKFREE_MPU6050.c +++ b/Example/10-Interrupt_Priority_Set_Demo/Libraries/seekfree_peripheral/SEEKFREE_MPU6050.c @@ -71,6 +71,7 @@ void mpu6050_self1_check(void) //------------------------------------------------------------------------------------------------------------------- void mpu6050_init(void) { + simiic_init(); systick_delay_ms(STM0, 100); //上电延时 mpu6050_self1_check(); diff --git a/Example/10-Interrupt_Priority_Set_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.c b/Example/10-Interrupt_Priority_Set_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.c index 014b435..05f181f 100644 --- a/Example/10-Interrupt_Priority_Set_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.c +++ b/Example/10-Interrupt_Priority_Set_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.c @@ -38,7 +38,6 @@ #include "zf_gpio.h" #include "zf_eru.h" #include "zf_eru_dma.h" -#include "stdio.h" #include "SEEKFREE_MT9V03X.h" @@ -49,6 +48,8 @@ uint8 receive[3]; uint8 receive_num = 0; vuint8 uart_receive_flag; +uint8 link_list_num; + //需要配置到摄像头的数据 int16 MT9V03X_CFG[CONFIG_FINISH][2]= { @@ -305,7 +306,7 @@ void mt9v03x_init(void) gpio_init((PIN_enum)(MT9V03X_DATA_PIN+i), GPI, 0, PULLUP); } - eru_dma_init(MT9V03X_DMA_CH, GET_PORT_IN_ADDR(MT9V03X_DATA_PIN), mt9v03x_image[0], MT9V03X_PCLK_PIN, RISING, MT9V03X_W); + link_list_num = eru_dma_init(MT9V03X_DMA_CH, GET_PORT_IN_ADDR(MT9V03X_DATA_PIN), mt9v03x_image[0], MT9V03X_PCLK_PIN, RISING, MT9V03X_W*MT9V03X_H); eru_init(MT9V03X_VSYNC_PIN, FALLING); //初始化场中断,并设置为下降沿触发中断 restoreInterrupts(interrupt_state); @@ -313,7 +314,6 @@ void mt9v03x_init(void) uint8 mt9v03x_finish_flag = 0; //一场图像采集完成标志位 -uint8 now_col; //当前正在采集的行 //------------------------------------------------------------------------------------------------------------------- // @brief MT9V03X摄像头场中断 // @param NULL @@ -324,16 +324,15 @@ uint8 now_col; // void mt9v03x_vsync(void) { CLEAR_GPIO_FLAG(MT9V03X_VSYNC_PIN); - now_col = 0; + if(!mt9v03x_finish_flag)//查看图像数组是否使用完毕,如果未使用完毕则不开始采集,避免出现访问冲突 { - DMA_SET_DESTINATION(MT9V03X_DMA_CH, (void *)&mt9v03x_image[0]); dma_start(MT9V03X_DMA_CH); } } - +uint8 mt9v03x_dma_int_num; //当前DMA中断次数 //------------------------------------------------------------------------------------------------------------------- // @brief MT9V03X摄像头DMA完成中断 // @param NULL @@ -344,16 +343,15 @@ void mt9v03x_vsync(void) void mt9v03x_dma(void) { CLEAR_DMA_FLAG(MT9V03X_DMA_CH); + mt9v03x_dma_int_num++; - now_col++; - - if(MT9V03X_H > now_col) - { - dma_start(MT9V03X_DMA_CH); - } - else + if(mt9v03x_dma_int_num >= link_list_num) { + //采集完成 + mt9v03x_dma_int_num = 0; mt9v03x_finish_flag = 1;//一副图像从采集开始到采集结束耗时3.8MS左右(50FPS、188*120分辨率) + dma_stop(MT9V03X_DMA_CH); + } } diff --git a/Example/10-Interrupt_Priority_Set_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.h b/Example/10-Interrupt_Priority_Set_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.h index a29edd2..0c8a785 100644 --- a/Example/10-Interrupt_Priority_Set_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.h +++ b/Example/10-Interrupt_Priority_Set_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.h @@ -63,9 +63,7 @@ //例如场中断选择ERU_CH3 那么像素引脚就不能选择ERU_CH7,因为3和7的中断是共用的。 #define MT9V03X_DMA_CH IfxDma_ChannelId_5 //定义使用的DMA通道 0-47可选 通道号越大优先级越低 - //修改此处之后,需要修改对应的ERU中断优先级,例如此处设置为IfxDma_ChannelId_5则对应的ERU中断优先级应该设置为5 - - + //摄像头命令枚举 typedef enum { diff --git a/Example/10-Interrupt_Priority_Set_Demo/USER/isr.c b/Example/10-Interrupt_Priority_Set_Demo/USER/isr.c index 15666f2..c6376b0 100644 --- a/Example/10-Interrupt_Priority_Set_Demo/USER/isr.c +++ b/Example/10-Interrupt_Priority_Set_Demo/USER/isr.c @@ -98,7 +98,8 @@ IFX_INTERRUPT(eru_ch3_ch7_isr, ERU_CH3_CH7_INT_SERVICE, ERU_CH3_CH7_INT_PRIO) if(GET_GPIO_FLAG(ERU_CH3_REQ6_P02_0))//通道3中断 { CLEAR_GPIO_FLAG(ERU_CH3_REQ6_P02_0); - if(1 == camera_type)mt9v03x_vsync(); + if (1 == camera_type) mt9v03x_vsync(); + else if (3 == camera_type) ov7725_vsync(); } if(GET_GPIO_FLAG(ERU_CH7_REQ16_P15_1))//通道7中断 @@ -113,7 +114,8 @@ IFX_INTERRUPT(eru_ch3_ch7_isr, ERU_CH3_CH7_INT_SERVICE, ERU_CH3_CH7_INT_PRIO) IFX_INTERRUPT(dma_ch5_isr, ERU_DMA_INT_SERVICE, ERU_DMA_INT_PRIO) { - if(1 == camera_type) mt9v03x_dma(); + if (1 == camera_type) mt9v03x_dma(); + else if (3 == camera_type) ov7725_dma(); } diff --git a/Example/11-Systick_Demo/Libraries/doc/version.txt b/Example/11-Systick_Demo/Libraries/doc/version.txt index b85cd50..a42bc58 100644 --- a/Example/11-Systick_Demo/Libraries/doc/version.txt +++ b/Example/11-Systick_Demo/Libraries/doc/version.txt @@ -1,9 +1,17 @@ V1.0.0 - 初始版本 + 初始版本 V1.0.1 对总钻风摄像头的场中断进行修改,判断标志位为0才采集下一幅图像,避免出现访问冲突 修改SPI初始化中的错误,引用了固定的SPI2基地址 修复STM中无法使用STM1的问题 - 修复gtm pwm中最大占空比只有GTM_ATOM0_PWM_DUTY_MAX设置有效的问题 \ No newline at end of file + 修复gtm pwm中最大占空比只有GTM_ATOM0_PWM_DUTY_MAX设置有效的问题 + +V1.0.2 + 修改模拟IIC默认延时时间为20 + 添加 需要特别注意P20_2是不能用于输出的,仅仅只有输入的功能 注意事项 + 将摄像头采集DMA改为link传输,可以大大降低DMA中断次数 + 修改默认的软件IIC引脚定义 + 将6050等 需要用到软件IIC的模块,在初始化函数中默认调用模拟IIC初始化 + 添加小钻风驱动程序 \ No newline at end of file diff --git a/Example/11-Systick_Demo/Libraries/seekfree_libraries/common/common.c b/Example/11-Systick_Demo/Libraries/seekfree_libraries/common/common.c index 0460d15..ac42b19 100644 --- a/Example/11-Systick_Demo/Libraries/seekfree_libraries/common/common.c +++ b/Example/11-Systick_Demo/Libraries/seekfree_libraries/common/common.c @@ -22,7 +22,7 @@ #include "SysSe/Bsp/Bsp.h" #include "common.h" -uint8 camera_type; +uint8 camera_type; //摄像头型号 1:总钻风 2:凌瞳(暂未支持)3:小钻风 diff --git a/Example/11-Systick_Demo/Libraries/seekfree_libraries/common/common.h b/Example/11-Systick_Demo/Libraries/seekfree_libraries/common/common.h index fe7ec63..13d03cd 100644 --- a/Example/11-Systick_Demo/Libraries/seekfree_libraries/common/common.h +++ b/Example/11-Systick_Demo/Libraries/seekfree_libraries/common/common.h @@ -111,7 +111,7 @@ typedef enum //枚 #include -extern uint8 camera_type; +extern uint8 camera_type; //摄像头型号 1:总钻风 2:凌瞳(暂未支持)3:小钻风 void get_clk(void); diff --git a/Example/11-Systick_Demo/Libraries/seekfree_libraries/headfile.h b/Example/11-Systick_Demo/Libraries/seekfree_libraries/headfile.h index 0e8024f..e11bd83 100644 --- a/Example/11-Systick_Demo/Libraries/seekfree_libraries/headfile.h +++ b/Example/11-Systick_Demo/Libraries/seekfree_libraries/headfile.h @@ -62,6 +62,7 @@ #include "SEEKFREE_L3G4200D.h" #include "SEEKFREE_WIRELESS.h" #include "SEEKFREE_IPS200_PARALLEL8.h" +#include "SEEKFREE_7725.h" #endif diff --git a/Example/11-Systick_Demo/Libraries/seekfree_libraries/zf_eru_dma.c b/Example/11-Systick_Demo/Libraries/seekfree_libraries/zf_eru_dma.c index f7aab10..86c0158 100644 --- a/Example/11-Systick_Demo/Libraries/seekfree_libraries/zf_eru_dma.c +++ b/Example/11-Systick_Demo/Libraries/seekfree_libraries/zf_eru_dma.c @@ -21,9 +21,18 @@ #include "IfxDma_Dma.h" #include "IfxScuEru.h" #include "isr_config.h" +#include "zf_assert.h" #include "zf_eru_dma.h" +typedef struct +{ + Ifx_DMA_CH IFX_ALIGN(256) linked_list[8];//DMA链表 + IfxDma_Dma_Channel channel; //DMA通道句柄 +}DMA_LINK; + + +DMA_LINK dma_link_list; //------------------------------------------------------------------------------------------------------------------- // @brief eru触发dma初始化 @@ -36,7 +45,7 @@ // @return void // Sample usage: //------------------------------------------------------------------------------------------------------------------- -void eru_dma_init(IfxDma_ChannelId dma_ch, uint8 *source_addr, uint8 *destination_addr, ERU_PIN_enum eru_pin, TRIGGER_enum trigger, uint16 dma_count) +uint8 eru_dma_init(IfxDma_ChannelId dma_ch, uint8 *source_addr, uint8 *destination_addr, ERU_PIN_enum eru_pin, TRIGGER_enum trigger, uint16 dma_count) { IfxDma_Dma_Channel dmaChn; //eru触发DMA通道号 在eru文件中设置eru的优先级,即为触发的通道 @@ -51,27 +60,85 @@ void eru_dma_init(IfxDma_ChannelId dma_ch, uint8 *source_addr, uint8 *destinatio IfxDma_Dma_ChannelConfig cfg; IfxDma_Dma_initChannelConfig(&cfg, &dma); - cfg.transferCount = dma_count; + uint8 list_num, i; + uint16 single_channel_dma_count; + + ZF_ASSERT(!(dma_count%8));//传输次数必须为8的倍数 + + + list_num = 1; + single_channel_dma_count = dma_count / list_num; + if(16384 < single_channel_dma_count) + { + while(TRUE) + { + single_channel_dma_count = dma_count / list_num; + if((single_channel_dma_count <= 16384) && !(dma_count % list_num)) + { + break; + } + list_num++; + if(list_num > 8) ZF_ASSERT(FALSE); + } + } + + + if(1 == list_num) + { + cfg.shadowControl = IfxDma_ChannelShadow_none; + cfg.operationMode = IfxDma_ChannelOperationMode_single; + cfg.shadowAddress = 0; + } + else + { + cfg.shadowControl = IfxDma_ChannelShadow_linkedList; + cfg.operationMode = IfxDma_ChannelOperationMode_continuous; + cfg.shadowAddress = IFXCPU_GLB_ADDR_DSPR(IfxCpu_getCoreId(), (unsigned)&dma_link_list.linked_list[1]); + } + cfg.requestMode = IfxDma_ChannelRequestMode_oneTransferPerRequest; cfg.moveSize = IfxDma_ChannelMoveSize_8bit; + cfg.busPriority = IfxDma_ChannelBusPriority_high; - cfg.busPriority = IfxDma_ChannelBusPriority_high; - - cfg.sourceAddress = (unsigned)(source_addr); + cfg.sourceAddress = IFXCPU_GLB_ADDR_DSPR(IfxCpu_getCoreId(), source_addr); cfg.sourceAddressCircularRange = IfxDma_ChannelIncrementCircular_none; cfg.sourceCircularBufferEnabled = TRUE; - cfg.destinationAddress = IFXCPU_GLB_ADDR_DSPR(IfxCpu_getCoreId(), destination_addr); cfg.destinationAddressIncrementStep = IfxDma_ChannelIncrementStep_1; - cfg.operationMode = IfxDma_ChannelOperationMode_single; - cfg.channelId = (IfxDma_ChannelId)dma_ch; - cfg.hardwareRequestEnabled = TRUE; - cfg.channelInterruptEnabled = TRUE; + cfg.channelId = (IfxDma_ChannelId)dma_ch; + cfg.hardwareRequestEnabled = FALSE; + cfg.channelInterruptEnabled = TRUE; cfg.channelInterruptPriority = ERU_DMA_INT_PRIO; cfg.channelInterruptTypeOfService = (IfxSrc_Tos)ERU_DMA_INT_SERVICE; + + + cfg.destinationAddress = IFXCPU_GLB_ADDR_DSPR(IfxCpu_getCoreId(), destination_addr); + + cfg.transferCount = single_channel_dma_count; + IfxDma_Dma_initChannel(&dmaChn, &cfg); + + if(1 < list_num) + { + i = 0; + while(i < list_num) + { + cfg.destinationAddress = IFXCPU_GLB_ADDR_DSPR(IfxCpu_getCoreId(), destination_addr + single_channel_dma_count * i); + if(i == (list_num - 1)) cfg.shadowAddress = IFXCPU_GLB_ADDR_DSPR(IfxCpu_getCoreId(), (unsigned)&dma_link_list.linked_list[0]); + else cfg.shadowAddress = IFXCPU_GLB_ADDR_DSPR(IfxCpu_getCoreId(), (unsigned)&dma_link_list.linked_list[i+1]); + cfg.transferCount = single_channel_dma_count; + + IfxDma_Dma_initLinkedListEntry((void *)&dma_link_list.linked_list[i], &cfg); + i++; + } + } + + + IfxDma_Dma_getSrcPointer(&dma_link_list.channel)->B.CLRR = 1; + + return list_num; } diff --git a/Example/11-Systick_Demo/Libraries/seekfree_libraries/zf_eru_dma.h b/Example/11-Systick_Demo/Libraries/seekfree_libraries/zf_eru_dma.h index 50667ad..faef169 100644 --- a/Example/11-Systick_Demo/Libraries/seekfree_libraries/zf_eru_dma.h +++ b/Example/11-Systick_Demo/Libraries/seekfree_libraries/zf_eru_dma.h @@ -29,9 +29,9 @@ #define CLEAR_DMA_FLAG(dma_ch) IfxDma_clearChannelInterrupt(&MODULE_DMA, dma_ch); -#define DMA_SET_DESTINATION(dma_ch, destination_addr) IfxDma_setChannelDestinationAddress(&MODULE_DMA, dma_ch, (void *)destination_addr) +#define DMA_SET_DESTINATION(dma_ch, destination_addr) IfxDma_setChannelDestinationAddress(&MODULE_DMA, dma_ch, (void *)IFXCPU_GLB_ADDR_DSPR(IfxCpu_getCoreId(), destination_addr)) -void eru_dma_init(IfxDma_ChannelId dma_ch, uint8 *source_addr, uint8 *destination_addr, ERU_PIN_enum eru_pin, TRIGGER_enum trigger, uint16 dma_count); +uint8 eru_dma_init(IfxDma_ChannelId dma_ch, uint8 *source_addr, uint8 *destination_addr, ERU_PIN_enum eru_pin, TRIGGER_enum trigger, uint16 dma_count); void dma_stop(IfxDma_ChannelId dma_ch); void dma_start(IfxDma_ChannelId dma_ch); diff --git a/Example/11-Systick_Demo/Libraries/seekfree_libraries/zf_gpio.c b/Example/11-Systick_Demo/Libraries/seekfree_libraries/zf_gpio.c index 3c937cf..1d2466c 100644 --- a/Example/11-Systick_Demo/Libraries/seekfree_libraries/zf_gpio.c +++ b/Example/11-Systick_Demo/Libraries/seekfree_libraries/zf_gpio.c @@ -60,6 +60,7 @@ Ifx_P* get_port(PIN_enum pin) // @param pinmode 引脚配置(可设置参数由zf_gpio.h文件内GPIOMODE_enum枚举值确定) // @return void // Sample usage: gpio_init(P00_0, GPO, 1, PUSHPULL);//P00_0初始化为GPIO功能、输出模式、输出高电平、推挽输出 +// @note 需要特别注意P20_2是不能用于输出的,仅仅只有输入的功能 //------------------------------------------------------------------------------------------------------------------- void gpio_init(PIN_enum pin, GPIODIR_enum dir, uint8 dat, GPIOMODE_enum pinmode) { diff --git a/Example/11-Systick_Demo/Libraries/seekfree_libraries/zf_gpio.h b/Example/11-Systick_Demo/Libraries/seekfree_libraries/zf_gpio.h index cfbd666..e3d144f 100644 --- a/Example/11-Systick_Demo/Libraries/seekfree_libraries/zf_gpio.h +++ b/Example/11-Systick_Demo/Libraries/seekfree_libraries/zf_gpio.h @@ -38,6 +38,15 @@ typedef enum // 枚 #define GET_PORT_IN_ADDR(pin) (uint8 *)(&IfxPort_getAddress((IfxPort_Index)(pin/32))->IN + pin%32/8) + + +//需要特别注意P20_2是不能用于输出的,仅仅只有输入的功能 +//需要特别注意P20_2是不能用于输出的,仅仅只有输入的功能 +//需要特别注意P20_2是不能用于输出的,仅仅只有输入的功能 + + + + //------------------------------------------------------ //通用GPIO操作 void gpio_init(PIN_enum pin, GPIODIR_enum dir, uint8 dat, GPIOMODE_enum pinconf); diff --git a/Example/11-Systick_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.c b/Example/11-Systick_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.c new file mode 100644 index 0000000..806b8d9 --- /dev/null +++ b/Example/11-Systick_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.c @@ -0,0 +1,262 @@ +/********************************************************************************************************************* + * COPYRIGHT NOTICE + * Copyright (c) 2020,逐飞科技 + * All rights reserved. + * 技术讨论QQ群:三群:824575535 + * + * 以下所有内容版权均属逐飞科技所有,未经允许不得用于商业用途, + * 欢迎各位使用并传播本程序,修改内容时必须保留逐飞科技的版权声明。 + * + * @file main + * @company 成都逐飞科技有限公司 + * @author 逐飞科技(QQ3184284598) + * @version 查看doc内version文件 版本说明 + * @Software tasking v6.3r1 + * @Target core TC264D + * @Taobao https://seekfree.taobao.com/ + * @date 2020-3-23 + * @note + 接线定义: + ------------------------------------ + 模块管脚 单片机管脚 + SDA 查看SEEKFREE_IIC文件内的SEEKFREE_SDA宏定义 + SCL 查看SEEKFREE_IIC文件内的SEEKFREE_SCL宏定义 + 场中断(VSY) 查看SEEKFREE_OV7725.h文件中的OV7725_VSYNC_PIN宏定义 + 行中断(HREF) 未使用,因此不接 + 像素中断(PCLK) 查看SEEKFREE_OV7725.h文件中的OV7725_PCLK_PIN宏定义 + 数据口(D0-D7) 查看SEEKFREE_OV7725.h文件中的OV7725_DATA_PIN宏定义 + ------------------------------------ + + 默认分辨率是 160*120 + 默认FPS 50帧 + ********************************************************************************************************************/ + + +#include "IfxDma.h" +#include "IfxScuEru.h" +#include "zf_stm_systick.h" +#include "zf_gpio.h" +#include "zf_eru.h" +#include "zf_eru_dma.h" +#include "SEEKFREE_IIC.h" +#include "SEEKFREE_7725.h" + + + +IFX_ALIGN(4) uint8 image_bin[OV7725_H][OV7725_W/8]; //定义存储接收图像的数组 +uint8 image_dec[OV7725_H][OV7725_W]; + +uint8 ov7725_idcode = 0; + +//------------------------------------------------------------------------------------------------------------------- +// @brief 小钻风摄像头内部寄存器初始化(内部使用,用户无需调用) +// @param NULL +// @return uint8 返回0则出错,返回1则成功 +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +uint8 ov7725_reg_init(void) +{ + simiic_delay_set(500); + simiic_write_reg ( OV7725_DEV_ADD, OV7725_COM7, 0x80 ); //复位摄像头 + systick_delay_ms(STM0, 50); + ov7725_idcode = simiic_read_reg( OV7725_DEV_ADD, OV7725_VER ,SCCB); + if( ov7725_idcode != OV7725_ID ) return 0; //校验摄像头ID号 + + //ID号确认无误 然后配置寄存器 + simiic_write_reg(OV7725_DEV_ADD, OV7725_COM4 , 0xC1); + simiic_write_reg(OV7725_DEV_ADD, OV7725_CLKRC , 0x01); + simiic_write_reg(OV7725_DEV_ADD, OV7725_COM2 , 0x03); + simiic_write_reg(OV7725_DEV_ADD, OV7725_COM3 , 0xD0); + simiic_write_reg(OV7725_DEV_ADD, OV7725_COM7 , 0x40); + simiic_write_reg(OV7725_DEV_ADD, OV7725_COM8 , 0xCE); //0xCE:关闭自动曝光 0xCF:开启自动曝光 + simiic_write_reg(OV7725_DEV_ADD, OV7725_HSTART , 0x3F); + simiic_write_reg(OV7725_DEV_ADD, OV7725_HSIZE , 0x50); + simiic_write_reg(OV7725_DEV_ADD, OV7725_VSTRT , 0x03); + simiic_write_reg(OV7725_DEV_ADD, OV7725_VSIZE , 0x78); + simiic_write_reg(OV7725_DEV_ADD, OV7725_HREF , 0x00); + simiic_write_reg(OV7725_DEV_ADD, OV7725_SCAL0 , 0x0A); + simiic_write_reg(OV7725_DEV_ADD, OV7725_AWB_Ctrl0 , 0xE0); + simiic_write_reg(OV7725_DEV_ADD, OV7725_DSPAuto , 0xff); + simiic_write_reg(OV7725_DEV_ADD, OV7725_DSP_Ctrl2 , 0x0C); + simiic_write_reg(OV7725_DEV_ADD, OV7725_DSP_Ctrl3 , 0x00); + simiic_write_reg(OV7725_DEV_ADD, OV7725_DSP_Ctrl4 , 0x00); + + if(OV7725_W == 80) simiic_write_reg(OV7725_DEV_ADD, OV7725_HOutSize , 0x14); + else if(OV7725_W == 160) simiic_write_reg(OV7725_DEV_ADD, OV7725_HOutSize , 0x28); + else if(OV7725_W == 240) simiic_write_reg(OV7725_DEV_ADD, OV7725_HOutSize , 0x3c); + else if(OV7725_W == 320) simiic_write_reg(OV7725_DEV_ADD, OV7725_HOutSize , 0x50); + + if(OV7725_H == 60) simiic_write_reg(OV7725_DEV_ADD, OV7725_VOutSize , 0x1E); + else if(OV7725_H == 120) simiic_write_reg(OV7725_DEV_ADD, OV7725_VOutSize , 0x3c); + else if(OV7725_H == 180) simiic_write_reg(OV7725_DEV_ADD, OV7725_VOutSize , 0x5a); + else if(OV7725_H == 240) simiic_write_reg(OV7725_DEV_ADD, OV7725_VOutSize , 0x78); + + simiic_write_reg(OV7725_DEV_ADD, OV7725_REG28 , 0x01); + simiic_write_reg(OV7725_DEV_ADD, OV7725_EXHCH , 0x10); + simiic_write_reg(OV7725_DEV_ADD, OV7725_EXHCL , 0x1F); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM1 , 0x0c); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM2 , 0x16); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM3 , 0x2a); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM4 , 0x4e); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM5 , 0x61); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM6 , 0x6f); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM7 , 0x7b); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM8 , 0x86); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM9 , 0x8e); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM10 , 0x97); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM11 , 0xa4); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM12 , 0xaf); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM13 , 0xc5); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM14 , 0xd7); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM15 , 0xe8); + simiic_write_reg(OV7725_DEV_ADD, OV7725_SLOP , 0x20); + simiic_write_reg(OV7725_DEV_ADD, OV7725_LC_RADI , 0x00); + simiic_write_reg(OV7725_DEV_ADD, OV7725_LC_COEF , 0x13); + simiic_write_reg(OV7725_DEV_ADD, OV7725_LC_XC , 0x08); + simiic_write_reg(OV7725_DEV_ADD, OV7725_LC_COEFB , 0x14); + simiic_write_reg(OV7725_DEV_ADD, OV7725_LC_COEFR , 0x17); + simiic_write_reg(OV7725_DEV_ADD, OV7725_LC_CTR , 0x05); + simiic_write_reg(OV7725_DEV_ADD, OV7725_BDBase , 0x99); + simiic_write_reg(OV7725_DEV_ADD, OV7725_BDMStep , 0x03); + simiic_write_reg(OV7725_DEV_ADD, OV7725_SDE , 0x04); + simiic_write_reg(OV7725_DEV_ADD, OV7725_BRIGHT , 0x00); + simiic_write_reg(OV7725_DEV_ADD, OV7725_CNST , 0x40); + simiic_write_reg(OV7725_DEV_ADD, OV7725_SIGN , 0x06); + simiic_write_reg(OV7725_DEV_ADD, OV7725_UVADJ0 , 0x11); + simiic_write_reg(OV7725_DEV_ADD, OV7725_UVADJ1 , 0x02); + + + simiic_delay_set(SIMIIC_DELAY_TIME);//修改为默认的20 + return 1; + + +} + + + + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 小钻风摄像头采集程序初始化(内部使用,用户无需调用) +// @param NULL +// @return void +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +void ov7725_port_init(void) +{ + uint8 i; + camera_type = 3;//设置连接摄像头类型 + + //摄像头采集初始化 + //初始化 数据引脚 + for(i=0; i<8; i++) + { + gpio_init((PIN_enum)(OV7725_DATA_PIN+i), GPI, 0, PULLUP); + } + eru_dma_init(OV7725_DMA_CH, GET_PORT_IN_ADDR(OV7725_DATA_PIN), image_bin[0], OV7725_PCLK_PIN, FALLING, OV7725_DMA_NUM); + eru_init(OV7725_VSYNC_PIN, FALLING); //初始化场中断,并设置为下降沿触发中断 + +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 小钻风摄像头初始化(调用之后设置好相关中断函数即可采集图像) +// @param NULL +// @return 0 +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +uint8 ov7725_init(void) +{ + simiic_init(); + ov7725_reg_init(); //摄像头寄存器配置 + ov7725_port_init(); //摄像头中断引脚及DMA配置 + return 0; +} + + + + +uint8 ov7725_finish_flag = 0; +//------------------------------------------------------------------------------------------------------------------- +// @brief 小钻风摄像头场中断 +// @param NULL +// @return void +// @since v1.0 +// Sample usage: 此函数在isr.c中被eru(GPIO中断)中断调用 +//------------------------------------------------------------------------------------------------------------------- +void ov7725_vsync(void) +{ + CLEAR_GPIO_FLAG(OV7725_VSYNC_PIN); + + if(!ov7725_finish_flag)//查看图像数组是否使用完毕,如果未使用完毕则不开始采集,避免出现访问冲突 + { + DMA_SET_DESTINATION(OV7725_DMA_CH, image_bin[0]); + dma_start(OV7725_DMA_CH); + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 小钻风摄像头DMA完成中断 +// @param NULL +// @return void +// @since v1.0 +// Sample usage: 此函数在isr.c中被dma中断调用 +//------------------------------------------------------------------------------------------------------------------- +void ov7725_dma(void) +{ + CLEAR_DMA_FLAG(OV7725_DMA_CH); + ov7725_finish_flag = 1; + dma_stop(OV7725_DMA_CH); +} + + + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 小钻风摄像头数据解压函数 +// @param *data1 源地址 +// @param *data2 目的地址 +// @return void +// @since v1.0 +// Sample usage: Image_Decompression(da1,dat2[0]);//将一维数组dat1的内容解压到二维数组dat2里. +//------------------------------------------------------------------------------------------------------------------- +void image_decompression(uint8 *data1,uint8 *data2) +{ + uint8 temp[2] = {0,255}; + uint16 lenth = OV7725_SIZE; + uint8 i = 8; + + + while(lenth--) + { + i = 8; + while(i--) + { + *data2++ = temp[(*data1 >> i) & 0x01]; + } + data1++; + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 小钻风摄像头未解压图像发送至上位机查看图像 +// @param *imgaddr 压缩图像数据地址 +// @param *imgsize 图像大小(直接填写OV7725_SIZE) +// @return void +// @since v1.0 +// Sample usage: 调用该函数前请先初始化uart2 +//------------------------------------------------------------------------------------------------------------------- +void seekfree_sendimg_7725(UARTN_enum uartn) +{ + uart_putchar(uartn, 0x00);uart_putchar(uartn, 0xff);uart_putchar(uartn, 0x01);uart_putchar(uartn, 0x01);//发送四个字节命令 + uart_putbuff(uartn, image_bin[0], OV7725_SIZE); //再发送图像 +} + + + + diff --git a/Example/11-Systick_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.h b/Example/11-Systick_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.h new file mode 100644 index 0000000..e513250 --- /dev/null +++ b/Example/11-Systick_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.h @@ -0,0 +1,243 @@ +/********************************************************************************************************************* + * COPYRIGHT NOTICE + * Copyright (c) 2020,逐飞科技 + * All rights reserved. + * 技术讨论QQ群:三群:824575535 + * + * 以下所有内容版权均属逐飞科技所有,未经允许不得用于商业用途, + * 欢迎各位使用并传播本程序,修改内容时必须保留逐飞科技的版权声明。 + * + * @file main + * @company 成都逐飞科技有限公司 + * @author 逐飞科技(QQ3184284598) + * @version 查看doc内version文件 版本说明 + * @Software tasking v6.3r1 + * @Target core TC264D + * @Taobao https://seekfree.taobao.com/ + * @date 2020-3-23 + * @note + 接线定义: + ------------------------------------ + 模块管脚 单片机管脚 + SDA 查看SEEKFREE_IIC文件内的SEEKFREE_SDA宏定义 + SCL 查看SEEKFREE_IIC文件内的SEEKFREE_SCL宏定义 + 场中断(VSY) 查看SEEKFREE_OV7725.h文件中的OV7725_VSYNC_PIN宏定义 + 行中断(HREF) 未使用,因此不接 + 像素中断(PCLK) 查看SEEKFREE_OV7725.h文件中的OV7725_PCLK_PIN宏定义 + 数据口(D0-D7) 查看SEEKFREE_OV7725.h文件中的OV7725_DATA_PIN宏定义 + ------------------------------------ + + 默认分辨率是 160*120 + 默认FPS 50帧 + ********************************************************************************************************************/ + + + +#ifndef _SEEKFREE_7725_h +#define _SEEKFREE_7725_h + +#include "common.h" +#include "IfxDma_cfg.h" +#include "zf_uart.h" + + +//摄像头ID号 +#define OV7725_ID 0x21 + +//摄像头寄存器 +#define OV7725_GAIN 0x00 +#define OV7725_BLUE 0x01 +#define OV7725_RED 0x02 +#define OV7725_GREEN 0x03 +#define OV7725_BAVG 0x05 +#define OV7725_GAVG 0x06 +#define OV7725_RAVG 0x07 +#define OV7725_AECH 0x08 +#define OV7725_COM2 0x09 +#define OV7725_PID 0x0A +#define OV7725_VER 0x0B +#define OV7725_COM3 0x0C +#define OV7725_COM4 0x0D +#define OV7725_COM5 0x0E +#define OV7725_COM6 0x0F +#define OV7725_AEC 0x10 +#define OV7725_CLKRC 0x11 +#define OV7725_COM7 0x12 +#define OV7725_COM8 0x13 +#define OV7725_COM9 0x14 +#define OV7725_COM10 0x15 +#define OV7725_REG16 0x16 +#define OV7725_HSTART 0x17 +#define OV7725_HSIZE 0x18 +#define OV7725_VSTRT 0x19 +#define OV7725_VSIZE 0x1A +#define OV7725_PSHFT 0x1B +#define OV7725_MIDH 0x1C +#define OV7725_MIDL 0x1D +#define OV7725_LAEC 0x1F +#define OV7725_COM11 0x20 +#define OV7725_BDBase 0x22 +#define OV7725_BDMStep 0x23 +#define OV7725_AEW 0x24 +#define OV7725_AEB 0x25 +#define OV7725_VPT 0x26 +#define OV7725_REG28 0x28 +#define OV7725_HOutSize 0x29 +#define OV7725_EXHCH 0x2A +#define OV7725_EXHCL 0x2B +#define OV7725_VOutSize 0x2C +#define OV7725_ADVFL 0x2D +#define OV7725_ADVFH 0x2E +#define OV7725_YAVE 0x2F +#define OV7725_LumHTh 0x30 +#define OV7725_LumLTh 0x31 +#define OV7725_HREF 0x32 +#define OV7725_DM_LNL 0x33 +#define OV7725_DM_LNH 0x34 +#define OV7725_ADoff_B 0x35 +#define OV7725_ADoff_R 0x36 +#define OV7725_ADoff_Gb 0x37 +#define OV7725_ADoff_Gr 0x38 +#define OV7725_Off_B 0x39 +#define OV7725_Off_R 0x3A +#define OV7725_Off_Gb 0x3B +#define OV7725_Off_Gr 0x3C +#define OV7725_COM12 0x3D +#define OV7725_COM13 0x3E +#define OV7725_COM14 0x3F +#define OV7725_COM16 0x41 +#define OV7725_TGT_B 0x42 +#define OV7725_TGT_R 0x43 +#define OV7725_TGT_Gb 0x44 +#define OV7725_TGT_Gr 0x45 +#define OV7725_LC_CTR 0x46 +#define OV7725_LC_XC 0x47 +#define OV7725_LC_YC 0x48 +#define OV7725_LC_COEF 0x49 +#define OV7725_LC_RADI 0x4A +#define OV7725_LC_COEFB 0x4B +#define OV7725_LC_COEFR 0x4C +#define OV7725_FixGain 0x4D +#define OV7725_AREF1 0x4F +#define OV7725_AREF6 0x54 +#define OV7725_UFix 0x60 +#define OV7725_VFix 0x61 +#define OV7725_AWBb_blk 0x62 +#define OV7725_AWB_Ctrl0 0x63 +#define OV7725_DSP_Ctrl1 0x64 +#define OV7725_DSP_Ctrl2 0x65 +#define OV7725_DSP_Ctrl3 0x66 +#define OV7725_DSP_Ctrl4 0x67 +#define OV7725_AWB_bias 0x68 +#define OV7725_AWBCtrl1 0x69 +#define OV7725_AWBCtrl2 0x6A +#define OV7725_AWBCtrl3 0x6B +#define OV7725_AWBCtrl4 0x6C +#define OV7725_AWBCtrl5 0x6D +#define OV7725_AWBCtrl6 0x6E +#define OV7725_AWBCtrl7 0x6F +#define OV7725_AWBCtrl8 0x70 +#define OV7725_AWBCtrl9 0x71 +#define OV7725_AWBCtrl10 0x72 +#define OV7725_AWBCtrl11 0x73 +#define OV7725_AWBCtrl12 0x74 +#define OV7725_AWBCtrl13 0x75 +#define OV7725_AWBCtrl14 0x76 +#define OV7725_AWBCtrl15 0x77 +#define OV7725_AWBCtrl16 0x78 +#define OV7725_AWBCtrl17 0x79 +#define OV7725_AWBCtrl18 0x7A +#define OV7725_AWBCtrl19 0x7B +#define OV7725_AWBCtrl20 0x7C +#define OV7725_AWBCtrl21 0x7D +#define OV7725_GAM1 0x7E +#define OV7725_GAM2 0x7F +#define OV7725_GAM3 0x80 +#define OV7725_GAM4 0x81 +#define OV7725_GAM5 0x82 +#define OV7725_GAM6 0x83 +#define OV7725_GAM7 0x84 +#define OV7725_GAM8 0x85 +#define OV7725_GAM9 0x86 +#define OV7725_GAM10 0x87 +#define OV7725_GAM11 0x88 +#define OV7725_GAM12 0x89 +#define OV7725_GAM13 0x8A +#define OV7725_GAM14 0x8B +#define OV7725_GAM15 0x8C +#define OV7725_SLOP 0x8D +#define OV7725_DNSTh 0x8E +#define OV7725_EDGE0 0x8F +#define OV7725_EDGE1 0x90 +#define OV7725_DNSOff 0x91 +#define OV7725_EDGE2 0x92 +#define OV7725_EDGE3 0x93 +#define OV7725_MTX1 0x94 +#define OV7725_MTX2 0x95 +#define OV7725_MTX3 0x96 +#define OV7725_MTX4 0x97 +#define OV7725_MTX5 0x98 +#define OV7725_MTX6 0x99 +#define OV7725_MTX_Ctrl 0x9A +#define OV7725_BRIGHT 0x9B +#define OV7725_CNST 0x9C +#define OV7725_UVADJ0 0x9E +#define OV7725_UVADJ1 0x9F +#define OV7725_SCAL0 0xA0 +#define OV7725_SCAL1 0xA1 +#define OV7725_SCAL2 0xA2 +#define OV7725_SDE 0xA6 +#define OV7725_USAT 0xA7 +#define OV7725_VSAT 0xA8 +#define OV7725_HUECOS 0xA9 +#define OV7725_HUESIN 0xAA +#define OV7725_SIGN 0xAB +#define OV7725_DSPAuto 0xAC + + +#define OV7725_DEV_ADD 0x42>>1 + + +//配置摄像头参数 +#define OV7725_W 160 //定义摄像头图像宽度 可设置参数 80 160 240 320 +#define OV7725_H 120 //定义摄像头图像高度 可设置参数 60 120 180 240 +#define OV7725_SIZE (OV7725_W * OV7725_H/8 ) //图像占用空间大小 +#define OV7725_DMA_NUM (OV7725_SIZE) //一副图像DMA采集次数 + + +//-------------------------------------------------------------------------------------------------- +//引脚配置 +//-------------------------------------------------------------------------------------------------- +#define OV7725_VSYNC_PIN ERU_CH3_REQ6_P02_0 //场中断引脚 可选范围参考ERU_PIN_enum枚举 不可与像素引脚选择为同一个通道,或者是共用中断的通道 + //例如场中断选择ERU_CH3 那么像素引脚就不能选择ERU_CH7,因为3和7的中断是共用的。 + +#define OV7725_DATA_PIN P00_0 //定义D0数据引脚 假设D0定义为P00_0 那么D1所使用的引脚则为P00_1,依次类推 + //可设置参数P00_0、P02_0、P15_0,不能设置为其他参数 + +#define OV7725_PCLK_PIN ERU_CH2_REQ14_P02_1 //定义像素时钟引脚 可选范围参考ERU_PIN_enum枚举 不可与场中断引脚选择为同一个通道,或者是共用中断的通道 + //例如场中断选择ERU_CH3 那么像素引脚就不能选择ERU_CH7,因为3和7的中断是共用的。 + +#define OV7725_DMA_CH IfxDma_ChannelId_5 //定义使用的DMA通道 0-47可选 通道号越大优先级越低 + //修改此处之后,需要修改对应的ERU中断优先级,例如此处设置为IfxDma_ChannelId_5则对应的ERU中断优先级应该设置为5 + + + +extern uint8 image_bin[OV7725_H][OV7725_W/8]; //定义存储接收图像的数组 +extern uint8 image_dec[OV7725_H][OV7725_W]; //图像解压后的数组 + +extern uint8 ov7725_finish_flag; //图像采集完成标志位 + + +//函数声明 +uint8 ov7725_init(void); +void ov7725_vsync(void); +void ov7725_dma(void); +void image_decompression(uint8 *data1,uint8 *data2); +void seekfree_sendimg_7725(UARTN_enum uartn); + + + +#endif + + + diff --git a/Example/11-Systick_Demo/Libraries/seekfree_peripheral/SEEKFREE_ICM20602.c b/Example/11-Systick_Demo/Libraries/seekfree_peripheral/SEEKFREE_ICM20602.c index 095f9e3..5d167c9 100644 --- a/Example/11-Systick_Demo/Libraries/seekfree_peripheral/SEEKFREE_ICM20602.c +++ b/Example/11-Systick_Demo/Libraries/seekfree_peripheral/SEEKFREE_ICM20602.c @@ -68,6 +68,7 @@ void icm20602_self1_check(void) //------------------------------------------------------------------------------------------------------------------- void icm20602_init(void) { + simiic_init(); systick_delay_ms(STM0, 10); //上电延时 //检测 diff --git a/Example/11-Systick_Demo/Libraries/seekfree_peripheral/SEEKFREE_IIC.c b/Example/11-Systick_Demo/Libraries/seekfree_peripheral/SEEKFREE_IIC.c index 196fd57..f56a41a 100644 --- a/Example/11-Systick_Demo/Libraries/seekfree_peripheral/SEEKFREE_IIC.c +++ b/Example/11-Systick_Demo/Libraries/seekfree_peripheral/SEEKFREE_IIC.c @@ -50,7 +50,7 @@ uint8 IIC_num; // -static uint16 simiic_delay_time=100; //ICM等传感器应设置为100 +static uint16 simiic_delay_time = SIMIIC_DELAY_TIME; //ICM等传感器应设置为20 //------------------------------------------------------------------------------------------------------------------- diff --git a/Example/11-Systick_Demo/Libraries/seekfree_peripheral/SEEKFREE_IIC.h b/Example/11-Systick_Demo/Libraries/seekfree_peripheral/SEEKFREE_IIC.h index 293a02a..6a9c1e3 100644 --- a/Example/11-Systick_Demo/Libraries/seekfree_peripheral/SEEKFREE_IIC.h +++ b/Example/11-Systick_Demo/Libraries/seekfree_peripheral/SEEKFREE_IIC.h @@ -34,8 +34,12 @@ -#define SEEKFREE_SCL P13_0 //定义SCL引脚 可任意更改为其他IO -#define SEEKFREE_SDA P13_1 //定义SDA引脚 可任意更改为其他IO +#define SEEKFREE_SCL P02_3 //定义SCL引脚 可任意更改为其他IO +#define SEEKFREE_SDA P02_2 //定义SDA引脚 可任意更改为其他IO + + +#define SIMIIC_DELAY_TIME 20 + typedef enum IIC //DAC模块 { diff --git a/Example/11-Systick_Demo/Libraries/seekfree_peripheral/SEEKFREE_L3G4200D.c b/Example/11-Systick_Demo/Libraries/seekfree_peripheral/SEEKFREE_L3G4200D.c index 0f0c23a..5deb7d3 100644 --- a/Example/11-Systick_Demo/Libraries/seekfree_peripheral/SEEKFREE_L3G4200D.c +++ b/Example/11-Systick_Demo/Libraries/seekfree_peripheral/SEEKFREE_L3G4200D.c @@ -65,6 +65,7 @@ void l3g4200d_self_check(void) //------------------------------------------------------------------------------------------------------------------- void l3g4200d_init(void) { + simiic_init(); systick_delay_ms(STM0, 50); l3g4200d_self_check(); diff --git a/Example/11-Systick_Demo/Libraries/seekfree_peripheral/SEEKFREE_MMA8451.c b/Example/11-Systick_Demo/Libraries/seekfree_peripheral/SEEKFREE_MMA8451.c index c200427..8a5eec4 100644 --- a/Example/11-Systick_Demo/Libraries/seekfree_peripheral/SEEKFREE_MMA8451.c +++ b/Example/11-Systick_Demo/Libraries/seekfree_peripheral/SEEKFREE_MMA8451.c @@ -68,6 +68,7 @@ void mma8451_self_check(void) //------------------------------------------------------------------------------------------------------------------- uint8 mma845x_init(void) { + simiic_init(); systick_delay_ms(STM0, 50); mma8451_self_check(); diff --git a/Example/11-Systick_Demo/Libraries/seekfree_peripheral/SEEKFREE_MPU6050.c b/Example/11-Systick_Demo/Libraries/seekfree_peripheral/SEEKFREE_MPU6050.c index 0317aa0..686550d 100644 --- a/Example/11-Systick_Demo/Libraries/seekfree_peripheral/SEEKFREE_MPU6050.c +++ b/Example/11-Systick_Demo/Libraries/seekfree_peripheral/SEEKFREE_MPU6050.c @@ -71,6 +71,7 @@ void mpu6050_self1_check(void) //------------------------------------------------------------------------------------------------------------------- void mpu6050_init(void) { + simiic_init(); systick_delay_ms(STM0, 100); //上电延时 mpu6050_self1_check(); diff --git a/Example/11-Systick_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.c b/Example/11-Systick_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.c index 014b435..05f181f 100644 --- a/Example/11-Systick_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.c +++ b/Example/11-Systick_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.c @@ -38,7 +38,6 @@ #include "zf_gpio.h" #include "zf_eru.h" #include "zf_eru_dma.h" -#include "stdio.h" #include "SEEKFREE_MT9V03X.h" @@ -49,6 +48,8 @@ uint8 receive[3]; uint8 receive_num = 0; vuint8 uart_receive_flag; +uint8 link_list_num; + //需要配置到摄像头的数据 int16 MT9V03X_CFG[CONFIG_FINISH][2]= { @@ -305,7 +306,7 @@ void mt9v03x_init(void) gpio_init((PIN_enum)(MT9V03X_DATA_PIN+i), GPI, 0, PULLUP); } - eru_dma_init(MT9V03X_DMA_CH, GET_PORT_IN_ADDR(MT9V03X_DATA_PIN), mt9v03x_image[0], MT9V03X_PCLK_PIN, RISING, MT9V03X_W); + link_list_num = eru_dma_init(MT9V03X_DMA_CH, GET_PORT_IN_ADDR(MT9V03X_DATA_PIN), mt9v03x_image[0], MT9V03X_PCLK_PIN, RISING, MT9V03X_W*MT9V03X_H); eru_init(MT9V03X_VSYNC_PIN, FALLING); //初始化场中断,并设置为下降沿触发中断 restoreInterrupts(interrupt_state); @@ -313,7 +314,6 @@ void mt9v03x_init(void) uint8 mt9v03x_finish_flag = 0; //一场图像采集完成标志位 -uint8 now_col; //当前正在采集的行 //------------------------------------------------------------------------------------------------------------------- // @brief MT9V03X摄像头场中断 // @param NULL @@ -324,16 +324,15 @@ uint8 now_col; // void mt9v03x_vsync(void) { CLEAR_GPIO_FLAG(MT9V03X_VSYNC_PIN); - now_col = 0; + if(!mt9v03x_finish_flag)//查看图像数组是否使用完毕,如果未使用完毕则不开始采集,避免出现访问冲突 { - DMA_SET_DESTINATION(MT9V03X_DMA_CH, (void *)&mt9v03x_image[0]); dma_start(MT9V03X_DMA_CH); } } - +uint8 mt9v03x_dma_int_num; //当前DMA中断次数 //------------------------------------------------------------------------------------------------------------------- // @brief MT9V03X摄像头DMA完成中断 // @param NULL @@ -344,16 +343,15 @@ void mt9v03x_vsync(void) void mt9v03x_dma(void) { CLEAR_DMA_FLAG(MT9V03X_DMA_CH); + mt9v03x_dma_int_num++; - now_col++; - - if(MT9V03X_H > now_col) - { - dma_start(MT9V03X_DMA_CH); - } - else + if(mt9v03x_dma_int_num >= link_list_num) { + //采集完成 + mt9v03x_dma_int_num = 0; mt9v03x_finish_flag = 1;//一副图像从采集开始到采集结束耗时3.8MS左右(50FPS、188*120分辨率) + dma_stop(MT9V03X_DMA_CH); + } } diff --git a/Example/11-Systick_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.h b/Example/11-Systick_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.h index a29edd2..0c8a785 100644 --- a/Example/11-Systick_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.h +++ b/Example/11-Systick_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.h @@ -63,9 +63,7 @@ //例如场中断选择ERU_CH3 那么像素引脚就不能选择ERU_CH7,因为3和7的中断是共用的。 #define MT9V03X_DMA_CH IfxDma_ChannelId_5 //定义使用的DMA通道 0-47可选 通道号越大优先级越低 - //修改此处之后,需要修改对应的ERU中断优先级,例如此处设置为IfxDma_ChannelId_5则对应的ERU中断优先级应该设置为5 - - + //摄像头命令枚举 typedef enum { diff --git a/Example/11-Systick_Demo/USER/isr.c b/Example/11-Systick_Demo/USER/isr.c index 15666f2..c6376b0 100644 --- a/Example/11-Systick_Demo/USER/isr.c +++ b/Example/11-Systick_Demo/USER/isr.c @@ -98,7 +98,8 @@ IFX_INTERRUPT(eru_ch3_ch7_isr, ERU_CH3_CH7_INT_SERVICE, ERU_CH3_CH7_INT_PRIO) if(GET_GPIO_FLAG(ERU_CH3_REQ6_P02_0))//通道3中断 { CLEAR_GPIO_FLAG(ERU_CH3_REQ6_P02_0); - if(1 == camera_type)mt9v03x_vsync(); + if (1 == camera_type) mt9v03x_vsync(); + else if (3 == camera_type) ov7725_vsync(); } if(GET_GPIO_FLAG(ERU_CH7_REQ16_P15_1))//通道7中断 @@ -113,7 +114,8 @@ IFX_INTERRUPT(eru_ch3_ch7_isr, ERU_CH3_CH7_INT_SERVICE, ERU_CH3_CH7_INT_PRIO) IFX_INTERRUPT(dma_ch5_isr, ERU_DMA_INT_SERVICE, ERU_DMA_INT_PRIO) { - if(1 == camera_type) mt9v03x_dma(); + if (1 == camera_type) mt9v03x_dma(); + else if (3 == camera_type) ov7725_dma(); } diff --git a/Example/12-Dual_Core_Demo/Libraries/doc/version.txt b/Example/12-Dual_Core_Demo/Libraries/doc/version.txt index b85cd50..a42bc58 100644 --- a/Example/12-Dual_Core_Demo/Libraries/doc/version.txt +++ b/Example/12-Dual_Core_Demo/Libraries/doc/version.txt @@ -1,9 +1,17 @@ V1.0.0 - 初始版本 + 初始版本 V1.0.1 对总钻风摄像头的场中断进行修改,判断标志位为0才采集下一幅图像,避免出现访问冲突 修改SPI初始化中的错误,引用了固定的SPI2基地址 修复STM中无法使用STM1的问题 - 修复gtm pwm中最大占空比只有GTM_ATOM0_PWM_DUTY_MAX设置有效的问题 \ No newline at end of file + 修复gtm pwm中最大占空比只有GTM_ATOM0_PWM_DUTY_MAX设置有效的问题 + +V1.0.2 + 修改模拟IIC默认延时时间为20 + 添加 需要特别注意P20_2是不能用于输出的,仅仅只有输入的功能 注意事项 + 将摄像头采集DMA改为link传输,可以大大降低DMA中断次数 + 修改默认的软件IIC引脚定义 + 将6050等 需要用到软件IIC的模块,在初始化函数中默认调用模拟IIC初始化 + 添加小钻风驱动程序 \ No newline at end of file diff --git a/Example/12-Dual_Core_Demo/Libraries/seekfree_libraries/common/common.c b/Example/12-Dual_Core_Demo/Libraries/seekfree_libraries/common/common.c index 0460d15..ac42b19 100644 --- a/Example/12-Dual_Core_Demo/Libraries/seekfree_libraries/common/common.c +++ b/Example/12-Dual_Core_Demo/Libraries/seekfree_libraries/common/common.c @@ -22,7 +22,7 @@ #include "SysSe/Bsp/Bsp.h" #include "common.h" -uint8 camera_type; +uint8 camera_type; //摄像头型号 1:总钻风 2:凌瞳(暂未支持)3:小钻风 diff --git a/Example/12-Dual_Core_Demo/Libraries/seekfree_libraries/common/common.h b/Example/12-Dual_Core_Demo/Libraries/seekfree_libraries/common/common.h index fe7ec63..13d03cd 100644 --- a/Example/12-Dual_Core_Demo/Libraries/seekfree_libraries/common/common.h +++ b/Example/12-Dual_Core_Demo/Libraries/seekfree_libraries/common/common.h @@ -111,7 +111,7 @@ typedef enum //枚 #include -extern uint8 camera_type; +extern uint8 camera_type; //摄像头型号 1:总钻风 2:凌瞳(暂未支持)3:小钻风 void get_clk(void); diff --git a/Example/12-Dual_Core_Demo/Libraries/seekfree_libraries/headfile.h b/Example/12-Dual_Core_Demo/Libraries/seekfree_libraries/headfile.h index 0e8024f..e11bd83 100644 --- a/Example/12-Dual_Core_Demo/Libraries/seekfree_libraries/headfile.h +++ b/Example/12-Dual_Core_Demo/Libraries/seekfree_libraries/headfile.h @@ -62,6 +62,7 @@ #include "SEEKFREE_L3G4200D.h" #include "SEEKFREE_WIRELESS.h" #include "SEEKFREE_IPS200_PARALLEL8.h" +#include "SEEKFREE_7725.h" #endif diff --git a/Example/12-Dual_Core_Demo/Libraries/seekfree_libraries/zf_eru_dma.c b/Example/12-Dual_Core_Demo/Libraries/seekfree_libraries/zf_eru_dma.c index f7aab10..86c0158 100644 --- a/Example/12-Dual_Core_Demo/Libraries/seekfree_libraries/zf_eru_dma.c +++ b/Example/12-Dual_Core_Demo/Libraries/seekfree_libraries/zf_eru_dma.c @@ -21,9 +21,18 @@ #include "IfxDma_Dma.h" #include "IfxScuEru.h" #include "isr_config.h" +#include "zf_assert.h" #include "zf_eru_dma.h" +typedef struct +{ + Ifx_DMA_CH IFX_ALIGN(256) linked_list[8];//DMA链表 + IfxDma_Dma_Channel channel; //DMA通道句柄 +}DMA_LINK; + + +DMA_LINK dma_link_list; //------------------------------------------------------------------------------------------------------------------- // @brief eru触发dma初始化 @@ -36,7 +45,7 @@ // @return void // Sample usage: //------------------------------------------------------------------------------------------------------------------- -void eru_dma_init(IfxDma_ChannelId dma_ch, uint8 *source_addr, uint8 *destination_addr, ERU_PIN_enum eru_pin, TRIGGER_enum trigger, uint16 dma_count) +uint8 eru_dma_init(IfxDma_ChannelId dma_ch, uint8 *source_addr, uint8 *destination_addr, ERU_PIN_enum eru_pin, TRIGGER_enum trigger, uint16 dma_count) { IfxDma_Dma_Channel dmaChn; //eru触发DMA通道号 在eru文件中设置eru的优先级,即为触发的通道 @@ -51,27 +60,85 @@ void eru_dma_init(IfxDma_ChannelId dma_ch, uint8 *source_addr, uint8 *destinatio IfxDma_Dma_ChannelConfig cfg; IfxDma_Dma_initChannelConfig(&cfg, &dma); - cfg.transferCount = dma_count; + uint8 list_num, i; + uint16 single_channel_dma_count; + + ZF_ASSERT(!(dma_count%8));//传输次数必须为8的倍数 + + + list_num = 1; + single_channel_dma_count = dma_count / list_num; + if(16384 < single_channel_dma_count) + { + while(TRUE) + { + single_channel_dma_count = dma_count / list_num; + if((single_channel_dma_count <= 16384) && !(dma_count % list_num)) + { + break; + } + list_num++; + if(list_num > 8) ZF_ASSERT(FALSE); + } + } + + + if(1 == list_num) + { + cfg.shadowControl = IfxDma_ChannelShadow_none; + cfg.operationMode = IfxDma_ChannelOperationMode_single; + cfg.shadowAddress = 0; + } + else + { + cfg.shadowControl = IfxDma_ChannelShadow_linkedList; + cfg.operationMode = IfxDma_ChannelOperationMode_continuous; + cfg.shadowAddress = IFXCPU_GLB_ADDR_DSPR(IfxCpu_getCoreId(), (unsigned)&dma_link_list.linked_list[1]); + } + cfg.requestMode = IfxDma_ChannelRequestMode_oneTransferPerRequest; cfg.moveSize = IfxDma_ChannelMoveSize_8bit; + cfg.busPriority = IfxDma_ChannelBusPriority_high; - cfg.busPriority = IfxDma_ChannelBusPriority_high; - - cfg.sourceAddress = (unsigned)(source_addr); + cfg.sourceAddress = IFXCPU_GLB_ADDR_DSPR(IfxCpu_getCoreId(), source_addr); cfg.sourceAddressCircularRange = IfxDma_ChannelIncrementCircular_none; cfg.sourceCircularBufferEnabled = TRUE; - cfg.destinationAddress = IFXCPU_GLB_ADDR_DSPR(IfxCpu_getCoreId(), destination_addr); cfg.destinationAddressIncrementStep = IfxDma_ChannelIncrementStep_1; - cfg.operationMode = IfxDma_ChannelOperationMode_single; - cfg.channelId = (IfxDma_ChannelId)dma_ch; - cfg.hardwareRequestEnabled = TRUE; - cfg.channelInterruptEnabled = TRUE; + cfg.channelId = (IfxDma_ChannelId)dma_ch; + cfg.hardwareRequestEnabled = FALSE; + cfg.channelInterruptEnabled = TRUE; cfg.channelInterruptPriority = ERU_DMA_INT_PRIO; cfg.channelInterruptTypeOfService = (IfxSrc_Tos)ERU_DMA_INT_SERVICE; + + + cfg.destinationAddress = IFXCPU_GLB_ADDR_DSPR(IfxCpu_getCoreId(), destination_addr); + + cfg.transferCount = single_channel_dma_count; + IfxDma_Dma_initChannel(&dmaChn, &cfg); + + if(1 < list_num) + { + i = 0; + while(i < list_num) + { + cfg.destinationAddress = IFXCPU_GLB_ADDR_DSPR(IfxCpu_getCoreId(), destination_addr + single_channel_dma_count * i); + if(i == (list_num - 1)) cfg.shadowAddress = IFXCPU_GLB_ADDR_DSPR(IfxCpu_getCoreId(), (unsigned)&dma_link_list.linked_list[0]); + else cfg.shadowAddress = IFXCPU_GLB_ADDR_DSPR(IfxCpu_getCoreId(), (unsigned)&dma_link_list.linked_list[i+1]); + cfg.transferCount = single_channel_dma_count; + + IfxDma_Dma_initLinkedListEntry((void *)&dma_link_list.linked_list[i], &cfg); + i++; + } + } + + + IfxDma_Dma_getSrcPointer(&dma_link_list.channel)->B.CLRR = 1; + + return list_num; } diff --git a/Example/12-Dual_Core_Demo/Libraries/seekfree_libraries/zf_eru_dma.h b/Example/12-Dual_Core_Demo/Libraries/seekfree_libraries/zf_eru_dma.h index 50667ad..faef169 100644 --- a/Example/12-Dual_Core_Demo/Libraries/seekfree_libraries/zf_eru_dma.h +++ b/Example/12-Dual_Core_Demo/Libraries/seekfree_libraries/zf_eru_dma.h @@ -29,9 +29,9 @@ #define CLEAR_DMA_FLAG(dma_ch) IfxDma_clearChannelInterrupt(&MODULE_DMA, dma_ch); -#define DMA_SET_DESTINATION(dma_ch, destination_addr) IfxDma_setChannelDestinationAddress(&MODULE_DMA, dma_ch, (void *)destination_addr) +#define DMA_SET_DESTINATION(dma_ch, destination_addr) IfxDma_setChannelDestinationAddress(&MODULE_DMA, dma_ch, (void *)IFXCPU_GLB_ADDR_DSPR(IfxCpu_getCoreId(), destination_addr)) -void eru_dma_init(IfxDma_ChannelId dma_ch, uint8 *source_addr, uint8 *destination_addr, ERU_PIN_enum eru_pin, TRIGGER_enum trigger, uint16 dma_count); +uint8 eru_dma_init(IfxDma_ChannelId dma_ch, uint8 *source_addr, uint8 *destination_addr, ERU_PIN_enum eru_pin, TRIGGER_enum trigger, uint16 dma_count); void dma_stop(IfxDma_ChannelId dma_ch); void dma_start(IfxDma_ChannelId dma_ch); diff --git a/Example/12-Dual_Core_Demo/Libraries/seekfree_libraries/zf_gpio.c b/Example/12-Dual_Core_Demo/Libraries/seekfree_libraries/zf_gpio.c index 3c937cf..1d2466c 100644 --- a/Example/12-Dual_Core_Demo/Libraries/seekfree_libraries/zf_gpio.c +++ b/Example/12-Dual_Core_Demo/Libraries/seekfree_libraries/zf_gpio.c @@ -60,6 +60,7 @@ Ifx_P* get_port(PIN_enum pin) // @param pinmode 引脚配置(可设置参数由zf_gpio.h文件内GPIOMODE_enum枚举值确定) // @return void // Sample usage: gpio_init(P00_0, GPO, 1, PUSHPULL);//P00_0初始化为GPIO功能、输出模式、输出高电平、推挽输出 +// @note 需要特别注意P20_2是不能用于输出的,仅仅只有输入的功能 //------------------------------------------------------------------------------------------------------------------- void gpio_init(PIN_enum pin, GPIODIR_enum dir, uint8 dat, GPIOMODE_enum pinmode) { diff --git a/Example/12-Dual_Core_Demo/Libraries/seekfree_libraries/zf_gpio.h b/Example/12-Dual_Core_Demo/Libraries/seekfree_libraries/zf_gpio.h index cfbd666..e3d144f 100644 --- a/Example/12-Dual_Core_Demo/Libraries/seekfree_libraries/zf_gpio.h +++ b/Example/12-Dual_Core_Demo/Libraries/seekfree_libraries/zf_gpio.h @@ -38,6 +38,15 @@ typedef enum // 枚 #define GET_PORT_IN_ADDR(pin) (uint8 *)(&IfxPort_getAddress((IfxPort_Index)(pin/32))->IN + pin%32/8) + + +//需要特别注意P20_2是不能用于输出的,仅仅只有输入的功能 +//需要特别注意P20_2是不能用于输出的,仅仅只有输入的功能 +//需要特别注意P20_2是不能用于输出的,仅仅只有输入的功能 + + + + //------------------------------------------------------ //通用GPIO操作 void gpio_init(PIN_enum pin, GPIODIR_enum dir, uint8 dat, GPIOMODE_enum pinconf); diff --git a/Example/12-Dual_Core_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.c b/Example/12-Dual_Core_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.c new file mode 100644 index 0000000..806b8d9 --- /dev/null +++ b/Example/12-Dual_Core_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.c @@ -0,0 +1,262 @@ +/********************************************************************************************************************* + * COPYRIGHT NOTICE + * Copyright (c) 2020,逐飞科技 + * All rights reserved. + * 技术讨论QQ群:三群:824575535 + * + * 以下所有内容版权均属逐飞科技所有,未经允许不得用于商业用途, + * 欢迎各位使用并传播本程序,修改内容时必须保留逐飞科技的版权声明。 + * + * @file main + * @company 成都逐飞科技有限公司 + * @author 逐飞科技(QQ3184284598) + * @version 查看doc内version文件 版本说明 + * @Software tasking v6.3r1 + * @Target core TC264D + * @Taobao https://seekfree.taobao.com/ + * @date 2020-3-23 + * @note + 接线定义: + ------------------------------------ + 模块管脚 单片机管脚 + SDA 查看SEEKFREE_IIC文件内的SEEKFREE_SDA宏定义 + SCL 查看SEEKFREE_IIC文件内的SEEKFREE_SCL宏定义 + 场中断(VSY) 查看SEEKFREE_OV7725.h文件中的OV7725_VSYNC_PIN宏定义 + 行中断(HREF) 未使用,因此不接 + 像素中断(PCLK) 查看SEEKFREE_OV7725.h文件中的OV7725_PCLK_PIN宏定义 + 数据口(D0-D7) 查看SEEKFREE_OV7725.h文件中的OV7725_DATA_PIN宏定义 + ------------------------------------ + + 默认分辨率是 160*120 + 默认FPS 50帧 + ********************************************************************************************************************/ + + +#include "IfxDma.h" +#include "IfxScuEru.h" +#include "zf_stm_systick.h" +#include "zf_gpio.h" +#include "zf_eru.h" +#include "zf_eru_dma.h" +#include "SEEKFREE_IIC.h" +#include "SEEKFREE_7725.h" + + + +IFX_ALIGN(4) uint8 image_bin[OV7725_H][OV7725_W/8]; //定义存储接收图像的数组 +uint8 image_dec[OV7725_H][OV7725_W]; + +uint8 ov7725_idcode = 0; + +//------------------------------------------------------------------------------------------------------------------- +// @brief 小钻风摄像头内部寄存器初始化(内部使用,用户无需调用) +// @param NULL +// @return uint8 返回0则出错,返回1则成功 +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +uint8 ov7725_reg_init(void) +{ + simiic_delay_set(500); + simiic_write_reg ( OV7725_DEV_ADD, OV7725_COM7, 0x80 ); //复位摄像头 + systick_delay_ms(STM0, 50); + ov7725_idcode = simiic_read_reg( OV7725_DEV_ADD, OV7725_VER ,SCCB); + if( ov7725_idcode != OV7725_ID ) return 0; //校验摄像头ID号 + + //ID号确认无误 然后配置寄存器 + simiic_write_reg(OV7725_DEV_ADD, OV7725_COM4 , 0xC1); + simiic_write_reg(OV7725_DEV_ADD, OV7725_CLKRC , 0x01); + simiic_write_reg(OV7725_DEV_ADD, OV7725_COM2 , 0x03); + simiic_write_reg(OV7725_DEV_ADD, OV7725_COM3 , 0xD0); + simiic_write_reg(OV7725_DEV_ADD, OV7725_COM7 , 0x40); + simiic_write_reg(OV7725_DEV_ADD, OV7725_COM8 , 0xCE); //0xCE:关闭自动曝光 0xCF:开启自动曝光 + simiic_write_reg(OV7725_DEV_ADD, OV7725_HSTART , 0x3F); + simiic_write_reg(OV7725_DEV_ADD, OV7725_HSIZE , 0x50); + simiic_write_reg(OV7725_DEV_ADD, OV7725_VSTRT , 0x03); + simiic_write_reg(OV7725_DEV_ADD, OV7725_VSIZE , 0x78); + simiic_write_reg(OV7725_DEV_ADD, OV7725_HREF , 0x00); + simiic_write_reg(OV7725_DEV_ADD, OV7725_SCAL0 , 0x0A); + simiic_write_reg(OV7725_DEV_ADD, OV7725_AWB_Ctrl0 , 0xE0); + simiic_write_reg(OV7725_DEV_ADD, OV7725_DSPAuto , 0xff); + simiic_write_reg(OV7725_DEV_ADD, OV7725_DSP_Ctrl2 , 0x0C); + simiic_write_reg(OV7725_DEV_ADD, OV7725_DSP_Ctrl3 , 0x00); + simiic_write_reg(OV7725_DEV_ADD, OV7725_DSP_Ctrl4 , 0x00); + + if(OV7725_W == 80) simiic_write_reg(OV7725_DEV_ADD, OV7725_HOutSize , 0x14); + else if(OV7725_W == 160) simiic_write_reg(OV7725_DEV_ADD, OV7725_HOutSize , 0x28); + else if(OV7725_W == 240) simiic_write_reg(OV7725_DEV_ADD, OV7725_HOutSize , 0x3c); + else if(OV7725_W == 320) simiic_write_reg(OV7725_DEV_ADD, OV7725_HOutSize , 0x50); + + if(OV7725_H == 60) simiic_write_reg(OV7725_DEV_ADD, OV7725_VOutSize , 0x1E); + else if(OV7725_H == 120) simiic_write_reg(OV7725_DEV_ADD, OV7725_VOutSize , 0x3c); + else if(OV7725_H == 180) simiic_write_reg(OV7725_DEV_ADD, OV7725_VOutSize , 0x5a); + else if(OV7725_H == 240) simiic_write_reg(OV7725_DEV_ADD, OV7725_VOutSize , 0x78); + + simiic_write_reg(OV7725_DEV_ADD, OV7725_REG28 , 0x01); + simiic_write_reg(OV7725_DEV_ADD, OV7725_EXHCH , 0x10); + simiic_write_reg(OV7725_DEV_ADD, OV7725_EXHCL , 0x1F); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM1 , 0x0c); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM2 , 0x16); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM3 , 0x2a); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM4 , 0x4e); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM5 , 0x61); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM6 , 0x6f); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM7 , 0x7b); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM8 , 0x86); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM9 , 0x8e); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM10 , 0x97); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM11 , 0xa4); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM12 , 0xaf); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM13 , 0xc5); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM14 , 0xd7); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM15 , 0xe8); + simiic_write_reg(OV7725_DEV_ADD, OV7725_SLOP , 0x20); + simiic_write_reg(OV7725_DEV_ADD, OV7725_LC_RADI , 0x00); + simiic_write_reg(OV7725_DEV_ADD, OV7725_LC_COEF , 0x13); + simiic_write_reg(OV7725_DEV_ADD, OV7725_LC_XC , 0x08); + simiic_write_reg(OV7725_DEV_ADD, OV7725_LC_COEFB , 0x14); + simiic_write_reg(OV7725_DEV_ADD, OV7725_LC_COEFR , 0x17); + simiic_write_reg(OV7725_DEV_ADD, OV7725_LC_CTR , 0x05); + simiic_write_reg(OV7725_DEV_ADD, OV7725_BDBase , 0x99); + simiic_write_reg(OV7725_DEV_ADD, OV7725_BDMStep , 0x03); + simiic_write_reg(OV7725_DEV_ADD, OV7725_SDE , 0x04); + simiic_write_reg(OV7725_DEV_ADD, OV7725_BRIGHT , 0x00); + simiic_write_reg(OV7725_DEV_ADD, OV7725_CNST , 0x40); + simiic_write_reg(OV7725_DEV_ADD, OV7725_SIGN , 0x06); + simiic_write_reg(OV7725_DEV_ADD, OV7725_UVADJ0 , 0x11); + simiic_write_reg(OV7725_DEV_ADD, OV7725_UVADJ1 , 0x02); + + + simiic_delay_set(SIMIIC_DELAY_TIME);//修改为默认的20 + return 1; + + +} + + + + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 小钻风摄像头采集程序初始化(内部使用,用户无需调用) +// @param NULL +// @return void +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +void ov7725_port_init(void) +{ + uint8 i; + camera_type = 3;//设置连接摄像头类型 + + //摄像头采集初始化 + //初始化 数据引脚 + for(i=0; i<8; i++) + { + gpio_init((PIN_enum)(OV7725_DATA_PIN+i), GPI, 0, PULLUP); + } + eru_dma_init(OV7725_DMA_CH, GET_PORT_IN_ADDR(OV7725_DATA_PIN), image_bin[0], OV7725_PCLK_PIN, FALLING, OV7725_DMA_NUM); + eru_init(OV7725_VSYNC_PIN, FALLING); //初始化场中断,并设置为下降沿触发中断 + +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 小钻风摄像头初始化(调用之后设置好相关中断函数即可采集图像) +// @param NULL +// @return 0 +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +uint8 ov7725_init(void) +{ + simiic_init(); + ov7725_reg_init(); //摄像头寄存器配置 + ov7725_port_init(); //摄像头中断引脚及DMA配置 + return 0; +} + + + + +uint8 ov7725_finish_flag = 0; +//------------------------------------------------------------------------------------------------------------------- +// @brief 小钻风摄像头场中断 +// @param NULL +// @return void +// @since v1.0 +// Sample usage: 此函数在isr.c中被eru(GPIO中断)中断调用 +//------------------------------------------------------------------------------------------------------------------- +void ov7725_vsync(void) +{ + CLEAR_GPIO_FLAG(OV7725_VSYNC_PIN); + + if(!ov7725_finish_flag)//查看图像数组是否使用完毕,如果未使用完毕则不开始采集,避免出现访问冲突 + { + DMA_SET_DESTINATION(OV7725_DMA_CH, image_bin[0]); + dma_start(OV7725_DMA_CH); + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 小钻风摄像头DMA完成中断 +// @param NULL +// @return void +// @since v1.0 +// Sample usage: 此函数在isr.c中被dma中断调用 +//------------------------------------------------------------------------------------------------------------------- +void ov7725_dma(void) +{ + CLEAR_DMA_FLAG(OV7725_DMA_CH); + ov7725_finish_flag = 1; + dma_stop(OV7725_DMA_CH); +} + + + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 小钻风摄像头数据解压函数 +// @param *data1 源地址 +// @param *data2 目的地址 +// @return void +// @since v1.0 +// Sample usage: Image_Decompression(da1,dat2[0]);//将一维数组dat1的内容解压到二维数组dat2里. +//------------------------------------------------------------------------------------------------------------------- +void image_decompression(uint8 *data1,uint8 *data2) +{ + uint8 temp[2] = {0,255}; + uint16 lenth = OV7725_SIZE; + uint8 i = 8; + + + while(lenth--) + { + i = 8; + while(i--) + { + *data2++ = temp[(*data1 >> i) & 0x01]; + } + data1++; + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 小钻风摄像头未解压图像发送至上位机查看图像 +// @param *imgaddr 压缩图像数据地址 +// @param *imgsize 图像大小(直接填写OV7725_SIZE) +// @return void +// @since v1.0 +// Sample usage: 调用该函数前请先初始化uart2 +//------------------------------------------------------------------------------------------------------------------- +void seekfree_sendimg_7725(UARTN_enum uartn) +{ + uart_putchar(uartn, 0x00);uart_putchar(uartn, 0xff);uart_putchar(uartn, 0x01);uart_putchar(uartn, 0x01);//发送四个字节命令 + uart_putbuff(uartn, image_bin[0], OV7725_SIZE); //再发送图像 +} + + + + diff --git a/Example/12-Dual_Core_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.h b/Example/12-Dual_Core_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.h new file mode 100644 index 0000000..e513250 --- /dev/null +++ b/Example/12-Dual_Core_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.h @@ -0,0 +1,243 @@ +/********************************************************************************************************************* + * COPYRIGHT NOTICE + * Copyright (c) 2020,逐飞科技 + * All rights reserved. + * 技术讨论QQ群:三群:824575535 + * + * 以下所有内容版权均属逐飞科技所有,未经允许不得用于商业用途, + * 欢迎各位使用并传播本程序,修改内容时必须保留逐飞科技的版权声明。 + * + * @file main + * @company 成都逐飞科技有限公司 + * @author 逐飞科技(QQ3184284598) + * @version 查看doc内version文件 版本说明 + * @Software tasking v6.3r1 + * @Target core TC264D + * @Taobao https://seekfree.taobao.com/ + * @date 2020-3-23 + * @note + 接线定义: + ------------------------------------ + 模块管脚 单片机管脚 + SDA 查看SEEKFREE_IIC文件内的SEEKFREE_SDA宏定义 + SCL 查看SEEKFREE_IIC文件内的SEEKFREE_SCL宏定义 + 场中断(VSY) 查看SEEKFREE_OV7725.h文件中的OV7725_VSYNC_PIN宏定义 + 行中断(HREF) 未使用,因此不接 + 像素中断(PCLK) 查看SEEKFREE_OV7725.h文件中的OV7725_PCLK_PIN宏定义 + 数据口(D0-D7) 查看SEEKFREE_OV7725.h文件中的OV7725_DATA_PIN宏定义 + ------------------------------------ + + 默认分辨率是 160*120 + 默认FPS 50帧 + ********************************************************************************************************************/ + + + +#ifndef _SEEKFREE_7725_h +#define _SEEKFREE_7725_h + +#include "common.h" +#include "IfxDma_cfg.h" +#include "zf_uart.h" + + +//摄像头ID号 +#define OV7725_ID 0x21 + +//摄像头寄存器 +#define OV7725_GAIN 0x00 +#define OV7725_BLUE 0x01 +#define OV7725_RED 0x02 +#define OV7725_GREEN 0x03 +#define OV7725_BAVG 0x05 +#define OV7725_GAVG 0x06 +#define OV7725_RAVG 0x07 +#define OV7725_AECH 0x08 +#define OV7725_COM2 0x09 +#define OV7725_PID 0x0A +#define OV7725_VER 0x0B +#define OV7725_COM3 0x0C +#define OV7725_COM4 0x0D +#define OV7725_COM5 0x0E +#define OV7725_COM6 0x0F +#define OV7725_AEC 0x10 +#define OV7725_CLKRC 0x11 +#define OV7725_COM7 0x12 +#define OV7725_COM8 0x13 +#define OV7725_COM9 0x14 +#define OV7725_COM10 0x15 +#define OV7725_REG16 0x16 +#define OV7725_HSTART 0x17 +#define OV7725_HSIZE 0x18 +#define OV7725_VSTRT 0x19 +#define OV7725_VSIZE 0x1A +#define OV7725_PSHFT 0x1B +#define OV7725_MIDH 0x1C +#define OV7725_MIDL 0x1D +#define OV7725_LAEC 0x1F +#define OV7725_COM11 0x20 +#define OV7725_BDBase 0x22 +#define OV7725_BDMStep 0x23 +#define OV7725_AEW 0x24 +#define OV7725_AEB 0x25 +#define OV7725_VPT 0x26 +#define OV7725_REG28 0x28 +#define OV7725_HOutSize 0x29 +#define OV7725_EXHCH 0x2A +#define OV7725_EXHCL 0x2B +#define OV7725_VOutSize 0x2C +#define OV7725_ADVFL 0x2D +#define OV7725_ADVFH 0x2E +#define OV7725_YAVE 0x2F +#define OV7725_LumHTh 0x30 +#define OV7725_LumLTh 0x31 +#define OV7725_HREF 0x32 +#define OV7725_DM_LNL 0x33 +#define OV7725_DM_LNH 0x34 +#define OV7725_ADoff_B 0x35 +#define OV7725_ADoff_R 0x36 +#define OV7725_ADoff_Gb 0x37 +#define OV7725_ADoff_Gr 0x38 +#define OV7725_Off_B 0x39 +#define OV7725_Off_R 0x3A +#define OV7725_Off_Gb 0x3B +#define OV7725_Off_Gr 0x3C +#define OV7725_COM12 0x3D +#define OV7725_COM13 0x3E +#define OV7725_COM14 0x3F +#define OV7725_COM16 0x41 +#define OV7725_TGT_B 0x42 +#define OV7725_TGT_R 0x43 +#define OV7725_TGT_Gb 0x44 +#define OV7725_TGT_Gr 0x45 +#define OV7725_LC_CTR 0x46 +#define OV7725_LC_XC 0x47 +#define OV7725_LC_YC 0x48 +#define OV7725_LC_COEF 0x49 +#define OV7725_LC_RADI 0x4A +#define OV7725_LC_COEFB 0x4B +#define OV7725_LC_COEFR 0x4C +#define OV7725_FixGain 0x4D +#define OV7725_AREF1 0x4F +#define OV7725_AREF6 0x54 +#define OV7725_UFix 0x60 +#define OV7725_VFix 0x61 +#define OV7725_AWBb_blk 0x62 +#define OV7725_AWB_Ctrl0 0x63 +#define OV7725_DSP_Ctrl1 0x64 +#define OV7725_DSP_Ctrl2 0x65 +#define OV7725_DSP_Ctrl3 0x66 +#define OV7725_DSP_Ctrl4 0x67 +#define OV7725_AWB_bias 0x68 +#define OV7725_AWBCtrl1 0x69 +#define OV7725_AWBCtrl2 0x6A +#define OV7725_AWBCtrl3 0x6B +#define OV7725_AWBCtrl4 0x6C +#define OV7725_AWBCtrl5 0x6D +#define OV7725_AWBCtrl6 0x6E +#define OV7725_AWBCtrl7 0x6F +#define OV7725_AWBCtrl8 0x70 +#define OV7725_AWBCtrl9 0x71 +#define OV7725_AWBCtrl10 0x72 +#define OV7725_AWBCtrl11 0x73 +#define OV7725_AWBCtrl12 0x74 +#define OV7725_AWBCtrl13 0x75 +#define OV7725_AWBCtrl14 0x76 +#define OV7725_AWBCtrl15 0x77 +#define OV7725_AWBCtrl16 0x78 +#define OV7725_AWBCtrl17 0x79 +#define OV7725_AWBCtrl18 0x7A +#define OV7725_AWBCtrl19 0x7B +#define OV7725_AWBCtrl20 0x7C +#define OV7725_AWBCtrl21 0x7D +#define OV7725_GAM1 0x7E +#define OV7725_GAM2 0x7F +#define OV7725_GAM3 0x80 +#define OV7725_GAM4 0x81 +#define OV7725_GAM5 0x82 +#define OV7725_GAM6 0x83 +#define OV7725_GAM7 0x84 +#define OV7725_GAM8 0x85 +#define OV7725_GAM9 0x86 +#define OV7725_GAM10 0x87 +#define OV7725_GAM11 0x88 +#define OV7725_GAM12 0x89 +#define OV7725_GAM13 0x8A +#define OV7725_GAM14 0x8B +#define OV7725_GAM15 0x8C +#define OV7725_SLOP 0x8D +#define OV7725_DNSTh 0x8E +#define OV7725_EDGE0 0x8F +#define OV7725_EDGE1 0x90 +#define OV7725_DNSOff 0x91 +#define OV7725_EDGE2 0x92 +#define OV7725_EDGE3 0x93 +#define OV7725_MTX1 0x94 +#define OV7725_MTX2 0x95 +#define OV7725_MTX3 0x96 +#define OV7725_MTX4 0x97 +#define OV7725_MTX5 0x98 +#define OV7725_MTX6 0x99 +#define OV7725_MTX_Ctrl 0x9A +#define OV7725_BRIGHT 0x9B +#define OV7725_CNST 0x9C +#define OV7725_UVADJ0 0x9E +#define OV7725_UVADJ1 0x9F +#define OV7725_SCAL0 0xA0 +#define OV7725_SCAL1 0xA1 +#define OV7725_SCAL2 0xA2 +#define OV7725_SDE 0xA6 +#define OV7725_USAT 0xA7 +#define OV7725_VSAT 0xA8 +#define OV7725_HUECOS 0xA9 +#define OV7725_HUESIN 0xAA +#define OV7725_SIGN 0xAB +#define OV7725_DSPAuto 0xAC + + +#define OV7725_DEV_ADD 0x42>>1 + + +//配置摄像头参数 +#define OV7725_W 160 //定义摄像头图像宽度 可设置参数 80 160 240 320 +#define OV7725_H 120 //定义摄像头图像高度 可设置参数 60 120 180 240 +#define OV7725_SIZE (OV7725_W * OV7725_H/8 ) //图像占用空间大小 +#define OV7725_DMA_NUM (OV7725_SIZE) //一副图像DMA采集次数 + + +//-------------------------------------------------------------------------------------------------- +//引脚配置 +//-------------------------------------------------------------------------------------------------- +#define OV7725_VSYNC_PIN ERU_CH3_REQ6_P02_0 //场中断引脚 可选范围参考ERU_PIN_enum枚举 不可与像素引脚选择为同一个通道,或者是共用中断的通道 + //例如场中断选择ERU_CH3 那么像素引脚就不能选择ERU_CH7,因为3和7的中断是共用的。 + +#define OV7725_DATA_PIN P00_0 //定义D0数据引脚 假设D0定义为P00_0 那么D1所使用的引脚则为P00_1,依次类推 + //可设置参数P00_0、P02_0、P15_0,不能设置为其他参数 + +#define OV7725_PCLK_PIN ERU_CH2_REQ14_P02_1 //定义像素时钟引脚 可选范围参考ERU_PIN_enum枚举 不可与场中断引脚选择为同一个通道,或者是共用中断的通道 + //例如场中断选择ERU_CH3 那么像素引脚就不能选择ERU_CH7,因为3和7的中断是共用的。 + +#define OV7725_DMA_CH IfxDma_ChannelId_5 //定义使用的DMA通道 0-47可选 通道号越大优先级越低 + //修改此处之后,需要修改对应的ERU中断优先级,例如此处设置为IfxDma_ChannelId_5则对应的ERU中断优先级应该设置为5 + + + +extern uint8 image_bin[OV7725_H][OV7725_W/8]; //定义存储接收图像的数组 +extern uint8 image_dec[OV7725_H][OV7725_W]; //图像解压后的数组 + +extern uint8 ov7725_finish_flag; //图像采集完成标志位 + + +//函数声明 +uint8 ov7725_init(void); +void ov7725_vsync(void); +void ov7725_dma(void); +void image_decompression(uint8 *data1,uint8 *data2); +void seekfree_sendimg_7725(UARTN_enum uartn); + + + +#endif + + + diff --git a/Example/12-Dual_Core_Demo/Libraries/seekfree_peripheral/SEEKFREE_ICM20602.c b/Example/12-Dual_Core_Demo/Libraries/seekfree_peripheral/SEEKFREE_ICM20602.c index 095f9e3..5d167c9 100644 --- a/Example/12-Dual_Core_Demo/Libraries/seekfree_peripheral/SEEKFREE_ICM20602.c +++ b/Example/12-Dual_Core_Demo/Libraries/seekfree_peripheral/SEEKFREE_ICM20602.c @@ -68,6 +68,7 @@ void icm20602_self1_check(void) //------------------------------------------------------------------------------------------------------------------- void icm20602_init(void) { + simiic_init(); systick_delay_ms(STM0, 10); //上电延时 //检测 diff --git a/Example/12-Dual_Core_Demo/Libraries/seekfree_peripheral/SEEKFREE_IIC.c b/Example/12-Dual_Core_Demo/Libraries/seekfree_peripheral/SEEKFREE_IIC.c index 196fd57..f56a41a 100644 --- a/Example/12-Dual_Core_Demo/Libraries/seekfree_peripheral/SEEKFREE_IIC.c +++ b/Example/12-Dual_Core_Demo/Libraries/seekfree_peripheral/SEEKFREE_IIC.c @@ -50,7 +50,7 @@ uint8 IIC_num; // -static uint16 simiic_delay_time=100; //ICM等传感器应设置为100 +static uint16 simiic_delay_time = SIMIIC_DELAY_TIME; //ICM等传感器应设置为20 //------------------------------------------------------------------------------------------------------------------- diff --git a/Example/12-Dual_Core_Demo/Libraries/seekfree_peripheral/SEEKFREE_IIC.h b/Example/12-Dual_Core_Demo/Libraries/seekfree_peripheral/SEEKFREE_IIC.h index 293a02a..6a9c1e3 100644 --- a/Example/12-Dual_Core_Demo/Libraries/seekfree_peripheral/SEEKFREE_IIC.h +++ b/Example/12-Dual_Core_Demo/Libraries/seekfree_peripheral/SEEKFREE_IIC.h @@ -34,8 +34,12 @@ -#define SEEKFREE_SCL P13_0 //定义SCL引脚 可任意更改为其他IO -#define SEEKFREE_SDA P13_1 //定义SDA引脚 可任意更改为其他IO +#define SEEKFREE_SCL P02_3 //定义SCL引脚 可任意更改为其他IO +#define SEEKFREE_SDA P02_2 //定义SDA引脚 可任意更改为其他IO + + +#define SIMIIC_DELAY_TIME 20 + typedef enum IIC //DAC模块 { diff --git a/Example/12-Dual_Core_Demo/Libraries/seekfree_peripheral/SEEKFREE_L3G4200D.c b/Example/12-Dual_Core_Demo/Libraries/seekfree_peripheral/SEEKFREE_L3G4200D.c index 0f0c23a..5deb7d3 100644 --- a/Example/12-Dual_Core_Demo/Libraries/seekfree_peripheral/SEEKFREE_L3G4200D.c +++ b/Example/12-Dual_Core_Demo/Libraries/seekfree_peripheral/SEEKFREE_L3G4200D.c @@ -65,6 +65,7 @@ void l3g4200d_self_check(void) //------------------------------------------------------------------------------------------------------------------- void l3g4200d_init(void) { + simiic_init(); systick_delay_ms(STM0, 50); l3g4200d_self_check(); diff --git a/Example/12-Dual_Core_Demo/Libraries/seekfree_peripheral/SEEKFREE_MMA8451.c b/Example/12-Dual_Core_Demo/Libraries/seekfree_peripheral/SEEKFREE_MMA8451.c index c200427..8a5eec4 100644 --- a/Example/12-Dual_Core_Demo/Libraries/seekfree_peripheral/SEEKFREE_MMA8451.c +++ b/Example/12-Dual_Core_Demo/Libraries/seekfree_peripheral/SEEKFREE_MMA8451.c @@ -68,6 +68,7 @@ void mma8451_self_check(void) //------------------------------------------------------------------------------------------------------------------- uint8 mma845x_init(void) { + simiic_init(); systick_delay_ms(STM0, 50); mma8451_self_check(); diff --git a/Example/12-Dual_Core_Demo/Libraries/seekfree_peripheral/SEEKFREE_MPU6050.c b/Example/12-Dual_Core_Demo/Libraries/seekfree_peripheral/SEEKFREE_MPU6050.c index 0317aa0..686550d 100644 --- a/Example/12-Dual_Core_Demo/Libraries/seekfree_peripheral/SEEKFREE_MPU6050.c +++ b/Example/12-Dual_Core_Demo/Libraries/seekfree_peripheral/SEEKFREE_MPU6050.c @@ -71,6 +71,7 @@ void mpu6050_self1_check(void) //------------------------------------------------------------------------------------------------------------------- void mpu6050_init(void) { + simiic_init(); systick_delay_ms(STM0, 100); //上电延时 mpu6050_self1_check(); diff --git a/Example/12-Dual_Core_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.c b/Example/12-Dual_Core_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.c index 014b435..05f181f 100644 --- a/Example/12-Dual_Core_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.c +++ b/Example/12-Dual_Core_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.c @@ -38,7 +38,6 @@ #include "zf_gpio.h" #include "zf_eru.h" #include "zf_eru_dma.h" -#include "stdio.h" #include "SEEKFREE_MT9V03X.h" @@ -49,6 +48,8 @@ uint8 receive[3]; uint8 receive_num = 0; vuint8 uart_receive_flag; +uint8 link_list_num; + //需要配置到摄像头的数据 int16 MT9V03X_CFG[CONFIG_FINISH][2]= { @@ -305,7 +306,7 @@ void mt9v03x_init(void) gpio_init((PIN_enum)(MT9V03X_DATA_PIN+i), GPI, 0, PULLUP); } - eru_dma_init(MT9V03X_DMA_CH, GET_PORT_IN_ADDR(MT9V03X_DATA_PIN), mt9v03x_image[0], MT9V03X_PCLK_PIN, RISING, MT9V03X_W); + link_list_num = eru_dma_init(MT9V03X_DMA_CH, GET_PORT_IN_ADDR(MT9V03X_DATA_PIN), mt9v03x_image[0], MT9V03X_PCLK_PIN, RISING, MT9V03X_W*MT9V03X_H); eru_init(MT9V03X_VSYNC_PIN, FALLING); //初始化场中断,并设置为下降沿触发中断 restoreInterrupts(interrupt_state); @@ -313,7 +314,6 @@ void mt9v03x_init(void) uint8 mt9v03x_finish_flag = 0; //一场图像采集完成标志位 -uint8 now_col; //当前正在采集的行 //------------------------------------------------------------------------------------------------------------------- // @brief MT9V03X摄像头场中断 // @param NULL @@ -324,16 +324,15 @@ uint8 now_col; // void mt9v03x_vsync(void) { CLEAR_GPIO_FLAG(MT9V03X_VSYNC_PIN); - now_col = 0; + if(!mt9v03x_finish_flag)//查看图像数组是否使用完毕,如果未使用完毕则不开始采集,避免出现访问冲突 { - DMA_SET_DESTINATION(MT9V03X_DMA_CH, (void *)&mt9v03x_image[0]); dma_start(MT9V03X_DMA_CH); } } - +uint8 mt9v03x_dma_int_num; //当前DMA中断次数 //------------------------------------------------------------------------------------------------------------------- // @brief MT9V03X摄像头DMA完成中断 // @param NULL @@ -344,16 +343,15 @@ void mt9v03x_vsync(void) void mt9v03x_dma(void) { CLEAR_DMA_FLAG(MT9V03X_DMA_CH); + mt9v03x_dma_int_num++; - now_col++; - - if(MT9V03X_H > now_col) - { - dma_start(MT9V03X_DMA_CH); - } - else + if(mt9v03x_dma_int_num >= link_list_num) { + //采集完成 + mt9v03x_dma_int_num = 0; mt9v03x_finish_flag = 1;//一副图像从采集开始到采集结束耗时3.8MS左右(50FPS、188*120分辨率) + dma_stop(MT9V03X_DMA_CH); + } } diff --git a/Example/12-Dual_Core_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.h b/Example/12-Dual_Core_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.h index a29edd2..0c8a785 100644 --- a/Example/12-Dual_Core_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.h +++ b/Example/12-Dual_Core_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.h @@ -63,9 +63,7 @@ //例如场中断选择ERU_CH3 那么像素引脚就不能选择ERU_CH7,因为3和7的中断是共用的。 #define MT9V03X_DMA_CH IfxDma_ChannelId_5 //定义使用的DMA通道 0-47可选 通道号越大优先级越低 - //修改此处之后,需要修改对应的ERU中断优先级,例如此处设置为IfxDma_ChannelId_5则对应的ERU中断优先级应该设置为5 - - + //摄像头命令枚举 typedef enum { diff --git a/Example/12-Dual_Core_Demo/USER/isr.c b/Example/12-Dual_Core_Demo/USER/isr.c index 15666f2..c6376b0 100644 --- a/Example/12-Dual_Core_Demo/USER/isr.c +++ b/Example/12-Dual_Core_Demo/USER/isr.c @@ -98,7 +98,8 @@ IFX_INTERRUPT(eru_ch3_ch7_isr, ERU_CH3_CH7_INT_SERVICE, ERU_CH3_CH7_INT_PRIO) if(GET_GPIO_FLAG(ERU_CH3_REQ6_P02_0))//通道3中断 { CLEAR_GPIO_FLAG(ERU_CH3_REQ6_P02_0); - if(1 == camera_type)mt9v03x_vsync(); + if (1 == camera_type) mt9v03x_vsync(); + else if (3 == camera_type) ov7725_vsync(); } if(GET_GPIO_FLAG(ERU_CH7_REQ16_P15_1))//通道7中断 @@ -113,7 +114,8 @@ IFX_INTERRUPT(eru_ch3_ch7_isr, ERU_CH3_CH7_INT_SERVICE, ERU_CH3_CH7_INT_PRIO) IFX_INTERRUPT(dma_ch5_isr, ERU_DMA_INT_SERVICE, ERU_DMA_INT_PRIO) { - if(1 == camera_type) mt9v03x_dma(); + if (1 == camera_type) mt9v03x_dma(); + else if (3 == camera_type) ov7725_dma(); } diff --git a/Example/2-LED_Blink_Demo/Libraries/doc/version.txt b/Example/2-LED_Blink_Demo/Libraries/doc/version.txt index b85cd50..a42bc58 100644 --- a/Example/2-LED_Blink_Demo/Libraries/doc/version.txt +++ b/Example/2-LED_Blink_Demo/Libraries/doc/version.txt @@ -1,9 +1,17 @@ V1.0.0 - 初始版本 + 初始版本 V1.0.1 对总钻风摄像头的场中断进行修改,判断标志位为0才采集下一幅图像,避免出现访问冲突 修改SPI初始化中的错误,引用了固定的SPI2基地址 修复STM中无法使用STM1的问题 - 修复gtm pwm中最大占空比只有GTM_ATOM0_PWM_DUTY_MAX设置有效的问题 \ No newline at end of file + 修复gtm pwm中最大占空比只有GTM_ATOM0_PWM_DUTY_MAX设置有效的问题 + +V1.0.2 + 修改模拟IIC默认延时时间为20 + 添加 需要特别注意P20_2是不能用于输出的,仅仅只有输入的功能 注意事项 + 将摄像头采集DMA改为link传输,可以大大降低DMA中断次数 + 修改默认的软件IIC引脚定义 + 将6050等 需要用到软件IIC的模块,在初始化函数中默认调用模拟IIC初始化 + 添加小钻风驱动程序 \ No newline at end of file diff --git a/Example/2-LED_Blink_Demo/Libraries/seekfree_libraries/common/common.c b/Example/2-LED_Blink_Demo/Libraries/seekfree_libraries/common/common.c index 0460d15..ac42b19 100644 --- a/Example/2-LED_Blink_Demo/Libraries/seekfree_libraries/common/common.c +++ b/Example/2-LED_Blink_Demo/Libraries/seekfree_libraries/common/common.c @@ -22,7 +22,7 @@ #include "SysSe/Bsp/Bsp.h" #include "common.h" -uint8 camera_type; +uint8 camera_type; //摄像头型号 1:总钻风 2:凌瞳(暂未支持)3:小钻风 diff --git a/Example/2-LED_Blink_Demo/Libraries/seekfree_libraries/common/common.h b/Example/2-LED_Blink_Demo/Libraries/seekfree_libraries/common/common.h index fe7ec63..13d03cd 100644 --- a/Example/2-LED_Blink_Demo/Libraries/seekfree_libraries/common/common.h +++ b/Example/2-LED_Blink_Demo/Libraries/seekfree_libraries/common/common.h @@ -111,7 +111,7 @@ typedef enum //枚 #include -extern uint8 camera_type; +extern uint8 camera_type; //摄像头型号 1:总钻风 2:凌瞳(暂未支持)3:小钻风 void get_clk(void); diff --git a/Example/2-LED_Blink_Demo/Libraries/seekfree_libraries/headfile.h b/Example/2-LED_Blink_Demo/Libraries/seekfree_libraries/headfile.h index 0e8024f..e11bd83 100644 --- a/Example/2-LED_Blink_Demo/Libraries/seekfree_libraries/headfile.h +++ b/Example/2-LED_Blink_Demo/Libraries/seekfree_libraries/headfile.h @@ -62,6 +62,7 @@ #include "SEEKFREE_L3G4200D.h" #include "SEEKFREE_WIRELESS.h" #include "SEEKFREE_IPS200_PARALLEL8.h" +#include "SEEKFREE_7725.h" #endif diff --git a/Example/2-LED_Blink_Demo/Libraries/seekfree_libraries/zf_eru_dma.c b/Example/2-LED_Blink_Demo/Libraries/seekfree_libraries/zf_eru_dma.c index f7aab10..86c0158 100644 --- a/Example/2-LED_Blink_Demo/Libraries/seekfree_libraries/zf_eru_dma.c +++ b/Example/2-LED_Blink_Demo/Libraries/seekfree_libraries/zf_eru_dma.c @@ -21,9 +21,18 @@ #include "IfxDma_Dma.h" #include "IfxScuEru.h" #include "isr_config.h" +#include "zf_assert.h" #include "zf_eru_dma.h" +typedef struct +{ + Ifx_DMA_CH IFX_ALIGN(256) linked_list[8];//DMA链表 + IfxDma_Dma_Channel channel; //DMA通道句柄 +}DMA_LINK; + + +DMA_LINK dma_link_list; //------------------------------------------------------------------------------------------------------------------- // @brief eru触发dma初始化 @@ -36,7 +45,7 @@ // @return void // Sample usage: //------------------------------------------------------------------------------------------------------------------- -void eru_dma_init(IfxDma_ChannelId dma_ch, uint8 *source_addr, uint8 *destination_addr, ERU_PIN_enum eru_pin, TRIGGER_enum trigger, uint16 dma_count) +uint8 eru_dma_init(IfxDma_ChannelId dma_ch, uint8 *source_addr, uint8 *destination_addr, ERU_PIN_enum eru_pin, TRIGGER_enum trigger, uint16 dma_count) { IfxDma_Dma_Channel dmaChn; //eru触发DMA通道号 在eru文件中设置eru的优先级,即为触发的通道 @@ -51,27 +60,85 @@ void eru_dma_init(IfxDma_ChannelId dma_ch, uint8 *source_addr, uint8 *destinatio IfxDma_Dma_ChannelConfig cfg; IfxDma_Dma_initChannelConfig(&cfg, &dma); - cfg.transferCount = dma_count; + uint8 list_num, i; + uint16 single_channel_dma_count; + + ZF_ASSERT(!(dma_count%8));//传输次数必须为8的倍数 + + + list_num = 1; + single_channel_dma_count = dma_count / list_num; + if(16384 < single_channel_dma_count) + { + while(TRUE) + { + single_channel_dma_count = dma_count / list_num; + if((single_channel_dma_count <= 16384) && !(dma_count % list_num)) + { + break; + } + list_num++; + if(list_num > 8) ZF_ASSERT(FALSE); + } + } + + + if(1 == list_num) + { + cfg.shadowControl = IfxDma_ChannelShadow_none; + cfg.operationMode = IfxDma_ChannelOperationMode_single; + cfg.shadowAddress = 0; + } + else + { + cfg.shadowControl = IfxDma_ChannelShadow_linkedList; + cfg.operationMode = IfxDma_ChannelOperationMode_continuous; + cfg.shadowAddress = IFXCPU_GLB_ADDR_DSPR(IfxCpu_getCoreId(), (unsigned)&dma_link_list.linked_list[1]); + } + cfg.requestMode = IfxDma_ChannelRequestMode_oneTransferPerRequest; cfg.moveSize = IfxDma_ChannelMoveSize_8bit; + cfg.busPriority = IfxDma_ChannelBusPriority_high; - cfg.busPriority = IfxDma_ChannelBusPriority_high; - - cfg.sourceAddress = (unsigned)(source_addr); + cfg.sourceAddress = IFXCPU_GLB_ADDR_DSPR(IfxCpu_getCoreId(), source_addr); cfg.sourceAddressCircularRange = IfxDma_ChannelIncrementCircular_none; cfg.sourceCircularBufferEnabled = TRUE; - cfg.destinationAddress = IFXCPU_GLB_ADDR_DSPR(IfxCpu_getCoreId(), destination_addr); cfg.destinationAddressIncrementStep = IfxDma_ChannelIncrementStep_1; - cfg.operationMode = IfxDma_ChannelOperationMode_single; - cfg.channelId = (IfxDma_ChannelId)dma_ch; - cfg.hardwareRequestEnabled = TRUE; - cfg.channelInterruptEnabled = TRUE; + cfg.channelId = (IfxDma_ChannelId)dma_ch; + cfg.hardwareRequestEnabled = FALSE; + cfg.channelInterruptEnabled = TRUE; cfg.channelInterruptPriority = ERU_DMA_INT_PRIO; cfg.channelInterruptTypeOfService = (IfxSrc_Tos)ERU_DMA_INT_SERVICE; + + + cfg.destinationAddress = IFXCPU_GLB_ADDR_DSPR(IfxCpu_getCoreId(), destination_addr); + + cfg.transferCount = single_channel_dma_count; + IfxDma_Dma_initChannel(&dmaChn, &cfg); + + if(1 < list_num) + { + i = 0; + while(i < list_num) + { + cfg.destinationAddress = IFXCPU_GLB_ADDR_DSPR(IfxCpu_getCoreId(), destination_addr + single_channel_dma_count * i); + if(i == (list_num - 1)) cfg.shadowAddress = IFXCPU_GLB_ADDR_DSPR(IfxCpu_getCoreId(), (unsigned)&dma_link_list.linked_list[0]); + else cfg.shadowAddress = IFXCPU_GLB_ADDR_DSPR(IfxCpu_getCoreId(), (unsigned)&dma_link_list.linked_list[i+1]); + cfg.transferCount = single_channel_dma_count; + + IfxDma_Dma_initLinkedListEntry((void *)&dma_link_list.linked_list[i], &cfg); + i++; + } + } + + + IfxDma_Dma_getSrcPointer(&dma_link_list.channel)->B.CLRR = 1; + + return list_num; } diff --git a/Example/2-LED_Blink_Demo/Libraries/seekfree_libraries/zf_eru_dma.h b/Example/2-LED_Blink_Demo/Libraries/seekfree_libraries/zf_eru_dma.h index 50667ad..faef169 100644 --- a/Example/2-LED_Blink_Demo/Libraries/seekfree_libraries/zf_eru_dma.h +++ b/Example/2-LED_Blink_Demo/Libraries/seekfree_libraries/zf_eru_dma.h @@ -29,9 +29,9 @@ #define CLEAR_DMA_FLAG(dma_ch) IfxDma_clearChannelInterrupt(&MODULE_DMA, dma_ch); -#define DMA_SET_DESTINATION(dma_ch, destination_addr) IfxDma_setChannelDestinationAddress(&MODULE_DMA, dma_ch, (void *)destination_addr) +#define DMA_SET_DESTINATION(dma_ch, destination_addr) IfxDma_setChannelDestinationAddress(&MODULE_DMA, dma_ch, (void *)IFXCPU_GLB_ADDR_DSPR(IfxCpu_getCoreId(), destination_addr)) -void eru_dma_init(IfxDma_ChannelId dma_ch, uint8 *source_addr, uint8 *destination_addr, ERU_PIN_enum eru_pin, TRIGGER_enum trigger, uint16 dma_count); +uint8 eru_dma_init(IfxDma_ChannelId dma_ch, uint8 *source_addr, uint8 *destination_addr, ERU_PIN_enum eru_pin, TRIGGER_enum trigger, uint16 dma_count); void dma_stop(IfxDma_ChannelId dma_ch); void dma_start(IfxDma_ChannelId dma_ch); diff --git a/Example/2-LED_Blink_Demo/Libraries/seekfree_libraries/zf_gpio.c b/Example/2-LED_Blink_Demo/Libraries/seekfree_libraries/zf_gpio.c index 3c937cf..1d2466c 100644 --- a/Example/2-LED_Blink_Demo/Libraries/seekfree_libraries/zf_gpio.c +++ b/Example/2-LED_Blink_Demo/Libraries/seekfree_libraries/zf_gpio.c @@ -60,6 +60,7 @@ Ifx_P* get_port(PIN_enum pin) // @param pinmode 引脚配置(可设置参数由zf_gpio.h文件内GPIOMODE_enum枚举值确定) // @return void // Sample usage: gpio_init(P00_0, GPO, 1, PUSHPULL);//P00_0初始化为GPIO功能、输出模式、输出高电平、推挽输出 +// @note 需要特别注意P20_2是不能用于输出的,仅仅只有输入的功能 //------------------------------------------------------------------------------------------------------------------- void gpio_init(PIN_enum pin, GPIODIR_enum dir, uint8 dat, GPIOMODE_enum pinmode) { diff --git a/Example/2-LED_Blink_Demo/Libraries/seekfree_libraries/zf_gpio.h b/Example/2-LED_Blink_Demo/Libraries/seekfree_libraries/zf_gpio.h index cfbd666..e3d144f 100644 --- a/Example/2-LED_Blink_Demo/Libraries/seekfree_libraries/zf_gpio.h +++ b/Example/2-LED_Blink_Demo/Libraries/seekfree_libraries/zf_gpio.h @@ -38,6 +38,15 @@ typedef enum // 枚 #define GET_PORT_IN_ADDR(pin) (uint8 *)(&IfxPort_getAddress((IfxPort_Index)(pin/32))->IN + pin%32/8) + + +//需要特别注意P20_2是不能用于输出的,仅仅只有输入的功能 +//需要特别注意P20_2是不能用于输出的,仅仅只有输入的功能 +//需要特别注意P20_2是不能用于输出的,仅仅只有输入的功能 + + + + //------------------------------------------------------ //通用GPIO操作 void gpio_init(PIN_enum pin, GPIODIR_enum dir, uint8 dat, GPIOMODE_enum pinconf); diff --git a/Example/2-LED_Blink_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.c b/Example/2-LED_Blink_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.c new file mode 100644 index 0000000..806b8d9 --- /dev/null +++ b/Example/2-LED_Blink_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.c @@ -0,0 +1,262 @@ +/********************************************************************************************************************* + * COPYRIGHT NOTICE + * Copyright (c) 2020,逐飞科技 + * All rights reserved. + * 技术讨论QQ群:三群:824575535 + * + * 以下所有内容版权均属逐飞科技所有,未经允许不得用于商业用途, + * 欢迎各位使用并传播本程序,修改内容时必须保留逐飞科技的版权声明。 + * + * @file main + * @company 成都逐飞科技有限公司 + * @author 逐飞科技(QQ3184284598) + * @version 查看doc内version文件 版本说明 + * @Software tasking v6.3r1 + * @Target core TC264D + * @Taobao https://seekfree.taobao.com/ + * @date 2020-3-23 + * @note + 接线定义: + ------------------------------------ + 模块管脚 单片机管脚 + SDA 查看SEEKFREE_IIC文件内的SEEKFREE_SDA宏定义 + SCL 查看SEEKFREE_IIC文件内的SEEKFREE_SCL宏定义 + 场中断(VSY) 查看SEEKFREE_OV7725.h文件中的OV7725_VSYNC_PIN宏定义 + 行中断(HREF) 未使用,因此不接 + 像素中断(PCLK) 查看SEEKFREE_OV7725.h文件中的OV7725_PCLK_PIN宏定义 + 数据口(D0-D7) 查看SEEKFREE_OV7725.h文件中的OV7725_DATA_PIN宏定义 + ------------------------------------ + + 默认分辨率是 160*120 + 默认FPS 50帧 + ********************************************************************************************************************/ + + +#include "IfxDma.h" +#include "IfxScuEru.h" +#include "zf_stm_systick.h" +#include "zf_gpio.h" +#include "zf_eru.h" +#include "zf_eru_dma.h" +#include "SEEKFREE_IIC.h" +#include "SEEKFREE_7725.h" + + + +IFX_ALIGN(4) uint8 image_bin[OV7725_H][OV7725_W/8]; //定义存储接收图像的数组 +uint8 image_dec[OV7725_H][OV7725_W]; + +uint8 ov7725_idcode = 0; + +//------------------------------------------------------------------------------------------------------------------- +// @brief 小钻风摄像头内部寄存器初始化(内部使用,用户无需调用) +// @param NULL +// @return uint8 返回0则出错,返回1则成功 +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +uint8 ov7725_reg_init(void) +{ + simiic_delay_set(500); + simiic_write_reg ( OV7725_DEV_ADD, OV7725_COM7, 0x80 ); //复位摄像头 + systick_delay_ms(STM0, 50); + ov7725_idcode = simiic_read_reg( OV7725_DEV_ADD, OV7725_VER ,SCCB); + if( ov7725_idcode != OV7725_ID ) return 0; //校验摄像头ID号 + + //ID号确认无误 然后配置寄存器 + simiic_write_reg(OV7725_DEV_ADD, OV7725_COM4 , 0xC1); + simiic_write_reg(OV7725_DEV_ADD, OV7725_CLKRC , 0x01); + simiic_write_reg(OV7725_DEV_ADD, OV7725_COM2 , 0x03); + simiic_write_reg(OV7725_DEV_ADD, OV7725_COM3 , 0xD0); + simiic_write_reg(OV7725_DEV_ADD, OV7725_COM7 , 0x40); + simiic_write_reg(OV7725_DEV_ADD, OV7725_COM8 , 0xCE); //0xCE:关闭自动曝光 0xCF:开启自动曝光 + simiic_write_reg(OV7725_DEV_ADD, OV7725_HSTART , 0x3F); + simiic_write_reg(OV7725_DEV_ADD, OV7725_HSIZE , 0x50); + simiic_write_reg(OV7725_DEV_ADD, OV7725_VSTRT , 0x03); + simiic_write_reg(OV7725_DEV_ADD, OV7725_VSIZE , 0x78); + simiic_write_reg(OV7725_DEV_ADD, OV7725_HREF , 0x00); + simiic_write_reg(OV7725_DEV_ADD, OV7725_SCAL0 , 0x0A); + simiic_write_reg(OV7725_DEV_ADD, OV7725_AWB_Ctrl0 , 0xE0); + simiic_write_reg(OV7725_DEV_ADD, OV7725_DSPAuto , 0xff); + simiic_write_reg(OV7725_DEV_ADD, OV7725_DSP_Ctrl2 , 0x0C); + simiic_write_reg(OV7725_DEV_ADD, OV7725_DSP_Ctrl3 , 0x00); + simiic_write_reg(OV7725_DEV_ADD, OV7725_DSP_Ctrl4 , 0x00); + + if(OV7725_W == 80) simiic_write_reg(OV7725_DEV_ADD, OV7725_HOutSize , 0x14); + else if(OV7725_W == 160) simiic_write_reg(OV7725_DEV_ADD, OV7725_HOutSize , 0x28); + else if(OV7725_W == 240) simiic_write_reg(OV7725_DEV_ADD, OV7725_HOutSize , 0x3c); + else if(OV7725_W == 320) simiic_write_reg(OV7725_DEV_ADD, OV7725_HOutSize , 0x50); + + if(OV7725_H == 60) simiic_write_reg(OV7725_DEV_ADD, OV7725_VOutSize , 0x1E); + else if(OV7725_H == 120) simiic_write_reg(OV7725_DEV_ADD, OV7725_VOutSize , 0x3c); + else if(OV7725_H == 180) simiic_write_reg(OV7725_DEV_ADD, OV7725_VOutSize , 0x5a); + else if(OV7725_H == 240) simiic_write_reg(OV7725_DEV_ADD, OV7725_VOutSize , 0x78); + + simiic_write_reg(OV7725_DEV_ADD, OV7725_REG28 , 0x01); + simiic_write_reg(OV7725_DEV_ADD, OV7725_EXHCH , 0x10); + simiic_write_reg(OV7725_DEV_ADD, OV7725_EXHCL , 0x1F); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM1 , 0x0c); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM2 , 0x16); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM3 , 0x2a); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM4 , 0x4e); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM5 , 0x61); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM6 , 0x6f); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM7 , 0x7b); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM8 , 0x86); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM9 , 0x8e); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM10 , 0x97); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM11 , 0xa4); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM12 , 0xaf); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM13 , 0xc5); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM14 , 0xd7); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM15 , 0xe8); + simiic_write_reg(OV7725_DEV_ADD, OV7725_SLOP , 0x20); + simiic_write_reg(OV7725_DEV_ADD, OV7725_LC_RADI , 0x00); + simiic_write_reg(OV7725_DEV_ADD, OV7725_LC_COEF , 0x13); + simiic_write_reg(OV7725_DEV_ADD, OV7725_LC_XC , 0x08); + simiic_write_reg(OV7725_DEV_ADD, OV7725_LC_COEFB , 0x14); + simiic_write_reg(OV7725_DEV_ADD, OV7725_LC_COEFR , 0x17); + simiic_write_reg(OV7725_DEV_ADD, OV7725_LC_CTR , 0x05); + simiic_write_reg(OV7725_DEV_ADD, OV7725_BDBase , 0x99); + simiic_write_reg(OV7725_DEV_ADD, OV7725_BDMStep , 0x03); + simiic_write_reg(OV7725_DEV_ADD, OV7725_SDE , 0x04); + simiic_write_reg(OV7725_DEV_ADD, OV7725_BRIGHT , 0x00); + simiic_write_reg(OV7725_DEV_ADD, OV7725_CNST , 0x40); + simiic_write_reg(OV7725_DEV_ADD, OV7725_SIGN , 0x06); + simiic_write_reg(OV7725_DEV_ADD, OV7725_UVADJ0 , 0x11); + simiic_write_reg(OV7725_DEV_ADD, OV7725_UVADJ1 , 0x02); + + + simiic_delay_set(SIMIIC_DELAY_TIME);//修改为默认的20 + return 1; + + +} + + + + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 小钻风摄像头采集程序初始化(内部使用,用户无需调用) +// @param NULL +// @return void +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +void ov7725_port_init(void) +{ + uint8 i; + camera_type = 3;//设置连接摄像头类型 + + //摄像头采集初始化 + //初始化 数据引脚 + for(i=0; i<8; i++) + { + gpio_init((PIN_enum)(OV7725_DATA_PIN+i), GPI, 0, PULLUP); + } + eru_dma_init(OV7725_DMA_CH, GET_PORT_IN_ADDR(OV7725_DATA_PIN), image_bin[0], OV7725_PCLK_PIN, FALLING, OV7725_DMA_NUM); + eru_init(OV7725_VSYNC_PIN, FALLING); //初始化场中断,并设置为下降沿触发中断 + +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 小钻风摄像头初始化(调用之后设置好相关中断函数即可采集图像) +// @param NULL +// @return 0 +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +uint8 ov7725_init(void) +{ + simiic_init(); + ov7725_reg_init(); //摄像头寄存器配置 + ov7725_port_init(); //摄像头中断引脚及DMA配置 + return 0; +} + + + + +uint8 ov7725_finish_flag = 0; +//------------------------------------------------------------------------------------------------------------------- +// @brief 小钻风摄像头场中断 +// @param NULL +// @return void +// @since v1.0 +// Sample usage: 此函数在isr.c中被eru(GPIO中断)中断调用 +//------------------------------------------------------------------------------------------------------------------- +void ov7725_vsync(void) +{ + CLEAR_GPIO_FLAG(OV7725_VSYNC_PIN); + + if(!ov7725_finish_flag)//查看图像数组是否使用完毕,如果未使用完毕则不开始采集,避免出现访问冲突 + { + DMA_SET_DESTINATION(OV7725_DMA_CH, image_bin[0]); + dma_start(OV7725_DMA_CH); + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 小钻风摄像头DMA完成中断 +// @param NULL +// @return void +// @since v1.0 +// Sample usage: 此函数在isr.c中被dma中断调用 +//------------------------------------------------------------------------------------------------------------------- +void ov7725_dma(void) +{ + CLEAR_DMA_FLAG(OV7725_DMA_CH); + ov7725_finish_flag = 1; + dma_stop(OV7725_DMA_CH); +} + + + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 小钻风摄像头数据解压函数 +// @param *data1 源地址 +// @param *data2 目的地址 +// @return void +// @since v1.0 +// Sample usage: Image_Decompression(da1,dat2[0]);//将一维数组dat1的内容解压到二维数组dat2里. +//------------------------------------------------------------------------------------------------------------------- +void image_decompression(uint8 *data1,uint8 *data2) +{ + uint8 temp[2] = {0,255}; + uint16 lenth = OV7725_SIZE; + uint8 i = 8; + + + while(lenth--) + { + i = 8; + while(i--) + { + *data2++ = temp[(*data1 >> i) & 0x01]; + } + data1++; + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 小钻风摄像头未解压图像发送至上位机查看图像 +// @param *imgaddr 压缩图像数据地址 +// @param *imgsize 图像大小(直接填写OV7725_SIZE) +// @return void +// @since v1.0 +// Sample usage: 调用该函数前请先初始化uart2 +//------------------------------------------------------------------------------------------------------------------- +void seekfree_sendimg_7725(UARTN_enum uartn) +{ + uart_putchar(uartn, 0x00);uart_putchar(uartn, 0xff);uart_putchar(uartn, 0x01);uart_putchar(uartn, 0x01);//发送四个字节命令 + uart_putbuff(uartn, image_bin[0], OV7725_SIZE); //再发送图像 +} + + + + diff --git a/Example/2-LED_Blink_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.h b/Example/2-LED_Blink_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.h new file mode 100644 index 0000000..e513250 --- /dev/null +++ b/Example/2-LED_Blink_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.h @@ -0,0 +1,243 @@ +/********************************************************************************************************************* + * COPYRIGHT NOTICE + * Copyright (c) 2020,逐飞科技 + * All rights reserved. + * 技术讨论QQ群:三群:824575535 + * + * 以下所有内容版权均属逐飞科技所有,未经允许不得用于商业用途, + * 欢迎各位使用并传播本程序,修改内容时必须保留逐飞科技的版权声明。 + * + * @file main + * @company 成都逐飞科技有限公司 + * @author 逐飞科技(QQ3184284598) + * @version 查看doc内version文件 版本说明 + * @Software tasking v6.3r1 + * @Target core TC264D + * @Taobao https://seekfree.taobao.com/ + * @date 2020-3-23 + * @note + 接线定义: + ------------------------------------ + 模块管脚 单片机管脚 + SDA 查看SEEKFREE_IIC文件内的SEEKFREE_SDA宏定义 + SCL 查看SEEKFREE_IIC文件内的SEEKFREE_SCL宏定义 + 场中断(VSY) 查看SEEKFREE_OV7725.h文件中的OV7725_VSYNC_PIN宏定义 + 行中断(HREF) 未使用,因此不接 + 像素中断(PCLK) 查看SEEKFREE_OV7725.h文件中的OV7725_PCLK_PIN宏定义 + 数据口(D0-D7) 查看SEEKFREE_OV7725.h文件中的OV7725_DATA_PIN宏定义 + ------------------------------------ + + 默认分辨率是 160*120 + 默认FPS 50帧 + ********************************************************************************************************************/ + + + +#ifndef _SEEKFREE_7725_h +#define _SEEKFREE_7725_h + +#include "common.h" +#include "IfxDma_cfg.h" +#include "zf_uart.h" + + +//摄像头ID号 +#define OV7725_ID 0x21 + +//摄像头寄存器 +#define OV7725_GAIN 0x00 +#define OV7725_BLUE 0x01 +#define OV7725_RED 0x02 +#define OV7725_GREEN 0x03 +#define OV7725_BAVG 0x05 +#define OV7725_GAVG 0x06 +#define OV7725_RAVG 0x07 +#define OV7725_AECH 0x08 +#define OV7725_COM2 0x09 +#define OV7725_PID 0x0A +#define OV7725_VER 0x0B +#define OV7725_COM3 0x0C +#define OV7725_COM4 0x0D +#define OV7725_COM5 0x0E +#define OV7725_COM6 0x0F +#define OV7725_AEC 0x10 +#define OV7725_CLKRC 0x11 +#define OV7725_COM7 0x12 +#define OV7725_COM8 0x13 +#define OV7725_COM9 0x14 +#define OV7725_COM10 0x15 +#define OV7725_REG16 0x16 +#define OV7725_HSTART 0x17 +#define OV7725_HSIZE 0x18 +#define OV7725_VSTRT 0x19 +#define OV7725_VSIZE 0x1A +#define OV7725_PSHFT 0x1B +#define OV7725_MIDH 0x1C +#define OV7725_MIDL 0x1D +#define OV7725_LAEC 0x1F +#define OV7725_COM11 0x20 +#define OV7725_BDBase 0x22 +#define OV7725_BDMStep 0x23 +#define OV7725_AEW 0x24 +#define OV7725_AEB 0x25 +#define OV7725_VPT 0x26 +#define OV7725_REG28 0x28 +#define OV7725_HOutSize 0x29 +#define OV7725_EXHCH 0x2A +#define OV7725_EXHCL 0x2B +#define OV7725_VOutSize 0x2C +#define OV7725_ADVFL 0x2D +#define OV7725_ADVFH 0x2E +#define OV7725_YAVE 0x2F +#define OV7725_LumHTh 0x30 +#define OV7725_LumLTh 0x31 +#define OV7725_HREF 0x32 +#define OV7725_DM_LNL 0x33 +#define OV7725_DM_LNH 0x34 +#define OV7725_ADoff_B 0x35 +#define OV7725_ADoff_R 0x36 +#define OV7725_ADoff_Gb 0x37 +#define OV7725_ADoff_Gr 0x38 +#define OV7725_Off_B 0x39 +#define OV7725_Off_R 0x3A +#define OV7725_Off_Gb 0x3B +#define OV7725_Off_Gr 0x3C +#define OV7725_COM12 0x3D +#define OV7725_COM13 0x3E +#define OV7725_COM14 0x3F +#define OV7725_COM16 0x41 +#define OV7725_TGT_B 0x42 +#define OV7725_TGT_R 0x43 +#define OV7725_TGT_Gb 0x44 +#define OV7725_TGT_Gr 0x45 +#define OV7725_LC_CTR 0x46 +#define OV7725_LC_XC 0x47 +#define OV7725_LC_YC 0x48 +#define OV7725_LC_COEF 0x49 +#define OV7725_LC_RADI 0x4A +#define OV7725_LC_COEFB 0x4B +#define OV7725_LC_COEFR 0x4C +#define OV7725_FixGain 0x4D +#define OV7725_AREF1 0x4F +#define OV7725_AREF6 0x54 +#define OV7725_UFix 0x60 +#define OV7725_VFix 0x61 +#define OV7725_AWBb_blk 0x62 +#define OV7725_AWB_Ctrl0 0x63 +#define OV7725_DSP_Ctrl1 0x64 +#define OV7725_DSP_Ctrl2 0x65 +#define OV7725_DSP_Ctrl3 0x66 +#define OV7725_DSP_Ctrl4 0x67 +#define OV7725_AWB_bias 0x68 +#define OV7725_AWBCtrl1 0x69 +#define OV7725_AWBCtrl2 0x6A +#define OV7725_AWBCtrl3 0x6B +#define OV7725_AWBCtrl4 0x6C +#define OV7725_AWBCtrl5 0x6D +#define OV7725_AWBCtrl6 0x6E +#define OV7725_AWBCtrl7 0x6F +#define OV7725_AWBCtrl8 0x70 +#define OV7725_AWBCtrl9 0x71 +#define OV7725_AWBCtrl10 0x72 +#define OV7725_AWBCtrl11 0x73 +#define OV7725_AWBCtrl12 0x74 +#define OV7725_AWBCtrl13 0x75 +#define OV7725_AWBCtrl14 0x76 +#define OV7725_AWBCtrl15 0x77 +#define OV7725_AWBCtrl16 0x78 +#define OV7725_AWBCtrl17 0x79 +#define OV7725_AWBCtrl18 0x7A +#define OV7725_AWBCtrl19 0x7B +#define OV7725_AWBCtrl20 0x7C +#define OV7725_AWBCtrl21 0x7D +#define OV7725_GAM1 0x7E +#define OV7725_GAM2 0x7F +#define OV7725_GAM3 0x80 +#define OV7725_GAM4 0x81 +#define OV7725_GAM5 0x82 +#define OV7725_GAM6 0x83 +#define OV7725_GAM7 0x84 +#define OV7725_GAM8 0x85 +#define OV7725_GAM9 0x86 +#define OV7725_GAM10 0x87 +#define OV7725_GAM11 0x88 +#define OV7725_GAM12 0x89 +#define OV7725_GAM13 0x8A +#define OV7725_GAM14 0x8B +#define OV7725_GAM15 0x8C +#define OV7725_SLOP 0x8D +#define OV7725_DNSTh 0x8E +#define OV7725_EDGE0 0x8F +#define OV7725_EDGE1 0x90 +#define OV7725_DNSOff 0x91 +#define OV7725_EDGE2 0x92 +#define OV7725_EDGE3 0x93 +#define OV7725_MTX1 0x94 +#define OV7725_MTX2 0x95 +#define OV7725_MTX3 0x96 +#define OV7725_MTX4 0x97 +#define OV7725_MTX5 0x98 +#define OV7725_MTX6 0x99 +#define OV7725_MTX_Ctrl 0x9A +#define OV7725_BRIGHT 0x9B +#define OV7725_CNST 0x9C +#define OV7725_UVADJ0 0x9E +#define OV7725_UVADJ1 0x9F +#define OV7725_SCAL0 0xA0 +#define OV7725_SCAL1 0xA1 +#define OV7725_SCAL2 0xA2 +#define OV7725_SDE 0xA6 +#define OV7725_USAT 0xA7 +#define OV7725_VSAT 0xA8 +#define OV7725_HUECOS 0xA9 +#define OV7725_HUESIN 0xAA +#define OV7725_SIGN 0xAB +#define OV7725_DSPAuto 0xAC + + +#define OV7725_DEV_ADD 0x42>>1 + + +//配置摄像头参数 +#define OV7725_W 160 //定义摄像头图像宽度 可设置参数 80 160 240 320 +#define OV7725_H 120 //定义摄像头图像高度 可设置参数 60 120 180 240 +#define OV7725_SIZE (OV7725_W * OV7725_H/8 ) //图像占用空间大小 +#define OV7725_DMA_NUM (OV7725_SIZE) //一副图像DMA采集次数 + + +//-------------------------------------------------------------------------------------------------- +//引脚配置 +//-------------------------------------------------------------------------------------------------- +#define OV7725_VSYNC_PIN ERU_CH3_REQ6_P02_0 //场中断引脚 可选范围参考ERU_PIN_enum枚举 不可与像素引脚选择为同一个通道,或者是共用中断的通道 + //例如场中断选择ERU_CH3 那么像素引脚就不能选择ERU_CH7,因为3和7的中断是共用的。 + +#define OV7725_DATA_PIN P00_0 //定义D0数据引脚 假设D0定义为P00_0 那么D1所使用的引脚则为P00_1,依次类推 + //可设置参数P00_0、P02_0、P15_0,不能设置为其他参数 + +#define OV7725_PCLK_PIN ERU_CH2_REQ14_P02_1 //定义像素时钟引脚 可选范围参考ERU_PIN_enum枚举 不可与场中断引脚选择为同一个通道,或者是共用中断的通道 + //例如场中断选择ERU_CH3 那么像素引脚就不能选择ERU_CH7,因为3和7的中断是共用的。 + +#define OV7725_DMA_CH IfxDma_ChannelId_5 //定义使用的DMA通道 0-47可选 通道号越大优先级越低 + //修改此处之后,需要修改对应的ERU中断优先级,例如此处设置为IfxDma_ChannelId_5则对应的ERU中断优先级应该设置为5 + + + +extern uint8 image_bin[OV7725_H][OV7725_W/8]; //定义存储接收图像的数组 +extern uint8 image_dec[OV7725_H][OV7725_W]; //图像解压后的数组 + +extern uint8 ov7725_finish_flag; //图像采集完成标志位 + + +//函数声明 +uint8 ov7725_init(void); +void ov7725_vsync(void); +void ov7725_dma(void); +void image_decompression(uint8 *data1,uint8 *data2); +void seekfree_sendimg_7725(UARTN_enum uartn); + + + +#endif + + + diff --git a/Example/2-LED_Blink_Demo/Libraries/seekfree_peripheral/SEEKFREE_ICM20602.c b/Example/2-LED_Blink_Demo/Libraries/seekfree_peripheral/SEEKFREE_ICM20602.c index 095f9e3..5d167c9 100644 --- a/Example/2-LED_Blink_Demo/Libraries/seekfree_peripheral/SEEKFREE_ICM20602.c +++ b/Example/2-LED_Blink_Demo/Libraries/seekfree_peripheral/SEEKFREE_ICM20602.c @@ -68,6 +68,7 @@ void icm20602_self1_check(void) //------------------------------------------------------------------------------------------------------------------- void icm20602_init(void) { + simiic_init(); systick_delay_ms(STM0, 10); //上电延时 //检测 diff --git a/Example/2-LED_Blink_Demo/Libraries/seekfree_peripheral/SEEKFREE_IIC.c b/Example/2-LED_Blink_Demo/Libraries/seekfree_peripheral/SEEKFREE_IIC.c index 196fd57..f56a41a 100644 --- a/Example/2-LED_Blink_Demo/Libraries/seekfree_peripheral/SEEKFREE_IIC.c +++ b/Example/2-LED_Blink_Demo/Libraries/seekfree_peripheral/SEEKFREE_IIC.c @@ -50,7 +50,7 @@ uint8 IIC_num; // -static uint16 simiic_delay_time=100; //ICM等传感器应设置为100 +static uint16 simiic_delay_time = SIMIIC_DELAY_TIME; //ICM等传感器应设置为20 //------------------------------------------------------------------------------------------------------------------- diff --git a/Example/2-LED_Blink_Demo/Libraries/seekfree_peripheral/SEEKFREE_IIC.h b/Example/2-LED_Blink_Demo/Libraries/seekfree_peripheral/SEEKFREE_IIC.h index 293a02a..6a9c1e3 100644 --- a/Example/2-LED_Blink_Demo/Libraries/seekfree_peripheral/SEEKFREE_IIC.h +++ b/Example/2-LED_Blink_Demo/Libraries/seekfree_peripheral/SEEKFREE_IIC.h @@ -34,8 +34,12 @@ -#define SEEKFREE_SCL P13_0 //定义SCL引脚 可任意更改为其他IO -#define SEEKFREE_SDA P13_1 //定义SDA引脚 可任意更改为其他IO +#define SEEKFREE_SCL P02_3 //定义SCL引脚 可任意更改为其他IO +#define SEEKFREE_SDA P02_2 //定义SDA引脚 可任意更改为其他IO + + +#define SIMIIC_DELAY_TIME 20 + typedef enum IIC //DAC模块 { diff --git a/Example/2-LED_Blink_Demo/Libraries/seekfree_peripheral/SEEKFREE_L3G4200D.c b/Example/2-LED_Blink_Demo/Libraries/seekfree_peripheral/SEEKFREE_L3G4200D.c index 0f0c23a..5deb7d3 100644 --- a/Example/2-LED_Blink_Demo/Libraries/seekfree_peripheral/SEEKFREE_L3G4200D.c +++ b/Example/2-LED_Blink_Demo/Libraries/seekfree_peripheral/SEEKFREE_L3G4200D.c @@ -65,6 +65,7 @@ void l3g4200d_self_check(void) //------------------------------------------------------------------------------------------------------------------- void l3g4200d_init(void) { + simiic_init(); systick_delay_ms(STM0, 50); l3g4200d_self_check(); diff --git a/Example/2-LED_Blink_Demo/Libraries/seekfree_peripheral/SEEKFREE_MMA8451.c b/Example/2-LED_Blink_Demo/Libraries/seekfree_peripheral/SEEKFREE_MMA8451.c index c200427..8a5eec4 100644 --- a/Example/2-LED_Blink_Demo/Libraries/seekfree_peripheral/SEEKFREE_MMA8451.c +++ b/Example/2-LED_Blink_Demo/Libraries/seekfree_peripheral/SEEKFREE_MMA8451.c @@ -68,6 +68,7 @@ void mma8451_self_check(void) //------------------------------------------------------------------------------------------------------------------- uint8 mma845x_init(void) { + simiic_init(); systick_delay_ms(STM0, 50); mma8451_self_check(); diff --git a/Example/2-LED_Blink_Demo/Libraries/seekfree_peripheral/SEEKFREE_MPU6050.c b/Example/2-LED_Blink_Demo/Libraries/seekfree_peripheral/SEEKFREE_MPU6050.c index 0317aa0..686550d 100644 --- a/Example/2-LED_Blink_Demo/Libraries/seekfree_peripheral/SEEKFREE_MPU6050.c +++ b/Example/2-LED_Blink_Demo/Libraries/seekfree_peripheral/SEEKFREE_MPU6050.c @@ -71,6 +71,7 @@ void mpu6050_self1_check(void) //------------------------------------------------------------------------------------------------------------------- void mpu6050_init(void) { + simiic_init(); systick_delay_ms(STM0, 100); //上电延时 mpu6050_self1_check(); diff --git a/Example/2-LED_Blink_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.c b/Example/2-LED_Blink_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.c index 014b435..05f181f 100644 --- a/Example/2-LED_Blink_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.c +++ b/Example/2-LED_Blink_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.c @@ -38,7 +38,6 @@ #include "zf_gpio.h" #include "zf_eru.h" #include "zf_eru_dma.h" -#include "stdio.h" #include "SEEKFREE_MT9V03X.h" @@ -49,6 +48,8 @@ uint8 receive[3]; uint8 receive_num = 0; vuint8 uart_receive_flag; +uint8 link_list_num; + //需要配置到摄像头的数据 int16 MT9V03X_CFG[CONFIG_FINISH][2]= { @@ -305,7 +306,7 @@ void mt9v03x_init(void) gpio_init((PIN_enum)(MT9V03X_DATA_PIN+i), GPI, 0, PULLUP); } - eru_dma_init(MT9V03X_DMA_CH, GET_PORT_IN_ADDR(MT9V03X_DATA_PIN), mt9v03x_image[0], MT9V03X_PCLK_PIN, RISING, MT9V03X_W); + link_list_num = eru_dma_init(MT9V03X_DMA_CH, GET_PORT_IN_ADDR(MT9V03X_DATA_PIN), mt9v03x_image[0], MT9V03X_PCLK_PIN, RISING, MT9V03X_W*MT9V03X_H); eru_init(MT9V03X_VSYNC_PIN, FALLING); //初始化场中断,并设置为下降沿触发中断 restoreInterrupts(interrupt_state); @@ -313,7 +314,6 @@ void mt9v03x_init(void) uint8 mt9v03x_finish_flag = 0; //一场图像采集完成标志位 -uint8 now_col; //当前正在采集的行 //------------------------------------------------------------------------------------------------------------------- // @brief MT9V03X摄像头场中断 // @param NULL @@ -324,16 +324,15 @@ uint8 now_col; // void mt9v03x_vsync(void) { CLEAR_GPIO_FLAG(MT9V03X_VSYNC_PIN); - now_col = 0; + if(!mt9v03x_finish_flag)//查看图像数组是否使用完毕,如果未使用完毕则不开始采集,避免出现访问冲突 { - DMA_SET_DESTINATION(MT9V03X_DMA_CH, (void *)&mt9v03x_image[0]); dma_start(MT9V03X_DMA_CH); } } - +uint8 mt9v03x_dma_int_num; //当前DMA中断次数 //------------------------------------------------------------------------------------------------------------------- // @brief MT9V03X摄像头DMA完成中断 // @param NULL @@ -344,16 +343,15 @@ void mt9v03x_vsync(void) void mt9v03x_dma(void) { CLEAR_DMA_FLAG(MT9V03X_DMA_CH); + mt9v03x_dma_int_num++; - now_col++; - - if(MT9V03X_H > now_col) - { - dma_start(MT9V03X_DMA_CH); - } - else + if(mt9v03x_dma_int_num >= link_list_num) { + //采集完成 + mt9v03x_dma_int_num = 0; mt9v03x_finish_flag = 1;//一副图像从采集开始到采集结束耗时3.8MS左右(50FPS、188*120分辨率) + dma_stop(MT9V03X_DMA_CH); + } } diff --git a/Example/2-LED_Blink_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.h b/Example/2-LED_Blink_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.h index a29edd2..0c8a785 100644 --- a/Example/2-LED_Blink_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.h +++ b/Example/2-LED_Blink_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.h @@ -63,9 +63,7 @@ //例如场中断选择ERU_CH3 那么像素引脚就不能选择ERU_CH7,因为3和7的中断是共用的。 #define MT9V03X_DMA_CH IfxDma_ChannelId_5 //定义使用的DMA通道 0-47可选 通道号越大优先级越低 - //修改此处之后,需要修改对应的ERU中断优先级,例如此处设置为IfxDma_ChannelId_5则对应的ERU中断优先级应该设置为5 - - + //摄像头命令枚举 typedef enum { diff --git a/Example/2-LED_Blink_Demo/USER/isr.c b/Example/2-LED_Blink_Demo/USER/isr.c index 15666f2..c6376b0 100644 --- a/Example/2-LED_Blink_Demo/USER/isr.c +++ b/Example/2-LED_Blink_Demo/USER/isr.c @@ -98,7 +98,8 @@ IFX_INTERRUPT(eru_ch3_ch7_isr, ERU_CH3_CH7_INT_SERVICE, ERU_CH3_CH7_INT_PRIO) if(GET_GPIO_FLAG(ERU_CH3_REQ6_P02_0))//通道3中断 { CLEAR_GPIO_FLAG(ERU_CH3_REQ6_P02_0); - if(1 == camera_type)mt9v03x_vsync(); + if (1 == camera_type) mt9v03x_vsync(); + else if (3 == camera_type) ov7725_vsync(); } if(GET_GPIO_FLAG(ERU_CH7_REQ16_P15_1))//通道7中断 @@ -113,7 +114,8 @@ IFX_INTERRUPT(eru_ch3_ch7_isr, ERU_CH3_CH7_INT_SERVICE, ERU_CH3_CH7_INT_PRIO) IFX_INTERRUPT(dma_ch5_isr, ERU_DMA_INT_SERVICE, ERU_DMA_INT_PRIO) { - if(1 == camera_type) mt9v03x_dma(); + if (1 == camera_type) mt9v03x_dma(); + else if (3 == camera_type) ov7725_dma(); } diff --git a/Example/3-PIT_Demo/Libraries/doc/version.txt b/Example/3-PIT_Demo/Libraries/doc/version.txt index b85cd50..a42bc58 100644 --- a/Example/3-PIT_Demo/Libraries/doc/version.txt +++ b/Example/3-PIT_Demo/Libraries/doc/version.txt @@ -1,9 +1,17 @@ V1.0.0 - 初始版本 + 初始版本 V1.0.1 对总钻风摄像头的场中断进行修改,判断标志位为0才采集下一幅图像,避免出现访问冲突 修改SPI初始化中的错误,引用了固定的SPI2基地址 修复STM中无法使用STM1的问题 - 修复gtm pwm中最大占空比只有GTM_ATOM0_PWM_DUTY_MAX设置有效的问题 \ No newline at end of file + 修复gtm pwm中最大占空比只有GTM_ATOM0_PWM_DUTY_MAX设置有效的问题 + +V1.0.2 + 修改模拟IIC默认延时时间为20 + 添加 需要特别注意P20_2是不能用于输出的,仅仅只有输入的功能 注意事项 + 将摄像头采集DMA改为link传输,可以大大降低DMA中断次数 + 修改默认的软件IIC引脚定义 + 将6050等 需要用到软件IIC的模块,在初始化函数中默认调用模拟IIC初始化 + 添加小钻风驱动程序 \ No newline at end of file diff --git a/Example/3-PIT_Demo/Libraries/seekfree_libraries/common/common.c b/Example/3-PIT_Demo/Libraries/seekfree_libraries/common/common.c index 0460d15..ac42b19 100644 --- a/Example/3-PIT_Demo/Libraries/seekfree_libraries/common/common.c +++ b/Example/3-PIT_Demo/Libraries/seekfree_libraries/common/common.c @@ -22,7 +22,7 @@ #include "SysSe/Bsp/Bsp.h" #include "common.h" -uint8 camera_type; +uint8 camera_type; //摄像头型号 1:总钻风 2:凌瞳(暂未支持)3:小钻风 diff --git a/Example/3-PIT_Demo/Libraries/seekfree_libraries/common/common.h b/Example/3-PIT_Demo/Libraries/seekfree_libraries/common/common.h index fe7ec63..13d03cd 100644 --- a/Example/3-PIT_Demo/Libraries/seekfree_libraries/common/common.h +++ b/Example/3-PIT_Demo/Libraries/seekfree_libraries/common/common.h @@ -111,7 +111,7 @@ typedef enum //枚 #include -extern uint8 camera_type; +extern uint8 camera_type; //摄像头型号 1:总钻风 2:凌瞳(暂未支持)3:小钻风 void get_clk(void); diff --git a/Example/3-PIT_Demo/Libraries/seekfree_libraries/headfile.h b/Example/3-PIT_Demo/Libraries/seekfree_libraries/headfile.h index 0e8024f..e11bd83 100644 --- a/Example/3-PIT_Demo/Libraries/seekfree_libraries/headfile.h +++ b/Example/3-PIT_Demo/Libraries/seekfree_libraries/headfile.h @@ -62,6 +62,7 @@ #include "SEEKFREE_L3G4200D.h" #include "SEEKFREE_WIRELESS.h" #include "SEEKFREE_IPS200_PARALLEL8.h" +#include "SEEKFREE_7725.h" #endif diff --git a/Example/3-PIT_Demo/Libraries/seekfree_libraries/zf_eru_dma.c b/Example/3-PIT_Demo/Libraries/seekfree_libraries/zf_eru_dma.c index f7aab10..86c0158 100644 --- a/Example/3-PIT_Demo/Libraries/seekfree_libraries/zf_eru_dma.c +++ b/Example/3-PIT_Demo/Libraries/seekfree_libraries/zf_eru_dma.c @@ -21,9 +21,18 @@ #include "IfxDma_Dma.h" #include "IfxScuEru.h" #include "isr_config.h" +#include "zf_assert.h" #include "zf_eru_dma.h" +typedef struct +{ + Ifx_DMA_CH IFX_ALIGN(256) linked_list[8];//DMA链表 + IfxDma_Dma_Channel channel; //DMA通道句柄 +}DMA_LINK; + + +DMA_LINK dma_link_list; //------------------------------------------------------------------------------------------------------------------- // @brief eru触发dma初始化 @@ -36,7 +45,7 @@ // @return void // Sample usage: //------------------------------------------------------------------------------------------------------------------- -void eru_dma_init(IfxDma_ChannelId dma_ch, uint8 *source_addr, uint8 *destination_addr, ERU_PIN_enum eru_pin, TRIGGER_enum trigger, uint16 dma_count) +uint8 eru_dma_init(IfxDma_ChannelId dma_ch, uint8 *source_addr, uint8 *destination_addr, ERU_PIN_enum eru_pin, TRIGGER_enum trigger, uint16 dma_count) { IfxDma_Dma_Channel dmaChn; //eru触发DMA通道号 在eru文件中设置eru的优先级,即为触发的通道 @@ -51,27 +60,85 @@ void eru_dma_init(IfxDma_ChannelId dma_ch, uint8 *source_addr, uint8 *destinatio IfxDma_Dma_ChannelConfig cfg; IfxDma_Dma_initChannelConfig(&cfg, &dma); - cfg.transferCount = dma_count; + uint8 list_num, i; + uint16 single_channel_dma_count; + + ZF_ASSERT(!(dma_count%8));//传输次数必须为8的倍数 + + + list_num = 1; + single_channel_dma_count = dma_count / list_num; + if(16384 < single_channel_dma_count) + { + while(TRUE) + { + single_channel_dma_count = dma_count / list_num; + if((single_channel_dma_count <= 16384) && !(dma_count % list_num)) + { + break; + } + list_num++; + if(list_num > 8) ZF_ASSERT(FALSE); + } + } + + + if(1 == list_num) + { + cfg.shadowControl = IfxDma_ChannelShadow_none; + cfg.operationMode = IfxDma_ChannelOperationMode_single; + cfg.shadowAddress = 0; + } + else + { + cfg.shadowControl = IfxDma_ChannelShadow_linkedList; + cfg.operationMode = IfxDma_ChannelOperationMode_continuous; + cfg.shadowAddress = IFXCPU_GLB_ADDR_DSPR(IfxCpu_getCoreId(), (unsigned)&dma_link_list.linked_list[1]); + } + cfg.requestMode = IfxDma_ChannelRequestMode_oneTransferPerRequest; cfg.moveSize = IfxDma_ChannelMoveSize_8bit; + cfg.busPriority = IfxDma_ChannelBusPriority_high; - cfg.busPriority = IfxDma_ChannelBusPriority_high; - - cfg.sourceAddress = (unsigned)(source_addr); + cfg.sourceAddress = IFXCPU_GLB_ADDR_DSPR(IfxCpu_getCoreId(), source_addr); cfg.sourceAddressCircularRange = IfxDma_ChannelIncrementCircular_none; cfg.sourceCircularBufferEnabled = TRUE; - cfg.destinationAddress = IFXCPU_GLB_ADDR_DSPR(IfxCpu_getCoreId(), destination_addr); cfg.destinationAddressIncrementStep = IfxDma_ChannelIncrementStep_1; - cfg.operationMode = IfxDma_ChannelOperationMode_single; - cfg.channelId = (IfxDma_ChannelId)dma_ch; - cfg.hardwareRequestEnabled = TRUE; - cfg.channelInterruptEnabled = TRUE; + cfg.channelId = (IfxDma_ChannelId)dma_ch; + cfg.hardwareRequestEnabled = FALSE; + cfg.channelInterruptEnabled = TRUE; cfg.channelInterruptPriority = ERU_DMA_INT_PRIO; cfg.channelInterruptTypeOfService = (IfxSrc_Tos)ERU_DMA_INT_SERVICE; + + + cfg.destinationAddress = IFXCPU_GLB_ADDR_DSPR(IfxCpu_getCoreId(), destination_addr); + + cfg.transferCount = single_channel_dma_count; + IfxDma_Dma_initChannel(&dmaChn, &cfg); + + if(1 < list_num) + { + i = 0; + while(i < list_num) + { + cfg.destinationAddress = IFXCPU_GLB_ADDR_DSPR(IfxCpu_getCoreId(), destination_addr + single_channel_dma_count * i); + if(i == (list_num - 1)) cfg.shadowAddress = IFXCPU_GLB_ADDR_DSPR(IfxCpu_getCoreId(), (unsigned)&dma_link_list.linked_list[0]); + else cfg.shadowAddress = IFXCPU_GLB_ADDR_DSPR(IfxCpu_getCoreId(), (unsigned)&dma_link_list.linked_list[i+1]); + cfg.transferCount = single_channel_dma_count; + + IfxDma_Dma_initLinkedListEntry((void *)&dma_link_list.linked_list[i], &cfg); + i++; + } + } + + + IfxDma_Dma_getSrcPointer(&dma_link_list.channel)->B.CLRR = 1; + + return list_num; } diff --git a/Example/3-PIT_Demo/Libraries/seekfree_libraries/zf_eru_dma.h b/Example/3-PIT_Demo/Libraries/seekfree_libraries/zf_eru_dma.h index 50667ad..faef169 100644 --- a/Example/3-PIT_Demo/Libraries/seekfree_libraries/zf_eru_dma.h +++ b/Example/3-PIT_Demo/Libraries/seekfree_libraries/zf_eru_dma.h @@ -29,9 +29,9 @@ #define CLEAR_DMA_FLAG(dma_ch) IfxDma_clearChannelInterrupt(&MODULE_DMA, dma_ch); -#define DMA_SET_DESTINATION(dma_ch, destination_addr) IfxDma_setChannelDestinationAddress(&MODULE_DMA, dma_ch, (void *)destination_addr) +#define DMA_SET_DESTINATION(dma_ch, destination_addr) IfxDma_setChannelDestinationAddress(&MODULE_DMA, dma_ch, (void *)IFXCPU_GLB_ADDR_DSPR(IfxCpu_getCoreId(), destination_addr)) -void eru_dma_init(IfxDma_ChannelId dma_ch, uint8 *source_addr, uint8 *destination_addr, ERU_PIN_enum eru_pin, TRIGGER_enum trigger, uint16 dma_count); +uint8 eru_dma_init(IfxDma_ChannelId dma_ch, uint8 *source_addr, uint8 *destination_addr, ERU_PIN_enum eru_pin, TRIGGER_enum trigger, uint16 dma_count); void dma_stop(IfxDma_ChannelId dma_ch); void dma_start(IfxDma_ChannelId dma_ch); diff --git a/Example/3-PIT_Demo/Libraries/seekfree_libraries/zf_gpio.c b/Example/3-PIT_Demo/Libraries/seekfree_libraries/zf_gpio.c index 3c937cf..1d2466c 100644 --- a/Example/3-PIT_Demo/Libraries/seekfree_libraries/zf_gpio.c +++ b/Example/3-PIT_Demo/Libraries/seekfree_libraries/zf_gpio.c @@ -60,6 +60,7 @@ Ifx_P* get_port(PIN_enum pin) // @param pinmode 引脚配置(可设置参数由zf_gpio.h文件内GPIOMODE_enum枚举值确定) // @return void // Sample usage: gpio_init(P00_0, GPO, 1, PUSHPULL);//P00_0初始化为GPIO功能、输出模式、输出高电平、推挽输出 +// @note 需要特别注意P20_2是不能用于输出的,仅仅只有输入的功能 //------------------------------------------------------------------------------------------------------------------- void gpio_init(PIN_enum pin, GPIODIR_enum dir, uint8 dat, GPIOMODE_enum pinmode) { diff --git a/Example/3-PIT_Demo/Libraries/seekfree_libraries/zf_gpio.h b/Example/3-PIT_Demo/Libraries/seekfree_libraries/zf_gpio.h index cfbd666..e3d144f 100644 --- a/Example/3-PIT_Demo/Libraries/seekfree_libraries/zf_gpio.h +++ b/Example/3-PIT_Demo/Libraries/seekfree_libraries/zf_gpio.h @@ -38,6 +38,15 @@ typedef enum // 枚 #define GET_PORT_IN_ADDR(pin) (uint8 *)(&IfxPort_getAddress((IfxPort_Index)(pin/32))->IN + pin%32/8) + + +//需要特别注意P20_2是不能用于输出的,仅仅只有输入的功能 +//需要特别注意P20_2是不能用于输出的,仅仅只有输入的功能 +//需要特别注意P20_2是不能用于输出的,仅仅只有输入的功能 + + + + //------------------------------------------------------ //通用GPIO操作 void gpio_init(PIN_enum pin, GPIODIR_enum dir, uint8 dat, GPIOMODE_enum pinconf); diff --git a/Example/3-PIT_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.c b/Example/3-PIT_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.c new file mode 100644 index 0000000..806b8d9 --- /dev/null +++ b/Example/3-PIT_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.c @@ -0,0 +1,262 @@ +/********************************************************************************************************************* + * COPYRIGHT NOTICE + * Copyright (c) 2020,逐飞科技 + * All rights reserved. + * 技术讨论QQ群:三群:824575535 + * + * 以下所有内容版权均属逐飞科技所有,未经允许不得用于商业用途, + * 欢迎各位使用并传播本程序,修改内容时必须保留逐飞科技的版权声明。 + * + * @file main + * @company 成都逐飞科技有限公司 + * @author 逐飞科技(QQ3184284598) + * @version 查看doc内version文件 版本说明 + * @Software tasking v6.3r1 + * @Target core TC264D + * @Taobao https://seekfree.taobao.com/ + * @date 2020-3-23 + * @note + 接线定义: + ------------------------------------ + 模块管脚 单片机管脚 + SDA 查看SEEKFREE_IIC文件内的SEEKFREE_SDA宏定义 + SCL 查看SEEKFREE_IIC文件内的SEEKFREE_SCL宏定义 + 场中断(VSY) 查看SEEKFREE_OV7725.h文件中的OV7725_VSYNC_PIN宏定义 + 行中断(HREF) 未使用,因此不接 + 像素中断(PCLK) 查看SEEKFREE_OV7725.h文件中的OV7725_PCLK_PIN宏定义 + 数据口(D0-D7) 查看SEEKFREE_OV7725.h文件中的OV7725_DATA_PIN宏定义 + ------------------------------------ + + 默认分辨率是 160*120 + 默认FPS 50帧 + ********************************************************************************************************************/ + + +#include "IfxDma.h" +#include "IfxScuEru.h" +#include "zf_stm_systick.h" +#include "zf_gpio.h" +#include "zf_eru.h" +#include "zf_eru_dma.h" +#include "SEEKFREE_IIC.h" +#include "SEEKFREE_7725.h" + + + +IFX_ALIGN(4) uint8 image_bin[OV7725_H][OV7725_W/8]; //定义存储接收图像的数组 +uint8 image_dec[OV7725_H][OV7725_W]; + +uint8 ov7725_idcode = 0; + +//------------------------------------------------------------------------------------------------------------------- +// @brief 小钻风摄像头内部寄存器初始化(内部使用,用户无需调用) +// @param NULL +// @return uint8 返回0则出错,返回1则成功 +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +uint8 ov7725_reg_init(void) +{ + simiic_delay_set(500); + simiic_write_reg ( OV7725_DEV_ADD, OV7725_COM7, 0x80 ); //复位摄像头 + systick_delay_ms(STM0, 50); + ov7725_idcode = simiic_read_reg( OV7725_DEV_ADD, OV7725_VER ,SCCB); + if( ov7725_idcode != OV7725_ID ) return 0; //校验摄像头ID号 + + //ID号确认无误 然后配置寄存器 + simiic_write_reg(OV7725_DEV_ADD, OV7725_COM4 , 0xC1); + simiic_write_reg(OV7725_DEV_ADD, OV7725_CLKRC , 0x01); + simiic_write_reg(OV7725_DEV_ADD, OV7725_COM2 , 0x03); + simiic_write_reg(OV7725_DEV_ADD, OV7725_COM3 , 0xD0); + simiic_write_reg(OV7725_DEV_ADD, OV7725_COM7 , 0x40); + simiic_write_reg(OV7725_DEV_ADD, OV7725_COM8 , 0xCE); //0xCE:关闭自动曝光 0xCF:开启自动曝光 + simiic_write_reg(OV7725_DEV_ADD, OV7725_HSTART , 0x3F); + simiic_write_reg(OV7725_DEV_ADD, OV7725_HSIZE , 0x50); + simiic_write_reg(OV7725_DEV_ADD, OV7725_VSTRT , 0x03); + simiic_write_reg(OV7725_DEV_ADD, OV7725_VSIZE , 0x78); + simiic_write_reg(OV7725_DEV_ADD, OV7725_HREF , 0x00); + simiic_write_reg(OV7725_DEV_ADD, OV7725_SCAL0 , 0x0A); + simiic_write_reg(OV7725_DEV_ADD, OV7725_AWB_Ctrl0 , 0xE0); + simiic_write_reg(OV7725_DEV_ADD, OV7725_DSPAuto , 0xff); + simiic_write_reg(OV7725_DEV_ADD, OV7725_DSP_Ctrl2 , 0x0C); + simiic_write_reg(OV7725_DEV_ADD, OV7725_DSP_Ctrl3 , 0x00); + simiic_write_reg(OV7725_DEV_ADD, OV7725_DSP_Ctrl4 , 0x00); + + if(OV7725_W == 80) simiic_write_reg(OV7725_DEV_ADD, OV7725_HOutSize , 0x14); + else if(OV7725_W == 160) simiic_write_reg(OV7725_DEV_ADD, OV7725_HOutSize , 0x28); + else if(OV7725_W == 240) simiic_write_reg(OV7725_DEV_ADD, OV7725_HOutSize , 0x3c); + else if(OV7725_W == 320) simiic_write_reg(OV7725_DEV_ADD, OV7725_HOutSize , 0x50); + + if(OV7725_H == 60) simiic_write_reg(OV7725_DEV_ADD, OV7725_VOutSize , 0x1E); + else if(OV7725_H == 120) simiic_write_reg(OV7725_DEV_ADD, OV7725_VOutSize , 0x3c); + else if(OV7725_H == 180) simiic_write_reg(OV7725_DEV_ADD, OV7725_VOutSize , 0x5a); + else if(OV7725_H == 240) simiic_write_reg(OV7725_DEV_ADD, OV7725_VOutSize , 0x78); + + simiic_write_reg(OV7725_DEV_ADD, OV7725_REG28 , 0x01); + simiic_write_reg(OV7725_DEV_ADD, OV7725_EXHCH , 0x10); + simiic_write_reg(OV7725_DEV_ADD, OV7725_EXHCL , 0x1F); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM1 , 0x0c); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM2 , 0x16); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM3 , 0x2a); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM4 , 0x4e); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM5 , 0x61); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM6 , 0x6f); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM7 , 0x7b); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM8 , 0x86); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM9 , 0x8e); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM10 , 0x97); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM11 , 0xa4); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM12 , 0xaf); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM13 , 0xc5); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM14 , 0xd7); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM15 , 0xe8); + simiic_write_reg(OV7725_DEV_ADD, OV7725_SLOP , 0x20); + simiic_write_reg(OV7725_DEV_ADD, OV7725_LC_RADI , 0x00); + simiic_write_reg(OV7725_DEV_ADD, OV7725_LC_COEF , 0x13); + simiic_write_reg(OV7725_DEV_ADD, OV7725_LC_XC , 0x08); + simiic_write_reg(OV7725_DEV_ADD, OV7725_LC_COEFB , 0x14); + simiic_write_reg(OV7725_DEV_ADD, OV7725_LC_COEFR , 0x17); + simiic_write_reg(OV7725_DEV_ADD, OV7725_LC_CTR , 0x05); + simiic_write_reg(OV7725_DEV_ADD, OV7725_BDBase , 0x99); + simiic_write_reg(OV7725_DEV_ADD, OV7725_BDMStep , 0x03); + simiic_write_reg(OV7725_DEV_ADD, OV7725_SDE , 0x04); + simiic_write_reg(OV7725_DEV_ADD, OV7725_BRIGHT , 0x00); + simiic_write_reg(OV7725_DEV_ADD, OV7725_CNST , 0x40); + simiic_write_reg(OV7725_DEV_ADD, OV7725_SIGN , 0x06); + simiic_write_reg(OV7725_DEV_ADD, OV7725_UVADJ0 , 0x11); + simiic_write_reg(OV7725_DEV_ADD, OV7725_UVADJ1 , 0x02); + + + simiic_delay_set(SIMIIC_DELAY_TIME);//修改为默认的20 + return 1; + + +} + + + + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 小钻风摄像头采集程序初始化(内部使用,用户无需调用) +// @param NULL +// @return void +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +void ov7725_port_init(void) +{ + uint8 i; + camera_type = 3;//设置连接摄像头类型 + + //摄像头采集初始化 + //初始化 数据引脚 + for(i=0; i<8; i++) + { + gpio_init((PIN_enum)(OV7725_DATA_PIN+i), GPI, 0, PULLUP); + } + eru_dma_init(OV7725_DMA_CH, GET_PORT_IN_ADDR(OV7725_DATA_PIN), image_bin[0], OV7725_PCLK_PIN, FALLING, OV7725_DMA_NUM); + eru_init(OV7725_VSYNC_PIN, FALLING); //初始化场中断,并设置为下降沿触发中断 + +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 小钻风摄像头初始化(调用之后设置好相关中断函数即可采集图像) +// @param NULL +// @return 0 +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +uint8 ov7725_init(void) +{ + simiic_init(); + ov7725_reg_init(); //摄像头寄存器配置 + ov7725_port_init(); //摄像头中断引脚及DMA配置 + return 0; +} + + + + +uint8 ov7725_finish_flag = 0; +//------------------------------------------------------------------------------------------------------------------- +// @brief 小钻风摄像头场中断 +// @param NULL +// @return void +// @since v1.0 +// Sample usage: 此函数在isr.c中被eru(GPIO中断)中断调用 +//------------------------------------------------------------------------------------------------------------------- +void ov7725_vsync(void) +{ + CLEAR_GPIO_FLAG(OV7725_VSYNC_PIN); + + if(!ov7725_finish_flag)//查看图像数组是否使用完毕,如果未使用完毕则不开始采集,避免出现访问冲突 + { + DMA_SET_DESTINATION(OV7725_DMA_CH, image_bin[0]); + dma_start(OV7725_DMA_CH); + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 小钻风摄像头DMA完成中断 +// @param NULL +// @return void +// @since v1.0 +// Sample usage: 此函数在isr.c中被dma中断调用 +//------------------------------------------------------------------------------------------------------------------- +void ov7725_dma(void) +{ + CLEAR_DMA_FLAG(OV7725_DMA_CH); + ov7725_finish_flag = 1; + dma_stop(OV7725_DMA_CH); +} + + + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 小钻风摄像头数据解压函数 +// @param *data1 源地址 +// @param *data2 目的地址 +// @return void +// @since v1.0 +// Sample usage: Image_Decompression(da1,dat2[0]);//将一维数组dat1的内容解压到二维数组dat2里. +//------------------------------------------------------------------------------------------------------------------- +void image_decompression(uint8 *data1,uint8 *data2) +{ + uint8 temp[2] = {0,255}; + uint16 lenth = OV7725_SIZE; + uint8 i = 8; + + + while(lenth--) + { + i = 8; + while(i--) + { + *data2++ = temp[(*data1 >> i) & 0x01]; + } + data1++; + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 小钻风摄像头未解压图像发送至上位机查看图像 +// @param *imgaddr 压缩图像数据地址 +// @param *imgsize 图像大小(直接填写OV7725_SIZE) +// @return void +// @since v1.0 +// Sample usage: 调用该函数前请先初始化uart2 +//------------------------------------------------------------------------------------------------------------------- +void seekfree_sendimg_7725(UARTN_enum uartn) +{ + uart_putchar(uartn, 0x00);uart_putchar(uartn, 0xff);uart_putchar(uartn, 0x01);uart_putchar(uartn, 0x01);//发送四个字节命令 + uart_putbuff(uartn, image_bin[0], OV7725_SIZE); //再发送图像 +} + + + + diff --git a/Example/3-PIT_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.h b/Example/3-PIT_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.h new file mode 100644 index 0000000..e513250 --- /dev/null +++ b/Example/3-PIT_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.h @@ -0,0 +1,243 @@ +/********************************************************************************************************************* + * COPYRIGHT NOTICE + * Copyright (c) 2020,逐飞科技 + * All rights reserved. + * 技术讨论QQ群:三群:824575535 + * + * 以下所有内容版权均属逐飞科技所有,未经允许不得用于商业用途, + * 欢迎各位使用并传播本程序,修改内容时必须保留逐飞科技的版权声明。 + * + * @file main + * @company 成都逐飞科技有限公司 + * @author 逐飞科技(QQ3184284598) + * @version 查看doc内version文件 版本说明 + * @Software tasking v6.3r1 + * @Target core TC264D + * @Taobao https://seekfree.taobao.com/ + * @date 2020-3-23 + * @note + 接线定义: + ------------------------------------ + 模块管脚 单片机管脚 + SDA 查看SEEKFREE_IIC文件内的SEEKFREE_SDA宏定义 + SCL 查看SEEKFREE_IIC文件内的SEEKFREE_SCL宏定义 + 场中断(VSY) 查看SEEKFREE_OV7725.h文件中的OV7725_VSYNC_PIN宏定义 + 行中断(HREF) 未使用,因此不接 + 像素中断(PCLK) 查看SEEKFREE_OV7725.h文件中的OV7725_PCLK_PIN宏定义 + 数据口(D0-D7) 查看SEEKFREE_OV7725.h文件中的OV7725_DATA_PIN宏定义 + ------------------------------------ + + 默认分辨率是 160*120 + 默认FPS 50帧 + ********************************************************************************************************************/ + + + +#ifndef _SEEKFREE_7725_h +#define _SEEKFREE_7725_h + +#include "common.h" +#include "IfxDma_cfg.h" +#include "zf_uart.h" + + +//摄像头ID号 +#define OV7725_ID 0x21 + +//摄像头寄存器 +#define OV7725_GAIN 0x00 +#define OV7725_BLUE 0x01 +#define OV7725_RED 0x02 +#define OV7725_GREEN 0x03 +#define OV7725_BAVG 0x05 +#define OV7725_GAVG 0x06 +#define OV7725_RAVG 0x07 +#define OV7725_AECH 0x08 +#define OV7725_COM2 0x09 +#define OV7725_PID 0x0A +#define OV7725_VER 0x0B +#define OV7725_COM3 0x0C +#define OV7725_COM4 0x0D +#define OV7725_COM5 0x0E +#define OV7725_COM6 0x0F +#define OV7725_AEC 0x10 +#define OV7725_CLKRC 0x11 +#define OV7725_COM7 0x12 +#define OV7725_COM8 0x13 +#define OV7725_COM9 0x14 +#define OV7725_COM10 0x15 +#define OV7725_REG16 0x16 +#define OV7725_HSTART 0x17 +#define OV7725_HSIZE 0x18 +#define OV7725_VSTRT 0x19 +#define OV7725_VSIZE 0x1A +#define OV7725_PSHFT 0x1B +#define OV7725_MIDH 0x1C +#define OV7725_MIDL 0x1D +#define OV7725_LAEC 0x1F +#define OV7725_COM11 0x20 +#define OV7725_BDBase 0x22 +#define OV7725_BDMStep 0x23 +#define OV7725_AEW 0x24 +#define OV7725_AEB 0x25 +#define OV7725_VPT 0x26 +#define OV7725_REG28 0x28 +#define OV7725_HOutSize 0x29 +#define OV7725_EXHCH 0x2A +#define OV7725_EXHCL 0x2B +#define OV7725_VOutSize 0x2C +#define OV7725_ADVFL 0x2D +#define OV7725_ADVFH 0x2E +#define OV7725_YAVE 0x2F +#define OV7725_LumHTh 0x30 +#define OV7725_LumLTh 0x31 +#define OV7725_HREF 0x32 +#define OV7725_DM_LNL 0x33 +#define OV7725_DM_LNH 0x34 +#define OV7725_ADoff_B 0x35 +#define OV7725_ADoff_R 0x36 +#define OV7725_ADoff_Gb 0x37 +#define OV7725_ADoff_Gr 0x38 +#define OV7725_Off_B 0x39 +#define OV7725_Off_R 0x3A +#define OV7725_Off_Gb 0x3B +#define OV7725_Off_Gr 0x3C +#define OV7725_COM12 0x3D +#define OV7725_COM13 0x3E +#define OV7725_COM14 0x3F +#define OV7725_COM16 0x41 +#define OV7725_TGT_B 0x42 +#define OV7725_TGT_R 0x43 +#define OV7725_TGT_Gb 0x44 +#define OV7725_TGT_Gr 0x45 +#define OV7725_LC_CTR 0x46 +#define OV7725_LC_XC 0x47 +#define OV7725_LC_YC 0x48 +#define OV7725_LC_COEF 0x49 +#define OV7725_LC_RADI 0x4A +#define OV7725_LC_COEFB 0x4B +#define OV7725_LC_COEFR 0x4C +#define OV7725_FixGain 0x4D +#define OV7725_AREF1 0x4F +#define OV7725_AREF6 0x54 +#define OV7725_UFix 0x60 +#define OV7725_VFix 0x61 +#define OV7725_AWBb_blk 0x62 +#define OV7725_AWB_Ctrl0 0x63 +#define OV7725_DSP_Ctrl1 0x64 +#define OV7725_DSP_Ctrl2 0x65 +#define OV7725_DSP_Ctrl3 0x66 +#define OV7725_DSP_Ctrl4 0x67 +#define OV7725_AWB_bias 0x68 +#define OV7725_AWBCtrl1 0x69 +#define OV7725_AWBCtrl2 0x6A +#define OV7725_AWBCtrl3 0x6B +#define OV7725_AWBCtrl4 0x6C +#define OV7725_AWBCtrl5 0x6D +#define OV7725_AWBCtrl6 0x6E +#define OV7725_AWBCtrl7 0x6F +#define OV7725_AWBCtrl8 0x70 +#define OV7725_AWBCtrl9 0x71 +#define OV7725_AWBCtrl10 0x72 +#define OV7725_AWBCtrl11 0x73 +#define OV7725_AWBCtrl12 0x74 +#define OV7725_AWBCtrl13 0x75 +#define OV7725_AWBCtrl14 0x76 +#define OV7725_AWBCtrl15 0x77 +#define OV7725_AWBCtrl16 0x78 +#define OV7725_AWBCtrl17 0x79 +#define OV7725_AWBCtrl18 0x7A +#define OV7725_AWBCtrl19 0x7B +#define OV7725_AWBCtrl20 0x7C +#define OV7725_AWBCtrl21 0x7D +#define OV7725_GAM1 0x7E +#define OV7725_GAM2 0x7F +#define OV7725_GAM3 0x80 +#define OV7725_GAM4 0x81 +#define OV7725_GAM5 0x82 +#define OV7725_GAM6 0x83 +#define OV7725_GAM7 0x84 +#define OV7725_GAM8 0x85 +#define OV7725_GAM9 0x86 +#define OV7725_GAM10 0x87 +#define OV7725_GAM11 0x88 +#define OV7725_GAM12 0x89 +#define OV7725_GAM13 0x8A +#define OV7725_GAM14 0x8B +#define OV7725_GAM15 0x8C +#define OV7725_SLOP 0x8D +#define OV7725_DNSTh 0x8E +#define OV7725_EDGE0 0x8F +#define OV7725_EDGE1 0x90 +#define OV7725_DNSOff 0x91 +#define OV7725_EDGE2 0x92 +#define OV7725_EDGE3 0x93 +#define OV7725_MTX1 0x94 +#define OV7725_MTX2 0x95 +#define OV7725_MTX3 0x96 +#define OV7725_MTX4 0x97 +#define OV7725_MTX5 0x98 +#define OV7725_MTX6 0x99 +#define OV7725_MTX_Ctrl 0x9A +#define OV7725_BRIGHT 0x9B +#define OV7725_CNST 0x9C +#define OV7725_UVADJ0 0x9E +#define OV7725_UVADJ1 0x9F +#define OV7725_SCAL0 0xA0 +#define OV7725_SCAL1 0xA1 +#define OV7725_SCAL2 0xA2 +#define OV7725_SDE 0xA6 +#define OV7725_USAT 0xA7 +#define OV7725_VSAT 0xA8 +#define OV7725_HUECOS 0xA9 +#define OV7725_HUESIN 0xAA +#define OV7725_SIGN 0xAB +#define OV7725_DSPAuto 0xAC + + +#define OV7725_DEV_ADD 0x42>>1 + + +//配置摄像头参数 +#define OV7725_W 160 //定义摄像头图像宽度 可设置参数 80 160 240 320 +#define OV7725_H 120 //定义摄像头图像高度 可设置参数 60 120 180 240 +#define OV7725_SIZE (OV7725_W * OV7725_H/8 ) //图像占用空间大小 +#define OV7725_DMA_NUM (OV7725_SIZE) //一副图像DMA采集次数 + + +//-------------------------------------------------------------------------------------------------- +//引脚配置 +//-------------------------------------------------------------------------------------------------- +#define OV7725_VSYNC_PIN ERU_CH3_REQ6_P02_0 //场中断引脚 可选范围参考ERU_PIN_enum枚举 不可与像素引脚选择为同一个通道,或者是共用中断的通道 + //例如场中断选择ERU_CH3 那么像素引脚就不能选择ERU_CH7,因为3和7的中断是共用的。 + +#define OV7725_DATA_PIN P00_0 //定义D0数据引脚 假设D0定义为P00_0 那么D1所使用的引脚则为P00_1,依次类推 + //可设置参数P00_0、P02_0、P15_0,不能设置为其他参数 + +#define OV7725_PCLK_PIN ERU_CH2_REQ14_P02_1 //定义像素时钟引脚 可选范围参考ERU_PIN_enum枚举 不可与场中断引脚选择为同一个通道,或者是共用中断的通道 + //例如场中断选择ERU_CH3 那么像素引脚就不能选择ERU_CH7,因为3和7的中断是共用的。 + +#define OV7725_DMA_CH IfxDma_ChannelId_5 //定义使用的DMA通道 0-47可选 通道号越大优先级越低 + //修改此处之后,需要修改对应的ERU中断优先级,例如此处设置为IfxDma_ChannelId_5则对应的ERU中断优先级应该设置为5 + + + +extern uint8 image_bin[OV7725_H][OV7725_W/8]; //定义存储接收图像的数组 +extern uint8 image_dec[OV7725_H][OV7725_W]; //图像解压后的数组 + +extern uint8 ov7725_finish_flag; //图像采集完成标志位 + + +//函数声明 +uint8 ov7725_init(void); +void ov7725_vsync(void); +void ov7725_dma(void); +void image_decompression(uint8 *data1,uint8 *data2); +void seekfree_sendimg_7725(UARTN_enum uartn); + + + +#endif + + + diff --git a/Example/3-PIT_Demo/Libraries/seekfree_peripheral/SEEKFREE_ICM20602.c b/Example/3-PIT_Demo/Libraries/seekfree_peripheral/SEEKFREE_ICM20602.c index 095f9e3..5d167c9 100644 --- a/Example/3-PIT_Demo/Libraries/seekfree_peripheral/SEEKFREE_ICM20602.c +++ b/Example/3-PIT_Demo/Libraries/seekfree_peripheral/SEEKFREE_ICM20602.c @@ -68,6 +68,7 @@ void icm20602_self1_check(void) //------------------------------------------------------------------------------------------------------------------- void icm20602_init(void) { + simiic_init(); systick_delay_ms(STM0, 10); //上电延时 //检测 diff --git a/Example/3-PIT_Demo/Libraries/seekfree_peripheral/SEEKFREE_IIC.c b/Example/3-PIT_Demo/Libraries/seekfree_peripheral/SEEKFREE_IIC.c index 196fd57..f56a41a 100644 --- a/Example/3-PIT_Demo/Libraries/seekfree_peripheral/SEEKFREE_IIC.c +++ b/Example/3-PIT_Demo/Libraries/seekfree_peripheral/SEEKFREE_IIC.c @@ -50,7 +50,7 @@ uint8 IIC_num; // -static uint16 simiic_delay_time=100; //ICM等传感器应设置为100 +static uint16 simiic_delay_time = SIMIIC_DELAY_TIME; //ICM等传感器应设置为20 //------------------------------------------------------------------------------------------------------------------- diff --git a/Example/3-PIT_Demo/Libraries/seekfree_peripheral/SEEKFREE_IIC.h b/Example/3-PIT_Demo/Libraries/seekfree_peripheral/SEEKFREE_IIC.h index 293a02a..6a9c1e3 100644 --- a/Example/3-PIT_Demo/Libraries/seekfree_peripheral/SEEKFREE_IIC.h +++ b/Example/3-PIT_Demo/Libraries/seekfree_peripheral/SEEKFREE_IIC.h @@ -34,8 +34,12 @@ -#define SEEKFREE_SCL P13_0 //定义SCL引脚 可任意更改为其他IO -#define SEEKFREE_SDA P13_1 //定义SDA引脚 可任意更改为其他IO +#define SEEKFREE_SCL P02_3 //定义SCL引脚 可任意更改为其他IO +#define SEEKFREE_SDA P02_2 //定义SDA引脚 可任意更改为其他IO + + +#define SIMIIC_DELAY_TIME 20 + typedef enum IIC //DAC模块 { diff --git a/Example/3-PIT_Demo/Libraries/seekfree_peripheral/SEEKFREE_L3G4200D.c b/Example/3-PIT_Demo/Libraries/seekfree_peripheral/SEEKFREE_L3G4200D.c index 0f0c23a..5deb7d3 100644 --- a/Example/3-PIT_Demo/Libraries/seekfree_peripheral/SEEKFREE_L3G4200D.c +++ b/Example/3-PIT_Demo/Libraries/seekfree_peripheral/SEEKFREE_L3G4200D.c @@ -65,6 +65,7 @@ void l3g4200d_self_check(void) //------------------------------------------------------------------------------------------------------------------- void l3g4200d_init(void) { + simiic_init(); systick_delay_ms(STM0, 50); l3g4200d_self_check(); diff --git a/Example/3-PIT_Demo/Libraries/seekfree_peripheral/SEEKFREE_MMA8451.c b/Example/3-PIT_Demo/Libraries/seekfree_peripheral/SEEKFREE_MMA8451.c index c200427..8a5eec4 100644 --- a/Example/3-PIT_Demo/Libraries/seekfree_peripheral/SEEKFREE_MMA8451.c +++ b/Example/3-PIT_Demo/Libraries/seekfree_peripheral/SEEKFREE_MMA8451.c @@ -68,6 +68,7 @@ void mma8451_self_check(void) //------------------------------------------------------------------------------------------------------------------- uint8 mma845x_init(void) { + simiic_init(); systick_delay_ms(STM0, 50); mma8451_self_check(); diff --git a/Example/3-PIT_Demo/Libraries/seekfree_peripheral/SEEKFREE_MPU6050.c b/Example/3-PIT_Demo/Libraries/seekfree_peripheral/SEEKFREE_MPU6050.c index 0317aa0..686550d 100644 --- a/Example/3-PIT_Demo/Libraries/seekfree_peripheral/SEEKFREE_MPU6050.c +++ b/Example/3-PIT_Demo/Libraries/seekfree_peripheral/SEEKFREE_MPU6050.c @@ -71,6 +71,7 @@ void mpu6050_self1_check(void) //------------------------------------------------------------------------------------------------------------------- void mpu6050_init(void) { + simiic_init(); systick_delay_ms(STM0, 100); //上电延时 mpu6050_self1_check(); diff --git a/Example/3-PIT_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.c b/Example/3-PIT_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.c index 014b435..05f181f 100644 --- a/Example/3-PIT_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.c +++ b/Example/3-PIT_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.c @@ -38,7 +38,6 @@ #include "zf_gpio.h" #include "zf_eru.h" #include "zf_eru_dma.h" -#include "stdio.h" #include "SEEKFREE_MT9V03X.h" @@ -49,6 +48,8 @@ uint8 receive[3]; uint8 receive_num = 0; vuint8 uart_receive_flag; +uint8 link_list_num; + //需要配置到摄像头的数据 int16 MT9V03X_CFG[CONFIG_FINISH][2]= { @@ -305,7 +306,7 @@ void mt9v03x_init(void) gpio_init((PIN_enum)(MT9V03X_DATA_PIN+i), GPI, 0, PULLUP); } - eru_dma_init(MT9V03X_DMA_CH, GET_PORT_IN_ADDR(MT9V03X_DATA_PIN), mt9v03x_image[0], MT9V03X_PCLK_PIN, RISING, MT9V03X_W); + link_list_num = eru_dma_init(MT9V03X_DMA_CH, GET_PORT_IN_ADDR(MT9V03X_DATA_PIN), mt9v03x_image[0], MT9V03X_PCLK_PIN, RISING, MT9V03X_W*MT9V03X_H); eru_init(MT9V03X_VSYNC_PIN, FALLING); //初始化场中断,并设置为下降沿触发中断 restoreInterrupts(interrupt_state); @@ -313,7 +314,6 @@ void mt9v03x_init(void) uint8 mt9v03x_finish_flag = 0; //一场图像采集完成标志位 -uint8 now_col; //当前正在采集的行 //------------------------------------------------------------------------------------------------------------------- // @brief MT9V03X摄像头场中断 // @param NULL @@ -324,16 +324,15 @@ uint8 now_col; // void mt9v03x_vsync(void) { CLEAR_GPIO_FLAG(MT9V03X_VSYNC_PIN); - now_col = 0; + if(!mt9v03x_finish_flag)//查看图像数组是否使用完毕,如果未使用完毕则不开始采集,避免出现访问冲突 { - DMA_SET_DESTINATION(MT9V03X_DMA_CH, (void *)&mt9v03x_image[0]); dma_start(MT9V03X_DMA_CH); } } - +uint8 mt9v03x_dma_int_num; //当前DMA中断次数 //------------------------------------------------------------------------------------------------------------------- // @brief MT9V03X摄像头DMA完成中断 // @param NULL @@ -344,16 +343,15 @@ void mt9v03x_vsync(void) void mt9v03x_dma(void) { CLEAR_DMA_FLAG(MT9V03X_DMA_CH); + mt9v03x_dma_int_num++; - now_col++; - - if(MT9V03X_H > now_col) - { - dma_start(MT9V03X_DMA_CH); - } - else + if(mt9v03x_dma_int_num >= link_list_num) { + //采集完成 + mt9v03x_dma_int_num = 0; mt9v03x_finish_flag = 1;//一副图像从采集开始到采集结束耗时3.8MS左右(50FPS、188*120分辨率) + dma_stop(MT9V03X_DMA_CH); + } } diff --git a/Example/3-PIT_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.h b/Example/3-PIT_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.h index a29edd2..0c8a785 100644 --- a/Example/3-PIT_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.h +++ b/Example/3-PIT_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.h @@ -63,9 +63,7 @@ //例如场中断选择ERU_CH3 那么像素引脚就不能选择ERU_CH7,因为3和7的中断是共用的。 #define MT9V03X_DMA_CH IfxDma_ChannelId_5 //定义使用的DMA通道 0-47可选 通道号越大优先级越低 - //修改此处之后,需要修改对应的ERU中断优先级,例如此处设置为IfxDma_ChannelId_5则对应的ERU中断优先级应该设置为5 - - + //摄像头命令枚举 typedef enum { diff --git a/Example/3-PIT_Demo/USER/isr.c b/Example/3-PIT_Demo/USER/isr.c index 2c22bb6..c6376b0 100644 --- a/Example/3-PIT_Demo/USER/isr.c +++ b/Example/3-PIT_Demo/USER/isr.c @@ -22,13 +22,9 @@ #include "isr.h" //PIT中断函数 示例 - -uint16 time; IFX_INTERRUPT(cc60_pit_ch0_isr, CCU6_0_CH0_INT_SERVICE, CCU6_0_CH0_ISR_PRIORITY) { PIT_CLEAR_FLAG(CCU6_0, PIT_CH0); - time++; - printf("pit count: %d\n", time); } @@ -102,7 +98,8 @@ IFX_INTERRUPT(eru_ch3_ch7_isr, ERU_CH3_CH7_INT_SERVICE, ERU_CH3_CH7_INT_PRIO) if(GET_GPIO_FLAG(ERU_CH3_REQ6_P02_0))//通道3中断 { CLEAR_GPIO_FLAG(ERU_CH3_REQ6_P02_0); - if(1 == camera_type)mt9v03x_vsync(); + if (1 == camera_type) mt9v03x_vsync(); + else if (3 == camera_type) ov7725_vsync(); } if(GET_GPIO_FLAG(ERU_CH7_REQ16_P15_1))//通道7中断 @@ -117,7 +114,8 @@ IFX_INTERRUPT(eru_ch3_ch7_isr, ERU_CH3_CH7_INT_SERVICE, ERU_CH3_CH7_INT_PRIO) IFX_INTERRUPT(dma_ch5_isr, ERU_DMA_INT_SERVICE, ERU_DMA_INT_PRIO) { - if(1 == camera_type) mt9v03x_dma(); + if (1 == camera_type) mt9v03x_dma(); + else if (3 == camera_type) ov7725_dma(); } diff --git a/Example/4-Encoder_Demo/Libraries/doc/version.txt b/Example/4-Encoder_Demo/Libraries/doc/version.txt index b85cd50..a42bc58 100644 --- a/Example/4-Encoder_Demo/Libraries/doc/version.txt +++ b/Example/4-Encoder_Demo/Libraries/doc/version.txt @@ -1,9 +1,17 @@ V1.0.0 - 初始版本 + 初始版本 V1.0.1 对总钻风摄像头的场中断进行修改,判断标志位为0才采集下一幅图像,避免出现访问冲突 修改SPI初始化中的错误,引用了固定的SPI2基地址 修复STM中无法使用STM1的问题 - 修复gtm pwm中最大占空比只有GTM_ATOM0_PWM_DUTY_MAX设置有效的问题 \ No newline at end of file + 修复gtm pwm中最大占空比只有GTM_ATOM0_PWM_DUTY_MAX设置有效的问题 + +V1.0.2 + 修改模拟IIC默认延时时间为20 + 添加 需要特别注意P20_2是不能用于输出的,仅仅只有输入的功能 注意事项 + 将摄像头采集DMA改为link传输,可以大大降低DMA中断次数 + 修改默认的软件IIC引脚定义 + 将6050等 需要用到软件IIC的模块,在初始化函数中默认调用模拟IIC初始化 + 添加小钻风驱动程序 \ No newline at end of file diff --git a/Example/4-Encoder_Demo/Libraries/seekfree_libraries/common/common.c b/Example/4-Encoder_Demo/Libraries/seekfree_libraries/common/common.c index 0460d15..ac42b19 100644 --- a/Example/4-Encoder_Demo/Libraries/seekfree_libraries/common/common.c +++ b/Example/4-Encoder_Demo/Libraries/seekfree_libraries/common/common.c @@ -22,7 +22,7 @@ #include "SysSe/Bsp/Bsp.h" #include "common.h" -uint8 camera_type; +uint8 camera_type; //摄像头型号 1:总钻风 2:凌瞳(暂未支持)3:小钻风 diff --git a/Example/4-Encoder_Demo/Libraries/seekfree_libraries/common/common.h b/Example/4-Encoder_Demo/Libraries/seekfree_libraries/common/common.h index fe7ec63..13d03cd 100644 --- a/Example/4-Encoder_Demo/Libraries/seekfree_libraries/common/common.h +++ b/Example/4-Encoder_Demo/Libraries/seekfree_libraries/common/common.h @@ -111,7 +111,7 @@ typedef enum //枚 #include -extern uint8 camera_type; +extern uint8 camera_type; //摄像头型号 1:总钻风 2:凌瞳(暂未支持)3:小钻风 void get_clk(void); diff --git a/Example/4-Encoder_Demo/Libraries/seekfree_libraries/headfile.h b/Example/4-Encoder_Demo/Libraries/seekfree_libraries/headfile.h index 0e8024f..e11bd83 100644 --- a/Example/4-Encoder_Demo/Libraries/seekfree_libraries/headfile.h +++ b/Example/4-Encoder_Demo/Libraries/seekfree_libraries/headfile.h @@ -62,6 +62,7 @@ #include "SEEKFREE_L3G4200D.h" #include "SEEKFREE_WIRELESS.h" #include "SEEKFREE_IPS200_PARALLEL8.h" +#include "SEEKFREE_7725.h" #endif diff --git a/Example/4-Encoder_Demo/Libraries/seekfree_libraries/zf_eru_dma.c b/Example/4-Encoder_Demo/Libraries/seekfree_libraries/zf_eru_dma.c index f7aab10..86c0158 100644 --- a/Example/4-Encoder_Demo/Libraries/seekfree_libraries/zf_eru_dma.c +++ b/Example/4-Encoder_Demo/Libraries/seekfree_libraries/zf_eru_dma.c @@ -21,9 +21,18 @@ #include "IfxDma_Dma.h" #include "IfxScuEru.h" #include "isr_config.h" +#include "zf_assert.h" #include "zf_eru_dma.h" +typedef struct +{ + Ifx_DMA_CH IFX_ALIGN(256) linked_list[8];//DMA链表 + IfxDma_Dma_Channel channel; //DMA通道句柄 +}DMA_LINK; + + +DMA_LINK dma_link_list; //------------------------------------------------------------------------------------------------------------------- // @brief eru触发dma初始化 @@ -36,7 +45,7 @@ // @return void // Sample usage: //------------------------------------------------------------------------------------------------------------------- -void eru_dma_init(IfxDma_ChannelId dma_ch, uint8 *source_addr, uint8 *destination_addr, ERU_PIN_enum eru_pin, TRIGGER_enum trigger, uint16 dma_count) +uint8 eru_dma_init(IfxDma_ChannelId dma_ch, uint8 *source_addr, uint8 *destination_addr, ERU_PIN_enum eru_pin, TRIGGER_enum trigger, uint16 dma_count) { IfxDma_Dma_Channel dmaChn; //eru触发DMA通道号 在eru文件中设置eru的优先级,即为触发的通道 @@ -51,27 +60,85 @@ void eru_dma_init(IfxDma_ChannelId dma_ch, uint8 *source_addr, uint8 *destinatio IfxDma_Dma_ChannelConfig cfg; IfxDma_Dma_initChannelConfig(&cfg, &dma); - cfg.transferCount = dma_count; + uint8 list_num, i; + uint16 single_channel_dma_count; + + ZF_ASSERT(!(dma_count%8));//传输次数必须为8的倍数 + + + list_num = 1; + single_channel_dma_count = dma_count / list_num; + if(16384 < single_channel_dma_count) + { + while(TRUE) + { + single_channel_dma_count = dma_count / list_num; + if((single_channel_dma_count <= 16384) && !(dma_count % list_num)) + { + break; + } + list_num++; + if(list_num > 8) ZF_ASSERT(FALSE); + } + } + + + if(1 == list_num) + { + cfg.shadowControl = IfxDma_ChannelShadow_none; + cfg.operationMode = IfxDma_ChannelOperationMode_single; + cfg.shadowAddress = 0; + } + else + { + cfg.shadowControl = IfxDma_ChannelShadow_linkedList; + cfg.operationMode = IfxDma_ChannelOperationMode_continuous; + cfg.shadowAddress = IFXCPU_GLB_ADDR_DSPR(IfxCpu_getCoreId(), (unsigned)&dma_link_list.linked_list[1]); + } + cfg.requestMode = IfxDma_ChannelRequestMode_oneTransferPerRequest; cfg.moveSize = IfxDma_ChannelMoveSize_8bit; + cfg.busPriority = IfxDma_ChannelBusPriority_high; - cfg.busPriority = IfxDma_ChannelBusPriority_high; - - cfg.sourceAddress = (unsigned)(source_addr); + cfg.sourceAddress = IFXCPU_GLB_ADDR_DSPR(IfxCpu_getCoreId(), source_addr); cfg.sourceAddressCircularRange = IfxDma_ChannelIncrementCircular_none; cfg.sourceCircularBufferEnabled = TRUE; - cfg.destinationAddress = IFXCPU_GLB_ADDR_DSPR(IfxCpu_getCoreId(), destination_addr); cfg.destinationAddressIncrementStep = IfxDma_ChannelIncrementStep_1; - cfg.operationMode = IfxDma_ChannelOperationMode_single; - cfg.channelId = (IfxDma_ChannelId)dma_ch; - cfg.hardwareRequestEnabled = TRUE; - cfg.channelInterruptEnabled = TRUE; + cfg.channelId = (IfxDma_ChannelId)dma_ch; + cfg.hardwareRequestEnabled = FALSE; + cfg.channelInterruptEnabled = TRUE; cfg.channelInterruptPriority = ERU_DMA_INT_PRIO; cfg.channelInterruptTypeOfService = (IfxSrc_Tos)ERU_DMA_INT_SERVICE; + + + cfg.destinationAddress = IFXCPU_GLB_ADDR_DSPR(IfxCpu_getCoreId(), destination_addr); + + cfg.transferCount = single_channel_dma_count; + IfxDma_Dma_initChannel(&dmaChn, &cfg); + + if(1 < list_num) + { + i = 0; + while(i < list_num) + { + cfg.destinationAddress = IFXCPU_GLB_ADDR_DSPR(IfxCpu_getCoreId(), destination_addr + single_channel_dma_count * i); + if(i == (list_num - 1)) cfg.shadowAddress = IFXCPU_GLB_ADDR_DSPR(IfxCpu_getCoreId(), (unsigned)&dma_link_list.linked_list[0]); + else cfg.shadowAddress = IFXCPU_GLB_ADDR_DSPR(IfxCpu_getCoreId(), (unsigned)&dma_link_list.linked_list[i+1]); + cfg.transferCount = single_channel_dma_count; + + IfxDma_Dma_initLinkedListEntry((void *)&dma_link_list.linked_list[i], &cfg); + i++; + } + } + + + IfxDma_Dma_getSrcPointer(&dma_link_list.channel)->B.CLRR = 1; + + return list_num; } diff --git a/Example/4-Encoder_Demo/Libraries/seekfree_libraries/zf_eru_dma.h b/Example/4-Encoder_Demo/Libraries/seekfree_libraries/zf_eru_dma.h index 50667ad..faef169 100644 --- a/Example/4-Encoder_Demo/Libraries/seekfree_libraries/zf_eru_dma.h +++ b/Example/4-Encoder_Demo/Libraries/seekfree_libraries/zf_eru_dma.h @@ -29,9 +29,9 @@ #define CLEAR_DMA_FLAG(dma_ch) IfxDma_clearChannelInterrupt(&MODULE_DMA, dma_ch); -#define DMA_SET_DESTINATION(dma_ch, destination_addr) IfxDma_setChannelDestinationAddress(&MODULE_DMA, dma_ch, (void *)destination_addr) +#define DMA_SET_DESTINATION(dma_ch, destination_addr) IfxDma_setChannelDestinationAddress(&MODULE_DMA, dma_ch, (void *)IFXCPU_GLB_ADDR_DSPR(IfxCpu_getCoreId(), destination_addr)) -void eru_dma_init(IfxDma_ChannelId dma_ch, uint8 *source_addr, uint8 *destination_addr, ERU_PIN_enum eru_pin, TRIGGER_enum trigger, uint16 dma_count); +uint8 eru_dma_init(IfxDma_ChannelId dma_ch, uint8 *source_addr, uint8 *destination_addr, ERU_PIN_enum eru_pin, TRIGGER_enum trigger, uint16 dma_count); void dma_stop(IfxDma_ChannelId dma_ch); void dma_start(IfxDma_ChannelId dma_ch); diff --git a/Example/4-Encoder_Demo/Libraries/seekfree_libraries/zf_gpio.c b/Example/4-Encoder_Demo/Libraries/seekfree_libraries/zf_gpio.c index 3c937cf..1d2466c 100644 --- a/Example/4-Encoder_Demo/Libraries/seekfree_libraries/zf_gpio.c +++ b/Example/4-Encoder_Demo/Libraries/seekfree_libraries/zf_gpio.c @@ -60,6 +60,7 @@ Ifx_P* get_port(PIN_enum pin) // @param pinmode 引脚配置(可设置参数由zf_gpio.h文件内GPIOMODE_enum枚举值确定) // @return void // Sample usage: gpio_init(P00_0, GPO, 1, PUSHPULL);//P00_0初始化为GPIO功能、输出模式、输出高电平、推挽输出 +// @note 需要特别注意P20_2是不能用于输出的,仅仅只有输入的功能 //------------------------------------------------------------------------------------------------------------------- void gpio_init(PIN_enum pin, GPIODIR_enum dir, uint8 dat, GPIOMODE_enum pinmode) { diff --git a/Example/4-Encoder_Demo/Libraries/seekfree_libraries/zf_gpio.h b/Example/4-Encoder_Demo/Libraries/seekfree_libraries/zf_gpio.h index cfbd666..e3d144f 100644 --- a/Example/4-Encoder_Demo/Libraries/seekfree_libraries/zf_gpio.h +++ b/Example/4-Encoder_Demo/Libraries/seekfree_libraries/zf_gpio.h @@ -38,6 +38,15 @@ typedef enum // 枚 #define GET_PORT_IN_ADDR(pin) (uint8 *)(&IfxPort_getAddress((IfxPort_Index)(pin/32))->IN + pin%32/8) + + +//需要特别注意P20_2是不能用于输出的,仅仅只有输入的功能 +//需要特别注意P20_2是不能用于输出的,仅仅只有输入的功能 +//需要特别注意P20_2是不能用于输出的,仅仅只有输入的功能 + + + + //------------------------------------------------------ //通用GPIO操作 void gpio_init(PIN_enum pin, GPIODIR_enum dir, uint8 dat, GPIOMODE_enum pinconf); diff --git a/Example/4-Encoder_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.c b/Example/4-Encoder_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.c new file mode 100644 index 0000000..806b8d9 --- /dev/null +++ b/Example/4-Encoder_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.c @@ -0,0 +1,262 @@ +/********************************************************************************************************************* + * COPYRIGHT NOTICE + * Copyright (c) 2020,逐飞科技 + * All rights reserved. + * 技术讨论QQ群:三群:824575535 + * + * 以下所有内容版权均属逐飞科技所有,未经允许不得用于商业用途, + * 欢迎各位使用并传播本程序,修改内容时必须保留逐飞科技的版权声明。 + * + * @file main + * @company 成都逐飞科技有限公司 + * @author 逐飞科技(QQ3184284598) + * @version 查看doc内version文件 版本说明 + * @Software tasking v6.3r1 + * @Target core TC264D + * @Taobao https://seekfree.taobao.com/ + * @date 2020-3-23 + * @note + 接线定义: + ------------------------------------ + 模块管脚 单片机管脚 + SDA 查看SEEKFREE_IIC文件内的SEEKFREE_SDA宏定义 + SCL 查看SEEKFREE_IIC文件内的SEEKFREE_SCL宏定义 + 场中断(VSY) 查看SEEKFREE_OV7725.h文件中的OV7725_VSYNC_PIN宏定义 + 行中断(HREF) 未使用,因此不接 + 像素中断(PCLK) 查看SEEKFREE_OV7725.h文件中的OV7725_PCLK_PIN宏定义 + 数据口(D0-D7) 查看SEEKFREE_OV7725.h文件中的OV7725_DATA_PIN宏定义 + ------------------------------------ + + 默认分辨率是 160*120 + 默认FPS 50帧 + ********************************************************************************************************************/ + + +#include "IfxDma.h" +#include "IfxScuEru.h" +#include "zf_stm_systick.h" +#include "zf_gpio.h" +#include "zf_eru.h" +#include "zf_eru_dma.h" +#include "SEEKFREE_IIC.h" +#include "SEEKFREE_7725.h" + + + +IFX_ALIGN(4) uint8 image_bin[OV7725_H][OV7725_W/8]; //定义存储接收图像的数组 +uint8 image_dec[OV7725_H][OV7725_W]; + +uint8 ov7725_idcode = 0; + +//------------------------------------------------------------------------------------------------------------------- +// @brief 小钻风摄像头内部寄存器初始化(内部使用,用户无需调用) +// @param NULL +// @return uint8 返回0则出错,返回1则成功 +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +uint8 ov7725_reg_init(void) +{ + simiic_delay_set(500); + simiic_write_reg ( OV7725_DEV_ADD, OV7725_COM7, 0x80 ); //复位摄像头 + systick_delay_ms(STM0, 50); + ov7725_idcode = simiic_read_reg( OV7725_DEV_ADD, OV7725_VER ,SCCB); + if( ov7725_idcode != OV7725_ID ) return 0; //校验摄像头ID号 + + //ID号确认无误 然后配置寄存器 + simiic_write_reg(OV7725_DEV_ADD, OV7725_COM4 , 0xC1); + simiic_write_reg(OV7725_DEV_ADD, OV7725_CLKRC , 0x01); + simiic_write_reg(OV7725_DEV_ADD, OV7725_COM2 , 0x03); + simiic_write_reg(OV7725_DEV_ADD, OV7725_COM3 , 0xD0); + simiic_write_reg(OV7725_DEV_ADD, OV7725_COM7 , 0x40); + simiic_write_reg(OV7725_DEV_ADD, OV7725_COM8 , 0xCE); //0xCE:关闭自动曝光 0xCF:开启自动曝光 + simiic_write_reg(OV7725_DEV_ADD, OV7725_HSTART , 0x3F); + simiic_write_reg(OV7725_DEV_ADD, OV7725_HSIZE , 0x50); + simiic_write_reg(OV7725_DEV_ADD, OV7725_VSTRT , 0x03); + simiic_write_reg(OV7725_DEV_ADD, OV7725_VSIZE , 0x78); + simiic_write_reg(OV7725_DEV_ADD, OV7725_HREF , 0x00); + simiic_write_reg(OV7725_DEV_ADD, OV7725_SCAL0 , 0x0A); + simiic_write_reg(OV7725_DEV_ADD, OV7725_AWB_Ctrl0 , 0xE0); + simiic_write_reg(OV7725_DEV_ADD, OV7725_DSPAuto , 0xff); + simiic_write_reg(OV7725_DEV_ADD, OV7725_DSP_Ctrl2 , 0x0C); + simiic_write_reg(OV7725_DEV_ADD, OV7725_DSP_Ctrl3 , 0x00); + simiic_write_reg(OV7725_DEV_ADD, OV7725_DSP_Ctrl4 , 0x00); + + if(OV7725_W == 80) simiic_write_reg(OV7725_DEV_ADD, OV7725_HOutSize , 0x14); + else if(OV7725_W == 160) simiic_write_reg(OV7725_DEV_ADD, OV7725_HOutSize , 0x28); + else if(OV7725_W == 240) simiic_write_reg(OV7725_DEV_ADD, OV7725_HOutSize , 0x3c); + else if(OV7725_W == 320) simiic_write_reg(OV7725_DEV_ADD, OV7725_HOutSize , 0x50); + + if(OV7725_H == 60) simiic_write_reg(OV7725_DEV_ADD, OV7725_VOutSize , 0x1E); + else if(OV7725_H == 120) simiic_write_reg(OV7725_DEV_ADD, OV7725_VOutSize , 0x3c); + else if(OV7725_H == 180) simiic_write_reg(OV7725_DEV_ADD, OV7725_VOutSize , 0x5a); + else if(OV7725_H == 240) simiic_write_reg(OV7725_DEV_ADD, OV7725_VOutSize , 0x78); + + simiic_write_reg(OV7725_DEV_ADD, OV7725_REG28 , 0x01); + simiic_write_reg(OV7725_DEV_ADD, OV7725_EXHCH , 0x10); + simiic_write_reg(OV7725_DEV_ADD, OV7725_EXHCL , 0x1F); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM1 , 0x0c); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM2 , 0x16); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM3 , 0x2a); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM4 , 0x4e); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM5 , 0x61); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM6 , 0x6f); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM7 , 0x7b); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM8 , 0x86); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM9 , 0x8e); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM10 , 0x97); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM11 , 0xa4); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM12 , 0xaf); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM13 , 0xc5); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM14 , 0xd7); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM15 , 0xe8); + simiic_write_reg(OV7725_DEV_ADD, OV7725_SLOP , 0x20); + simiic_write_reg(OV7725_DEV_ADD, OV7725_LC_RADI , 0x00); + simiic_write_reg(OV7725_DEV_ADD, OV7725_LC_COEF , 0x13); + simiic_write_reg(OV7725_DEV_ADD, OV7725_LC_XC , 0x08); + simiic_write_reg(OV7725_DEV_ADD, OV7725_LC_COEFB , 0x14); + simiic_write_reg(OV7725_DEV_ADD, OV7725_LC_COEFR , 0x17); + simiic_write_reg(OV7725_DEV_ADD, OV7725_LC_CTR , 0x05); + simiic_write_reg(OV7725_DEV_ADD, OV7725_BDBase , 0x99); + simiic_write_reg(OV7725_DEV_ADD, OV7725_BDMStep , 0x03); + simiic_write_reg(OV7725_DEV_ADD, OV7725_SDE , 0x04); + simiic_write_reg(OV7725_DEV_ADD, OV7725_BRIGHT , 0x00); + simiic_write_reg(OV7725_DEV_ADD, OV7725_CNST , 0x40); + simiic_write_reg(OV7725_DEV_ADD, OV7725_SIGN , 0x06); + simiic_write_reg(OV7725_DEV_ADD, OV7725_UVADJ0 , 0x11); + simiic_write_reg(OV7725_DEV_ADD, OV7725_UVADJ1 , 0x02); + + + simiic_delay_set(SIMIIC_DELAY_TIME);//修改为默认的20 + return 1; + + +} + + + + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 小钻风摄像头采集程序初始化(内部使用,用户无需调用) +// @param NULL +// @return void +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +void ov7725_port_init(void) +{ + uint8 i; + camera_type = 3;//设置连接摄像头类型 + + //摄像头采集初始化 + //初始化 数据引脚 + for(i=0; i<8; i++) + { + gpio_init((PIN_enum)(OV7725_DATA_PIN+i), GPI, 0, PULLUP); + } + eru_dma_init(OV7725_DMA_CH, GET_PORT_IN_ADDR(OV7725_DATA_PIN), image_bin[0], OV7725_PCLK_PIN, FALLING, OV7725_DMA_NUM); + eru_init(OV7725_VSYNC_PIN, FALLING); //初始化场中断,并设置为下降沿触发中断 + +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 小钻风摄像头初始化(调用之后设置好相关中断函数即可采集图像) +// @param NULL +// @return 0 +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +uint8 ov7725_init(void) +{ + simiic_init(); + ov7725_reg_init(); //摄像头寄存器配置 + ov7725_port_init(); //摄像头中断引脚及DMA配置 + return 0; +} + + + + +uint8 ov7725_finish_flag = 0; +//------------------------------------------------------------------------------------------------------------------- +// @brief 小钻风摄像头场中断 +// @param NULL +// @return void +// @since v1.0 +// Sample usage: 此函数在isr.c中被eru(GPIO中断)中断调用 +//------------------------------------------------------------------------------------------------------------------- +void ov7725_vsync(void) +{ + CLEAR_GPIO_FLAG(OV7725_VSYNC_PIN); + + if(!ov7725_finish_flag)//查看图像数组是否使用完毕,如果未使用完毕则不开始采集,避免出现访问冲突 + { + DMA_SET_DESTINATION(OV7725_DMA_CH, image_bin[0]); + dma_start(OV7725_DMA_CH); + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 小钻风摄像头DMA完成中断 +// @param NULL +// @return void +// @since v1.0 +// Sample usage: 此函数在isr.c中被dma中断调用 +//------------------------------------------------------------------------------------------------------------------- +void ov7725_dma(void) +{ + CLEAR_DMA_FLAG(OV7725_DMA_CH); + ov7725_finish_flag = 1; + dma_stop(OV7725_DMA_CH); +} + + + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 小钻风摄像头数据解压函数 +// @param *data1 源地址 +// @param *data2 目的地址 +// @return void +// @since v1.0 +// Sample usage: Image_Decompression(da1,dat2[0]);//将一维数组dat1的内容解压到二维数组dat2里. +//------------------------------------------------------------------------------------------------------------------- +void image_decompression(uint8 *data1,uint8 *data2) +{ + uint8 temp[2] = {0,255}; + uint16 lenth = OV7725_SIZE; + uint8 i = 8; + + + while(lenth--) + { + i = 8; + while(i--) + { + *data2++ = temp[(*data1 >> i) & 0x01]; + } + data1++; + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 小钻风摄像头未解压图像发送至上位机查看图像 +// @param *imgaddr 压缩图像数据地址 +// @param *imgsize 图像大小(直接填写OV7725_SIZE) +// @return void +// @since v1.0 +// Sample usage: 调用该函数前请先初始化uart2 +//------------------------------------------------------------------------------------------------------------------- +void seekfree_sendimg_7725(UARTN_enum uartn) +{ + uart_putchar(uartn, 0x00);uart_putchar(uartn, 0xff);uart_putchar(uartn, 0x01);uart_putchar(uartn, 0x01);//发送四个字节命令 + uart_putbuff(uartn, image_bin[0], OV7725_SIZE); //再发送图像 +} + + + + diff --git a/Example/4-Encoder_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.h b/Example/4-Encoder_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.h new file mode 100644 index 0000000..e513250 --- /dev/null +++ b/Example/4-Encoder_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.h @@ -0,0 +1,243 @@ +/********************************************************************************************************************* + * COPYRIGHT NOTICE + * Copyright (c) 2020,逐飞科技 + * All rights reserved. + * 技术讨论QQ群:三群:824575535 + * + * 以下所有内容版权均属逐飞科技所有,未经允许不得用于商业用途, + * 欢迎各位使用并传播本程序,修改内容时必须保留逐飞科技的版权声明。 + * + * @file main + * @company 成都逐飞科技有限公司 + * @author 逐飞科技(QQ3184284598) + * @version 查看doc内version文件 版本说明 + * @Software tasking v6.3r1 + * @Target core TC264D + * @Taobao https://seekfree.taobao.com/ + * @date 2020-3-23 + * @note + 接线定义: + ------------------------------------ + 模块管脚 单片机管脚 + SDA 查看SEEKFREE_IIC文件内的SEEKFREE_SDA宏定义 + SCL 查看SEEKFREE_IIC文件内的SEEKFREE_SCL宏定义 + 场中断(VSY) 查看SEEKFREE_OV7725.h文件中的OV7725_VSYNC_PIN宏定义 + 行中断(HREF) 未使用,因此不接 + 像素中断(PCLK) 查看SEEKFREE_OV7725.h文件中的OV7725_PCLK_PIN宏定义 + 数据口(D0-D7) 查看SEEKFREE_OV7725.h文件中的OV7725_DATA_PIN宏定义 + ------------------------------------ + + 默认分辨率是 160*120 + 默认FPS 50帧 + ********************************************************************************************************************/ + + + +#ifndef _SEEKFREE_7725_h +#define _SEEKFREE_7725_h + +#include "common.h" +#include "IfxDma_cfg.h" +#include "zf_uart.h" + + +//摄像头ID号 +#define OV7725_ID 0x21 + +//摄像头寄存器 +#define OV7725_GAIN 0x00 +#define OV7725_BLUE 0x01 +#define OV7725_RED 0x02 +#define OV7725_GREEN 0x03 +#define OV7725_BAVG 0x05 +#define OV7725_GAVG 0x06 +#define OV7725_RAVG 0x07 +#define OV7725_AECH 0x08 +#define OV7725_COM2 0x09 +#define OV7725_PID 0x0A +#define OV7725_VER 0x0B +#define OV7725_COM3 0x0C +#define OV7725_COM4 0x0D +#define OV7725_COM5 0x0E +#define OV7725_COM6 0x0F +#define OV7725_AEC 0x10 +#define OV7725_CLKRC 0x11 +#define OV7725_COM7 0x12 +#define OV7725_COM8 0x13 +#define OV7725_COM9 0x14 +#define OV7725_COM10 0x15 +#define OV7725_REG16 0x16 +#define OV7725_HSTART 0x17 +#define OV7725_HSIZE 0x18 +#define OV7725_VSTRT 0x19 +#define OV7725_VSIZE 0x1A +#define OV7725_PSHFT 0x1B +#define OV7725_MIDH 0x1C +#define OV7725_MIDL 0x1D +#define OV7725_LAEC 0x1F +#define OV7725_COM11 0x20 +#define OV7725_BDBase 0x22 +#define OV7725_BDMStep 0x23 +#define OV7725_AEW 0x24 +#define OV7725_AEB 0x25 +#define OV7725_VPT 0x26 +#define OV7725_REG28 0x28 +#define OV7725_HOutSize 0x29 +#define OV7725_EXHCH 0x2A +#define OV7725_EXHCL 0x2B +#define OV7725_VOutSize 0x2C +#define OV7725_ADVFL 0x2D +#define OV7725_ADVFH 0x2E +#define OV7725_YAVE 0x2F +#define OV7725_LumHTh 0x30 +#define OV7725_LumLTh 0x31 +#define OV7725_HREF 0x32 +#define OV7725_DM_LNL 0x33 +#define OV7725_DM_LNH 0x34 +#define OV7725_ADoff_B 0x35 +#define OV7725_ADoff_R 0x36 +#define OV7725_ADoff_Gb 0x37 +#define OV7725_ADoff_Gr 0x38 +#define OV7725_Off_B 0x39 +#define OV7725_Off_R 0x3A +#define OV7725_Off_Gb 0x3B +#define OV7725_Off_Gr 0x3C +#define OV7725_COM12 0x3D +#define OV7725_COM13 0x3E +#define OV7725_COM14 0x3F +#define OV7725_COM16 0x41 +#define OV7725_TGT_B 0x42 +#define OV7725_TGT_R 0x43 +#define OV7725_TGT_Gb 0x44 +#define OV7725_TGT_Gr 0x45 +#define OV7725_LC_CTR 0x46 +#define OV7725_LC_XC 0x47 +#define OV7725_LC_YC 0x48 +#define OV7725_LC_COEF 0x49 +#define OV7725_LC_RADI 0x4A +#define OV7725_LC_COEFB 0x4B +#define OV7725_LC_COEFR 0x4C +#define OV7725_FixGain 0x4D +#define OV7725_AREF1 0x4F +#define OV7725_AREF6 0x54 +#define OV7725_UFix 0x60 +#define OV7725_VFix 0x61 +#define OV7725_AWBb_blk 0x62 +#define OV7725_AWB_Ctrl0 0x63 +#define OV7725_DSP_Ctrl1 0x64 +#define OV7725_DSP_Ctrl2 0x65 +#define OV7725_DSP_Ctrl3 0x66 +#define OV7725_DSP_Ctrl4 0x67 +#define OV7725_AWB_bias 0x68 +#define OV7725_AWBCtrl1 0x69 +#define OV7725_AWBCtrl2 0x6A +#define OV7725_AWBCtrl3 0x6B +#define OV7725_AWBCtrl4 0x6C +#define OV7725_AWBCtrl5 0x6D +#define OV7725_AWBCtrl6 0x6E +#define OV7725_AWBCtrl7 0x6F +#define OV7725_AWBCtrl8 0x70 +#define OV7725_AWBCtrl9 0x71 +#define OV7725_AWBCtrl10 0x72 +#define OV7725_AWBCtrl11 0x73 +#define OV7725_AWBCtrl12 0x74 +#define OV7725_AWBCtrl13 0x75 +#define OV7725_AWBCtrl14 0x76 +#define OV7725_AWBCtrl15 0x77 +#define OV7725_AWBCtrl16 0x78 +#define OV7725_AWBCtrl17 0x79 +#define OV7725_AWBCtrl18 0x7A +#define OV7725_AWBCtrl19 0x7B +#define OV7725_AWBCtrl20 0x7C +#define OV7725_AWBCtrl21 0x7D +#define OV7725_GAM1 0x7E +#define OV7725_GAM2 0x7F +#define OV7725_GAM3 0x80 +#define OV7725_GAM4 0x81 +#define OV7725_GAM5 0x82 +#define OV7725_GAM6 0x83 +#define OV7725_GAM7 0x84 +#define OV7725_GAM8 0x85 +#define OV7725_GAM9 0x86 +#define OV7725_GAM10 0x87 +#define OV7725_GAM11 0x88 +#define OV7725_GAM12 0x89 +#define OV7725_GAM13 0x8A +#define OV7725_GAM14 0x8B +#define OV7725_GAM15 0x8C +#define OV7725_SLOP 0x8D +#define OV7725_DNSTh 0x8E +#define OV7725_EDGE0 0x8F +#define OV7725_EDGE1 0x90 +#define OV7725_DNSOff 0x91 +#define OV7725_EDGE2 0x92 +#define OV7725_EDGE3 0x93 +#define OV7725_MTX1 0x94 +#define OV7725_MTX2 0x95 +#define OV7725_MTX3 0x96 +#define OV7725_MTX4 0x97 +#define OV7725_MTX5 0x98 +#define OV7725_MTX6 0x99 +#define OV7725_MTX_Ctrl 0x9A +#define OV7725_BRIGHT 0x9B +#define OV7725_CNST 0x9C +#define OV7725_UVADJ0 0x9E +#define OV7725_UVADJ1 0x9F +#define OV7725_SCAL0 0xA0 +#define OV7725_SCAL1 0xA1 +#define OV7725_SCAL2 0xA2 +#define OV7725_SDE 0xA6 +#define OV7725_USAT 0xA7 +#define OV7725_VSAT 0xA8 +#define OV7725_HUECOS 0xA9 +#define OV7725_HUESIN 0xAA +#define OV7725_SIGN 0xAB +#define OV7725_DSPAuto 0xAC + + +#define OV7725_DEV_ADD 0x42>>1 + + +//配置摄像头参数 +#define OV7725_W 160 //定义摄像头图像宽度 可设置参数 80 160 240 320 +#define OV7725_H 120 //定义摄像头图像高度 可设置参数 60 120 180 240 +#define OV7725_SIZE (OV7725_W * OV7725_H/8 ) //图像占用空间大小 +#define OV7725_DMA_NUM (OV7725_SIZE) //一副图像DMA采集次数 + + +//-------------------------------------------------------------------------------------------------- +//引脚配置 +//-------------------------------------------------------------------------------------------------- +#define OV7725_VSYNC_PIN ERU_CH3_REQ6_P02_0 //场中断引脚 可选范围参考ERU_PIN_enum枚举 不可与像素引脚选择为同一个通道,或者是共用中断的通道 + //例如场中断选择ERU_CH3 那么像素引脚就不能选择ERU_CH7,因为3和7的中断是共用的。 + +#define OV7725_DATA_PIN P00_0 //定义D0数据引脚 假设D0定义为P00_0 那么D1所使用的引脚则为P00_1,依次类推 + //可设置参数P00_0、P02_0、P15_0,不能设置为其他参数 + +#define OV7725_PCLK_PIN ERU_CH2_REQ14_P02_1 //定义像素时钟引脚 可选范围参考ERU_PIN_enum枚举 不可与场中断引脚选择为同一个通道,或者是共用中断的通道 + //例如场中断选择ERU_CH3 那么像素引脚就不能选择ERU_CH7,因为3和7的中断是共用的。 + +#define OV7725_DMA_CH IfxDma_ChannelId_5 //定义使用的DMA通道 0-47可选 通道号越大优先级越低 + //修改此处之后,需要修改对应的ERU中断优先级,例如此处设置为IfxDma_ChannelId_5则对应的ERU中断优先级应该设置为5 + + + +extern uint8 image_bin[OV7725_H][OV7725_W/8]; //定义存储接收图像的数组 +extern uint8 image_dec[OV7725_H][OV7725_W]; //图像解压后的数组 + +extern uint8 ov7725_finish_flag; //图像采集完成标志位 + + +//函数声明 +uint8 ov7725_init(void); +void ov7725_vsync(void); +void ov7725_dma(void); +void image_decompression(uint8 *data1,uint8 *data2); +void seekfree_sendimg_7725(UARTN_enum uartn); + + + +#endif + + + diff --git a/Example/4-Encoder_Demo/Libraries/seekfree_peripheral/SEEKFREE_ICM20602.c b/Example/4-Encoder_Demo/Libraries/seekfree_peripheral/SEEKFREE_ICM20602.c index 095f9e3..5d167c9 100644 --- a/Example/4-Encoder_Demo/Libraries/seekfree_peripheral/SEEKFREE_ICM20602.c +++ b/Example/4-Encoder_Demo/Libraries/seekfree_peripheral/SEEKFREE_ICM20602.c @@ -68,6 +68,7 @@ void icm20602_self1_check(void) //------------------------------------------------------------------------------------------------------------------- void icm20602_init(void) { + simiic_init(); systick_delay_ms(STM0, 10); //上电延时 //检测 diff --git a/Example/4-Encoder_Demo/Libraries/seekfree_peripheral/SEEKFREE_IIC.c b/Example/4-Encoder_Demo/Libraries/seekfree_peripheral/SEEKFREE_IIC.c index 196fd57..f56a41a 100644 --- a/Example/4-Encoder_Demo/Libraries/seekfree_peripheral/SEEKFREE_IIC.c +++ b/Example/4-Encoder_Demo/Libraries/seekfree_peripheral/SEEKFREE_IIC.c @@ -50,7 +50,7 @@ uint8 IIC_num; // -static uint16 simiic_delay_time=100; //ICM等传感器应设置为100 +static uint16 simiic_delay_time = SIMIIC_DELAY_TIME; //ICM等传感器应设置为20 //------------------------------------------------------------------------------------------------------------------- diff --git a/Example/4-Encoder_Demo/Libraries/seekfree_peripheral/SEEKFREE_IIC.h b/Example/4-Encoder_Demo/Libraries/seekfree_peripheral/SEEKFREE_IIC.h index 293a02a..6a9c1e3 100644 --- a/Example/4-Encoder_Demo/Libraries/seekfree_peripheral/SEEKFREE_IIC.h +++ b/Example/4-Encoder_Demo/Libraries/seekfree_peripheral/SEEKFREE_IIC.h @@ -34,8 +34,12 @@ -#define SEEKFREE_SCL P13_0 //定义SCL引脚 可任意更改为其他IO -#define SEEKFREE_SDA P13_1 //定义SDA引脚 可任意更改为其他IO +#define SEEKFREE_SCL P02_3 //定义SCL引脚 可任意更改为其他IO +#define SEEKFREE_SDA P02_2 //定义SDA引脚 可任意更改为其他IO + + +#define SIMIIC_DELAY_TIME 20 + typedef enum IIC //DAC模块 { diff --git a/Example/4-Encoder_Demo/Libraries/seekfree_peripheral/SEEKFREE_L3G4200D.c b/Example/4-Encoder_Demo/Libraries/seekfree_peripheral/SEEKFREE_L3G4200D.c index 0f0c23a..5deb7d3 100644 --- a/Example/4-Encoder_Demo/Libraries/seekfree_peripheral/SEEKFREE_L3G4200D.c +++ b/Example/4-Encoder_Demo/Libraries/seekfree_peripheral/SEEKFREE_L3G4200D.c @@ -65,6 +65,7 @@ void l3g4200d_self_check(void) //------------------------------------------------------------------------------------------------------------------- void l3g4200d_init(void) { + simiic_init(); systick_delay_ms(STM0, 50); l3g4200d_self_check(); diff --git a/Example/4-Encoder_Demo/Libraries/seekfree_peripheral/SEEKFREE_MMA8451.c b/Example/4-Encoder_Demo/Libraries/seekfree_peripheral/SEEKFREE_MMA8451.c index c200427..8a5eec4 100644 --- a/Example/4-Encoder_Demo/Libraries/seekfree_peripheral/SEEKFREE_MMA8451.c +++ b/Example/4-Encoder_Demo/Libraries/seekfree_peripheral/SEEKFREE_MMA8451.c @@ -68,6 +68,7 @@ void mma8451_self_check(void) //------------------------------------------------------------------------------------------------------------------- uint8 mma845x_init(void) { + simiic_init(); systick_delay_ms(STM0, 50); mma8451_self_check(); diff --git a/Example/4-Encoder_Demo/Libraries/seekfree_peripheral/SEEKFREE_MPU6050.c b/Example/4-Encoder_Demo/Libraries/seekfree_peripheral/SEEKFREE_MPU6050.c index 0317aa0..686550d 100644 --- a/Example/4-Encoder_Demo/Libraries/seekfree_peripheral/SEEKFREE_MPU6050.c +++ b/Example/4-Encoder_Demo/Libraries/seekfree_peripheral/SEEKFREE_MPU6050.c @@ -71,6 +71,7 @@ void mpu6050_self1_check(void) //------------------------------------------------------------------------------------------------------------------- void mpu6050_init(void) { + simiic_init(); systick_delay_ms(STM0, 100); //上电延时 mpu6050_self1_check(); diff --git a/Example/4-Encoder_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.c b/Example/4-Encoder_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.c index 014b435..05f181f 100644 --- a/Example/4-Encoder_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.c +++ b/Example/4-Encoder_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.c @@ -38,7 +38,6 @@ #include "zf_gpio.h" #include "zf_eru.h" #include "zf_eru_dma.h" -#include "stdio.h" #include "SEEKFREE_MT9V03X.h" @@ -49,6 +48,8 @@ uint8 receive[3]; uint8 receive_num = 0; vuint8 uart_receive_flag; +uint8 link_list_num; + //需要配置到摄像头的数据 int16 MT9V03X_CFG[CONFIG_FINISH][2]= { @@ -305,7 +306,7 @@ void mt9v03x_init(void) gpio_init((PIN_enum)(MT9V03X_DATA_PIN+i), GPI, 0, PULLUP); } - eru_dma_init(MT9V03X_DMA_CH, GET_PORT_IN_ADDR(MT9V03X_DATA_PIN), mt9v03x_image[0], MT9V03X_PCLK_PIN, RISING, MT9V03X_W); + link_list_num = eru_dma_init(MT9V03X_DMA_CH, GET_PORT_IN_ADDR(MT9V03X_DATA_PIN), mt9v03x_image[0], MT9V03X_PCLK_PIN, RISING, MT9V03X_W*MT9V03X_H); eru_init(MT9V03X_VSYNC_PIN, FALLING); //初始化场中断,并设置为下降沿触发中断 restoreInterrupts(interrupt_state); @@ -313,7 +314,6 @@ void mt9v03x_init(void) uint8 mt9v03x_finish_flag = 0; //一场图像采集完成标志位 -uint8 now_col; //当前正在采集的行 //------------------------------------------------------------------------------------------------------------------- // @brief MT9V03X摄像头场中断 // @param NULL @@ -324,16 +324,15 @@ uint8 now_col; // void mt9v03x_vsync(void) { CLEAR_GPIO_FLAG(MT9V03X_VSYNC_PIN); - now_col = 0; + if(!mt9v03x_finish_flag)//查看图像数组是否使用完毕,如果未使用完毕则不开始采集,避免出现访问冲突 { - DMA_SET_DESTINATION(MT9V03X_DMA_CH, (void *)&mt9v03x_image[0]); dma_start(MT9V03X_DMA_CH); } } - +uint8 mt9v03x_dma_int_num; //当前DMA中断次数 //------------------------------------------------------------------------------------------------------------------- // @brief MT9V03X摄像头DMA完成中断 // @param NULL @@ -344,16 +343,15 @@ void mt9v03x_vsync(void) void mt9v03x_dma(void) { CLEAR_DMA_FLAG(MT9V03X_DMA_CH); + mt9v03x_dma_int_num++; - now_col++; - - if(MT9V03X_H > now_col) - { - dma_start(MT9V03X_DMA_CH); - } - else + if(mt9v03x_dma_int_num >= link_list_num) { + //采集完成 + mt9v03x_dma_int_num = 0; mt9v03x_finish_flag = 1;//一副图像从采集开始到采集结束耗时3.8MS左右(50FPS、188*120分辨率) + dma_stop(MT9V03X_DMA_CH); + } } diff --git a/Example/4-Encoder_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.h b/Example/4-Encoder_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.h index a29edd2..0c8a785 100644 --- a/Example/4-Encoder_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.h +++ b/Example/4-Encoder_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.h @@ -63,9 +63,7 @@ //例如场中断选择ERU_CH3 那么像素引脚就不能选择ERU_CH7,因为3和7的中断是共用的。 #define MT9V03X_DMA_CH IfxDma_ChannelId_5 //定义使用的DMA通道 0-47可选 通道号越大优先级越低 - //修改此处之后,需要修改对应的ERU中断优先级,例如此处设置为IfxDma_ChannelId_5则对应的ERU中断优先级应该设置为5 - - + //摄像头命令枚举 typedef enum { diff --git a/Example/4-Encoder_Demo/USER/isr.c b/Example/4-Encoder_Demo/USER/isr.c index 15666f2..c6376b0 100644 --- a/Example/4-Encoder_Demo/USER/isr.c +++ b/Example/4-Encoder_Demo/USER/isr.c @@ -98,7 +98,8 @@ IFX_INTERRUPT(eru_ch3_ch7_isr, ERU_CH3_CH7_INT_SERVICE, ERU_CH3_CH7_INT_PRIO) if(GET_GPIO_FLAG(ERU_CH3_REQ6_P02_0))//通道3中断 { CLEAR_GPIO_FLAG(ERU_CH3_REQ6_P02_0); - if(1 == camera_type)mt9v03x_vsync(); + if (1 == camera_type) mt9v03x_vsync(); + else if (3 == camera_type) ov7725_vsync(); } if(GET_GPIO_FLAG(ERU_CH7_REQ16_P15_1))//通道7中断 @@ -113,7 +114,8 @@ IFX_INTERRUPT(eru_ch3_ch7_isr, ERU_CH3_CH7_INT_SERVICE, ERU_CH3_CH7_INT_PRIO) IFX_INTERRUPT(dma_ch5_isr, ERU_DMA_INT_SERVICE, ERU_DMA_INT_PRIO) { - if(1 == camera_type) mt9v03x_dma(); + if (1 == camera_type) mt9v03x_dma(); + else if (3 == camera_type) ov7725_dma(); } diff --git a/Example/5-UART_Demo/Libraries/doc/version.txt b/Example/5-UART_Demo/Libraries/doc/version.txt index b85cd50..a42bc58 100644 --- a/Example/5-UART_Demo/Libraries/doc/version.txt +++ b/Example/5-UART_Demo/Libraries/doc/version.txt @@ -1,9 +1,17 @@ V1.0.0 - 初始版本 + 初始版本 V1.0.1 对总钻风摄像头的场中断进行修改,判断标志位为0才采集下一幅图像,避免出现访问冲突 修改SPI初始化中的错误,引用了固定的SPI2基地址 修复STM中无法使用STM1的问题 - 修复gtm pwm中最大占空比只有GTM_ATOM0_PWM_DUTY_MAX设置有效的问题 \ No newline at end of file + 修复gtm pwm中最大占空比只有GTM_ATOM0_PWM_DUTY_MAX设置有效的问题 + +V1.0.2 + 修改模拟IIC默认延时时间为20 + 添加 需要特别注意P20_2是不能用于输出的,仅仅只有输入的功能 注意事项 + 将摄像头采集DMA改为link传输,可以大大降低DMA中断次数 + 修改默认的软件IIC引脚定义 + 将6050等 需要用到软件IIC的模块,在初始化函数中默认调用模拟IIC初始化 + 添加小钻风驱动程序 \ No newline at end of file diff --git a/Example/5-UART_Demo/Libraries/seekfree_libraries/common/common.c b/Example/5-UART_Demo/Libraries/seekfree_libraries/common/common.c index 0460d15..ac42b19 100644 --- a/Example/5-UART_Demo/Libraries/seekfree_libraries/common/common.c +++ b/Example/5-UART_Demo/Libraries/seekfree_libraries/common/common.c @@ -22,7 +22,7 @@ #include "SysSe/Bsp/Bsp.h" #include "common.h" -uint8 camera_type; +uint8 camera_type; //摄像头型号 1:总钻风 2:凌瞳(暂未支持)3:小钻风 diff --git a/Example/5-UART_Demo/Libraries/seekfree_libraries/common/common.h b/Example/5-UART_Demo/Libraries/seekfree_libraries/common/common.h index fe7ec63..13d03cd 100644 --- a/Example/5-UART_Demo/Libraries/seekfree_libraries/common/common.h +++ b/Example/5-UART_Demo/Libraries/seekfree_libraries/common/common.h @@ -111,7 +111,7 @@ typedef enum //枚 #include -extern uint8 camera_type; +extern uint8 camera_type; //摄像头型号 1:总钻风 2:凌瞳(暂未支持)3:小钻风 void get_clk(void); diff --git a/Example/5-UART_Demo/Libraries/seekfree_libraries/headfile.h b/Example/5-UART_Demo/Libraries/seekfree_libraries/headfile.h index 0e8024f..e11bd83 100644 --- a/Example/5-UART_Demo/Libraries/seekfree_libraries/headfile.h +++ b/Example/5-UART_Demo/Libraries/seekfree_libraries/headfile.h @@ -62,6 +62,7 @@ #include "SEEKFREE_L3G4200D.h" #include "SEEKFREE_WIRELESS.h" #include "SEEKFREE_IPS200_PARALLEL8.h" +#include "SEEKFREE_7725.h" #endif diff --git a/Example/5-UART_Demo/Libraries/seekfree_libraries/zf_eru_dma.c b/Example/5-UART_Demo/Libraries/seekfree_libraries/zf_eru_dma.c index f7aab10..86c0158 100644 --- a/Example/5-UART_Demo/Libraries/seekfree_libraries/zf_eru_dma.c +++ b/Example/5-UART_Demo/Libraries/seekfree_libraries/zf_eru_dma.c @@ -21,9 +21,18 @@ #include "IfxDma_Dma.h" #include "IfxScuEru.h" #include "isr_config.h" +#include "zf_assert.h" #include "zf_eru_dma.h" +typedef struct +{ + Ifx_DMA_CH IFX_ALIGN(256) linked_list[8];//DMA链表 + IfxDma_Dma_Channel channel; //DMA通道句柄 +}DMA_LINK; + + +DMA_LINK dma_link_list; //------------------------------------------------------------------------------------------------------------------- // @brief eru触发dma初始化 @@ -36,7 +45,7 @@ // @return void // Sample usage: //------------------------------------------------------------------------------------------------------------------- -void eru_dma_init(IfxDma_ChannelId dma_ch, uint8 *source_addr, uint8 *destination_addr, ERU_PIN_enum eru_pin, TRIGGER_enum trigger, uint16 dma_count) +uint8 eru_dma_init(IfxDma_ChannelId dma_ch, uint8 *source_addr, uint8 *destination_addr, ERU_PIN_enum eru_pin, TRIGGER_enum trigger, uint16 dma_count) { IfxDma_Dma_Channel dmaChn; //eru触发DMA通道号 在eru文件中设置eru的优先级,即为触发的通道 @@ -51,27 +60,85 @@ void eru_dma_init(IfxDma_ChannelId dma_ch, uint8 *source_addr, uint8 *destinatio IfxDma_Dma_ChannelConfig cfg; IfxDma_Dma_initChannelConfig(&cfg, &dma); - cfg.transferCount = dma_count; + uint8 list_num, i; + uint16 single_channel_dma_count; + + ZF_ASSERT(!(dma_count%8));//传输次数必须为8的倍数 + + + list_num = 1; + single_channel_dma_count = dma_count / list_num; + if(16384 < single_channel_dma_count) + { + while(TRUE) + { + single_channel_dma_count = dma_count / list_num; + if((single_channel_dma_count <= 16384) && !(dma_count % list_num)) + { + break; + } + list_num++; + if(list_num > 8) ZF_ASSERT(FALSE); + } + } + + + if(1 == list_num) + { + cfg.shadowControl = IfxDma_ChannelShadow_none; + cfg.operationMode = IfxDma_ChannelOperationMode_single; + cfg.shadowAddress = 0; + } + else + { + cfg.shadowControl = IfxDma_ChannelShadow_linkedList; + cfg.operationMode = IfxDma_ChannelOperationMode_continuous; + cfg.shadowAddress = IFXCPU_GLB_ADDR_DSPR(IfxCpu_getCoreId(), (unsigned)&dma_link_list.linked_list[1]); + } + cfg.requestMode = IfxDma_ChannelRequestMode_oneTransferPerRequest; cfg.moveSize = IfxDma_ChannelMoveSize_8bit; + cfg.busPriority = IfxDma_ChannelBusPriority_high; - cfg.busPriority = IfxDma_ChannelBusPriority_high; - - cfg.sourceAddress = (unsigned)(source_addr); + cfg.sourceAddress = IFXCPU_GLB_ADDR_DSPR(IfxCpu_getCoreId(), source_addr); cfg.sourceAddressCircularRange = IfxDma_ChannelIncrementCircular_none; cfg.sourceCircularBufferEnabled = TRUE; - cfg.destinationAddress = IFXCPU_GLB_ADDR_DSPR(IfxCpu_getCoreId(), destination_addr); cfg.destinationAddressIncrementStep = IfxDma_ChannelIncrementStep_1; - cfg.operationMode = IfxDma_ChannelOperationMode_single; - cfg.channelId = (IfxDma_ChannelId)dma_ch; - cfg.hardwareRequestEnabled = TRUE; - cfg.channelInterruptEnabled = TRUE; + cfg.channelId = (IfxDma_ChannelId)dma_ch; + cfg.hardwareRequestEnabled = FALSE; + cfg.channelInterruptEnabled = TRUE; cfg.channelInterruptPriority = ERU_DMA_INT_PRIO; cfg.channelInterruptTypeOfService = (IfxSrc_Tos)ERU_DMA_INT_SERVICE; + + + cfg.destinationAddress = IFXCPU_GLB_ADDR_DSPR(IfxCpu_getCoreId(), destination_addr); + + cfg.transferCount = single_channel_dma_count; + IfxDma_Dma_initChannel(&dmaChn, &cfg); + + if(1 < list_num) + { + i = 0; + while(i < list_num) + { + cfg.destinationAddress = IFXCPU_GLB_ADDR_DSPR(IfxCpu_getCoreId(), destination_addr + single_channel_dma_count * i); + if(i == (list_num - 1)) cfg.shadowAddress = IFXCPU_GLB_ADDR_DSPR(IfxCpu_getCoreId(), (unsigned)&dma_link_list.linked_list[0]); + else cfg.shadowAddress = IFXCPU_GLB_ADDR_DSPR(IfxCpu_getCoreId(), (unsigned)&dma_link_list.linked_list[i+1]); + cfg.transferCount = single_channel_dma_count; + + IfxDma_Dma_initLinkedListEntry((void *)&dma_link_list.linked_list[i], &cfg); + i++; + } + } + + + IfxDma_Dma_getSrcPointer(&dma_link_list.channel)->B.CLRR = 1; + + return list_num; } diff --git a/Example/5-UART_Demo/Libraries/seekfree_libraries/zf_eru_dma.h b/Example/5-UART_Demo/Libraries/seekfree_libraries/zf_eru_dma.h index 50667ad..faef169 100644 --- a/Example/5-UART_Demo/Libraries/seekfree_libraries/zf_eru_dma.h +++ b/Example/5-UART_Demo/Libraries/seekfree_libraries/zf_eru_dma.h @@ -29,9 +29,9 @@ #define CLEAR_DMA_FLAG(dma_ch) IfxDma_clearChannelInterrupt(&MODULE_DMA, dma_ch); -#define DMA_SET_DESTINATION(dma_ch, destination_addr) IfxDma_setChannelDestinationAddress(&MODULE_DMA, dma_ch, (void *)destination_addr) +#define DMA_SET_DESTINATION(dma_ch, destination_addr) IfxDma_setChannelDestinationAddress(&MODULE_DMA, dma_ch, (void *)IFXCPU_GLB_ADDR_DSPR(IfxCpu_getCoreId(), destination_addr)) -void eru_dma_init(IfxDma_ChannelId dma_ch, uint8 *source_addr, uint8 *destination_addr, ERU_PIN_enum eru_pin, TRIGGER_enum trigger, uint16 dma_count); +uint8 eru_dma_init(IfxDma_ChannelId dma_ch, uint8 *source_addr, uint8 *destination_addr, ERU_PIN_enum eru_pin, TRIGGER_enum trigger, uint16 dma_count); void dma_stop(IfxDma_ChannelId dma_ch); void dma_start(IfxDma_ChannelId dma_ch); diff --git a/Example/5-UART_Demo/Libraries/seekfree_libraries/zf_gpio.c b/Example/5-UART_Demo/Libraries/seekfree_libraries/zf_gpio.c index 3c937cf..1d2466c 100644 --- a/Example/5-UART_Demo/Libraries/seekfree_libraries/zf_gpio.c +++ b/Example/5-UART_Demo/Libraries/seekfree_libraries/zf_gpio.c @@ -60,6 +60,7 @@ Ifx_P* get_port(PIN_enum pin) // @param pinmode 引脚配置(可设置参数由zf_gpio.h文件内GPIOMODE_enum枚举值确定) // @return void // Sample usage: gpio_init(P00_0, GPO, 1, PUSHPULL);//P00_0初始化为GPIO功能、输出模式、输出高电平、推挽输出 +// @note 需要特别注意P20_2是不能用于输出的,仅仅只有输入的功能 //------------------------------------------------------------------------------------------------------------------- void gpio_init(PIN_enum pin, GPIODIR_enum dir, uint8 dat, GPIOMODE_enum pinmode) { diff --git a/Example/5-UART_Demo/Libraries/seekfree_libraries/zf_gpio.h b/Example/5-UART_Demo/Libraries/seekfree_libraries/zf_gpio.h index cfbd666..e3d144f 100644 --- a/Example/5-UART_Demo/Libraries/seekfree_libraries/zf_gpio.h +++ b/Example/5-UART_Demo/Libraries/seekfree_libraries/zf_gpio.h @@ -38,6 +38,15 @@ typedef enum // 枚 #define GET_PORT_IN_ADDR(pin) (uint8 *)(&IfxPort_getAddress((IfxPort_Index)(pin/32))->IN + pin%32/8) + + +//需要特别注意P20_2是不能用于输出的,仅仅只有输入的功能 +//需要特别注意P20_2是不能用于输出的,仅仅只有输入的功能 +//需要特别注意P20_2是不能用于输出的,仅仅只有输入的功能 + + + + //------------------------------------------------------ //通用GPIO操作 void gpio_init(PIN_enum pin, GPIODIR_enum dir, uint8 dat, GPIOMODE_enum pinconf); diff --git a/Example/5-UART_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.c b/Example/5-UART_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.c new file mode 100644 index 0000000..806b8d9 --- /dev/null +++ b/Example/5-UART_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.c @@ -0,0 +1,262 @@ +/********************************************************************************************************************* + * COPYRIGHT NOTICE + * Copyright (c) 2020,逐飞科技 + * All rights reserved. + * 技术讨论QQ群:三群:824575535 + * + * 以下所有内容版权均属逐飞科技所有,未经允许不得用于商业用途, + * 欢迎各位使用并传播本程序,修改内容时必须保留逐飞科技的版权声明。 + * + * @file main + * @company 成都逐飞科技有限公司 + * @author 逐飞科技(QQ3184284598) + * @version 查看doc内version文件 版本说明 + * @Software tasking v6.3r1 + * @Target core TC264D + * @Taobao https://seekfree.taobao.com/ + * @date 2020-3-23 + * @note + 接线定义: + ------------------------------------ + 模块管脚 单片机管脚 + SDA 查看SEEKFREE_IIC文件内的SEEKFREE_SDA宏定义 + SCL 查看SEEKFREE_IIC文件内的SEEKFREE_SCL宏定义 + 场中断(VSY) 查看SEEKFREE_OV7725.h文件中的OV7725_VSYNC_PIN宏定义 + 行中断(HREF) 未使用,因此不接 + 像素中断(PCLK) 查看SEEKFREE_OV7725.h文件中的OV7725_PCLK_PIN宏定义 + 数据口(D0-D7) 查看SEEKFREE_OV7725.h文件中的OV7725_DATA_PIN宏定义 + ------------------------------------ + + 默认分辨率是 160*120 + 默认FPS 50帧 + ********************************************************************************************************************/ + + +#include "IfxDma.h" +#include "IfxScuEru.h" +#include "zf_stm_systick.h" +#include "zf_gpio.h" +#include "zf_eru.h" +#include "zf_eru_dma.h" +#include "SEEKFREE_IIC.h" +#include "SEEKFREE_7725.h" + + + +IFX_ALIGN(4) uint8 image_bin[OV7725_H][OV7725_W/8]; //定义存储接收图像的数组 +uint8 image_dec[OV7725_H][OV7725_W]; + +uint8 ov7725_idcode = 0; + +//------------------------------------------------------------------------------------------------------------------- +// @brief 小钻风摄像头内部寄存器初始化(内部使用,用户无需调用) +// @param NULL +// @return uint8 返回0则出错,返回1则成功 +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +uint8 ov7725_reg_init(void) +{ + simiic_delay_set(500); + simiic_write_reg ( OV7725_DEV_ADD, OV7725_COM7, 0x80 ); //复位摄像头 + systick_delay_ms(STM0, 50); + ov7725_idcode = simiic_read_reg( OV7725_DEV_ADD, OV7725_VER ,SCCB); + if( ov7725_idcode != OV7725_ID ) return 0; //校验摄像头ID号 + + //ID号确认无误 然后配置寄存器 + simiic_write_reg(OV7725_DEV_ADD, OV7725_COM4 , 0xC1); + simiic_write_reg(OV7725_DEV_ADD, OV7725_CLKRC , 0x01); + simiic_write_reg(OV7725_DEV_ADD, OV7725_COM2 , 0x03); + simiic_write_reg(OV7725_DEV_ADD, OV7725_COM3 , 0xD0); + simiic_write_reg(OV7725_DEV_ADD, OV7725_COM7 , 0x40); + simiic_write_reg(OV7725_DEV_ADD, OV7725_COM8 , 0xCE); //0xCE:关闭自动曝光 0xCF:开启自动曝光 + simiic_write_reg(OV7725_DEV_ADD, OV7725_HSTART , 0x3F); + simiic_write_reg(OV7725_DEV_ADD, OV7725_HSIZE , 0x50); + simiic_write_reg(OV7725_DEV_ADD, OV7725_VSTRT , 0x03); + simiic_write_reg(OV7725_DEV_ADD, OV7725_VSIZE , 0x78); + simiic_write_reg(OV7725_DEV_ADD, OV7725_HREF , 0x00); + simiic_write_reg(OV7725_DEV_ADD, OV7725_SCAL0 , 0x0A); + simiic_write_reg(OV7725_DEV_ADD, OV7725_AWB_Ctrl0 , 0xE0); + simiic_write_reg(OV7725_DEV_ADD, OV7725_DSPAuto , 0xff); + simiic_write_reg(OV7725_DEV_ADD, OV7725_DSP_Ctrl2 , 0x0C); + simiic_write_reg(OV7725_DEV_ADD, OV7725_DSP_Ctrl3 , 0x00); + simiic_write_reg(OV7725_DEV_ADD, OV7725_DSP_Ctrl4 , 0x00); + + if(OV7725_W == 80) simiic_write_reg(OV7725_DEV_ADD, OV7725_HOutSize , 0x14); + else if(OV7725_W == 160) simiic_write_reg(OV7725_DEV_ADD, OV7725_HOutSize , 0x28); + else if(OV7725_W == 240) simiic_write_reg(OV7725_DEV_ADD, OV7725_HOutSize , 0x3c); + else if(OV7725_W == 320) simiic_write_reg(OV7725_DEV_ADD, OV7725_HOutSize , 0x50); + + if(OV7725_H == 60) simiic_write_reg(OV7725_DEV_ADD, OV7725_VOutSize , 0x1E); + else if(OV7725_H == 120) simiic_write_reg(OV7725_DEV_ADD, OV7725_VOutSize , 0x3c); + else if(OV7725_H == 180) simiic_write_reg(OV7725_DEV_ADD, OV7725_VOutSize , 0x5a); + else if(OV7725_H == 240) simiic_write_reg(OV7725_DEV_ADD, OV7725_VOutSize , 0x78); + + simiic_write_reg(OV7725_DEV_ADD, OV7725_REG28 , 0x01); + simiic_write_reg(OV7725_DEV_ADD, OV7725_EXHCH , 0x10); + simiic_write_reg(OV7725_DEV_ADD, OV7725_EXHCL , 0x1F); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM1 , 0x0c); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM2 , 0x16); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM3 , 0x2a); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM4 , 0x4e); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM5 , 0x61); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM6 , 0x6f); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM7 , 0x7b); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM8 , 0x86); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM9 , 0x8e); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM10 , 0x97); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM11 , 0xa4); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM12 , 0xaf); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM13 , 0xc5); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM14 , 0xd7); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM15 , 0xe8); + simiic_write_reg(OV7725_DEV_ADD, OV7725_SLOP , 0x20); + simiic_write_reg(OV7725_DEV_ADD, OV7725_LC_RADI , 0x00); + simiic_write_reg(OV7725_DEV_ADD, OV7725_LC_COEF , 0x13); + simiic_write_reg(OV7725_DEV_ADD, OV7725_LC_XC , 0x08); + simiic_write_reg(OV7725_DEV_ADD, OV7725_LC_COEFB , 0x14); + simiic_write_reg(OV7725_DEV_ADD, OV7725_LC_COEFR , 0x17); + simiic_write_reg(OV7725_DEV_ADD, OV7725_LC_CTR , 0x05); + simiic_write_reg(OV7725_DEV_ADD, OV7725_BDBase , 0x99); + simiic_write_reg(OV7725_DEV_ADD, OV7725_BDMStep , 0x03); + simiic_write_reg(OV7725_DEV_ADD, OV7725_SDE , 0x04); + simiic_write_reg(OV7725_DEV_ADD, OV7725_BRIGHT , 0x00); + simiic_write_reg(OV7725_DEV_ADD, OV7725_CNST , 0x40); + simiic_write_reg(OV7725_DEV_ADD, OV7725_SIGN , 0x06); + simiic_write_reg(OV7725_DEV_ADD, OV7725_UVADJ0 , 0x11); + simiic_write_reg(OV7725_DEV_ADD, OV7725_UVADJ1 , 0x02); + + + simiic_delay_set(SIMIIC_DELAY_TIME);//修改为默认的20 + return 1; + + +} + + + + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 小钻风摄像头采集程序初始化(内部使用,用户无需调用) +// @param NULL +// @return void +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +void ov7725_port_init(void) +{ + uint8 i; + camera_type = 3;//设置连接摄像头类型 + + //摄像头采集初始化 + //初始化 数据引脚 + for(i=0; i<8; i++) + { + gpio_init((PIN_enum)(OV7725_DATA_PIN+i), GPI, 0, PULLUP); + } + eru_dma_init(OV7725_DMA_CH, GET_PORT_IN_ADDR(OV7725_DATA_PIN), image_bin[0], OV7725_PCLK_PIN, FALLING, OV7725_DMA_NUM); + eru_init(OV7725_VSYNC_PIN, FALLING); //初始化场中断,并设置为下降沿触发中断 + +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 小钻风摄像头初始化(调用之后设置好相关中断函数即可采集图像) +// @param NULL +// @return 0 +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +uint8 ov7725_init(void) +{ + simiic_init(); + ov7725_reg_init(); //摄像头寄存器配置 + ov7725_port_init(); //摄像头中断引脚及DMA配置 + return 0; +} + + + + +uint8 ov7725_finish_flag = 0; +//------------------------------------------------------------------------------------------------------------------- +// @brief 小钻风摄像头场中断 +// @param NULL +// @return void +// @since v1.0 +// Sample usage: 此函数在isr.c中被eru(GPIO中断)中断调用 +//------------------------------------------------------------------------------------------------------------------- +void ov7725_vsync(void) +{ + CLEAR_GPIO_FLAG(OV7725_VSYNC_PIN); + + if(!ov7725_finish_flag)//查看图像数组是否使用完毕,如果未使用完毕则不开始采集,避免出现访问冲突 + { + DMA_SET_DESTINATION(OV7725_DMA_CH, image_bin[0]); + dma_start(OV7725_DMA_CH); + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 小钻风摄像头DMA完成中断 +// @param NULL +// @return void +// @since v1.0 +// Sample usage: 此函数在isr.c中被dma中断调用 +//------------------------------------------------------------------------------------------------------------------- +void ov7725_dma(void) +{ + CLEAR_DMA_FLAG(OV7725_DMA_CH); + ov7725_finish_flag = 1; + dma_stop(OV7725_DMA_CH); +} + + + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 小钻风摄像头数据解压函数 +// @param *data1 源地址 +// @param *data2 目的地址 +// @return void +// @since v1.0 +// Sample usage: Image_Decompression(da1,dat2[0]);//将一维数组dat1的内容解压到二维数组dat2里. +//------------------------------------------------------------------------------------------------------------------- +void image_decompression(uint8 *data1,uint8 *data2) +{ + uint8 temp[2] = {0,255}; + uint16 lenth = OV7725_SIZE; + uint8 i = 8; + + + while(lenth--) + { + i = 8; + while(i--) + { + *data2++ = temp[(*data1 >> i) & 0x01]; + } + data1++; + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 小钻风摄像头未解压图像发送至上位机查看图像 +// @param *imgaddr 压缩图像数据地址 +// @param *imgsize 图像大小(直接填写OV7725_SIZE) +// @return void +// @since v1.0 +// Sample usage: 调用该函数前请先初始化uart2 +//------------------------------------------------------------------------------------------------------------------- +void seekfree_sendimg_7725(UARTN_enum uartn) +{ + uart_putchar(uartn, 0x00);uart_putchar(uartn, 0xff);uart_putchar(uartn, 0x01);uart_putchar(uartn, 0x01);//发送四个字节命令 + uart_putbuff(uartn, image_bin[0], OV7725_SIZE); //再发送图像 +} + + + + diff --git a/Example/5-UART_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.h b/Example/5-UART_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.h new file mode 100644 index 0000000..e513250 --- /dev/null +++ b/Example/5-UART_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.h @@ -0,0 +1,243 @@ +/********************************************************************************************************************* + * COPYRIGHT NOTICE + * Copyright (c) 2020,逐飞科技 + * All rights reserved. + * 技术讨论QQ群:三群:824575535 + * + * 以下所有内容版权均属逐飞科技所有,未经允许不得用于商业用途, + * 欢迎各位使用并传播本程序,修改内容时必须保留逐飞科技的版权声明。 + * + * @file main + * @company 成都逐飞科技有限公司 + * @author 逐飞科技(QQ3184284598) + * @version 查看doc内version文件 版本说明 + * @Software tasking v6.3r1 + * @Target core TC264D + * @Taobao https://seekfree.taobao.com/ + * @date 2020-3-23 + * @note + 接线定义: + ------------------------------------ + 模块管脚 单片机管脚 + SDA 查看SEEKFREE_IIC文件内的SEEKFREE_SDA宏定义 + SCL 查看SEEKFREE_IIC文件内的SEEKFREE_SCL宏定义 + 场中断(VSY) 查看SEEKFREE_OV7725.h文件中的OV7725_VSYNC_PIN宏定义 + 行中断(HREF) 未使用,因此不接 + 像素中断(PCLK) 查看SEEKFREE_OV7725.h文件中的OV7725_PCLK_PIN宏定义 + 数据口(D0-D7) 查看SEEKFREE_OV7725.h文件中的OV7725_DATA_PIN宏定义 + ------------------------------------ + + 默认分辨率是 160*120 + 默认FPS 50帧 + ********************************************************************************************************************/ + + + +#ifndef _SEEKFREE_7725_h +#define _SEEKFREE_7725_h + +#include "common.h" +#include "IfxDma_cfg.h" +#include "zf_uart.h" + + +//摄像头ID号 +#define OV7725_ID 0x21 + +//摄像头寄存器 +#define OV7725_GAIN 0x00 +#define OV7725_BLUE 0x01 +#define OV7725_RED 0x02 +#define OV7725_GREEN 0x03 +#define OV7725_BAVG 0x05 +#define OV7725_GAVG 0x06 +#define OV7725_RAVG 0x07 +#define OV7725_AECH 0x08 +#define OV7725_COM2 0x09 +#define OV7725_PID 0x0A +#define OV7725_VER 0x0B +#define OV7725_COM3 0x0C +#define OV7725_COM4 0x0D +#define OV7725_COM5 0x0E +#define OV7725_COM6 0x0F +#define OV7725_AEC 0x10 +#define OV7725_CLKRC 0x11 +#define OV7725_COM7 0x12 +#define OV7725_COM8 0x13 +#define OV7725_COM9 0x14 +#define OV7725_COM10 0x15 +#define OV7725_REG16 0x16 +#define OV7725_HSTART 0x17 +#define OV7725_HSIZE 0x18 +#define OV7725_VSTRT 0x19 +#define OV7725_VSIZE 0x1A +#define OV7725_PSHFT 0x1B +#define OV7725_MIDH 0x1C +#define OV7725_MIDL 0x1D +#define OV7725_LAEC 0x1F +#define OV7725_COM11 0x20 +#define OV7725_BDBase 0x22 +#define OV7725_BDMStep 0x23 +#define OV7725_AEW 0x24 +#define OV7725_AEB 0x25 +#define OV7725_VPT 0x26 +#define OV7725_REG28 0x28 +#define OV7725_HOutSize 0x29 +#define OV7725_EXHCH 0x2A +#define OV7725_EXHCL 0x2B +#define OV7725_VOutSize 0x2C +#define OV7725_ADVFL 0x2D +#define OV7725_ADVFH 0x2E +#define OV7725_YAVE 0x2F +#define OV7725_LumHTh 0x30 +#define OV7725_LumLTh 0x31 +#define OV7725_HREF 0x32 +#define OV7725_DM_LNL 0x33 +#define OV7725_DM_LNH 0x34 +#define OV7725_ADoff_B 0x35 +#define OV7725_ADoff_R 0x36 +#define OV7725_ADoff_Gb 0x37 +#define OV7725_ADoff_Gr 0x38 +#define OV7725_Off_B 0x39 +#define OV7725_Off_R 0x3A +#define OV7725_Off_Gb 0x3B +#define OV7725_Off_Gr 0x3C +#define OV7725_COM12 0x3D +#define OV7725_COM13 0x3E +#define OV7725_COM14 0x3F +#define OV7725_COM16 0x41 +#define OV7725_TGT_B 0x42 +#define OV7725_TGT_R 0x43 +#define OV7725_TGT_Gb 0x44 +#define OV7725_TGT_Gr 0x45 +#define OV7725_LC_CTR 0x46 +#define OV7725_LC_XC 0x47 +#define OV7725_LC_YC 0x48 +#define OV7725_LC_COEF 0x49 +#define OV7725_LC_RADI 0x4A +#define OV7725_LC_COEFB 0x4B +#define OV7725_LC_COEFR 0x4C +#define OV7725_FixGain 0x4D +#define OV7725_AREF1 0x4F +#define OV7725_AREF6 0x54 +#define OV7725_UFix 0x60 +#define OV7725_VFix 0x61 +#define OV7725_AWBb_blk 0x62 +#define OV7725_AWB_Ctrl0 0x63 +#define OV7725_DSP_Ctrl1 0x64 +#define OV7725_DSP_Ctrl2 0x65 +#define OV7725_DSP_Ctrl3 0x66 +#define OV7725_DSP_Ctrl4 0x67 +#define OV7725_AWB_bias 0x68 +#define OV7725_AWBCtrl1 0x69 +#define OV7725_AWBCtrl2 0x6A +#define OV7725_AWBCtrl3 0x6B +#define OV7725_AWBCtrl4 0x6C +#define OV7725_AWBCtrl5 0x6D +#define OV7725_AWBCtrl6 0x6E +#define OV7725_AWBCtrl7 0x6F +#define OV7725_AWBCtrl8 0x70 +#define OV7725_AWBCtrl9 0x71 +#define OV7725_AWBCtrl10 0x72 +#define OV7725_AWBCtrl11 0x73 +#define OV7725_AWBCtrl12 0x74 +#define OV7725_AWBCtrl13 0x75 +#define OV7725_AWBCtrl14 0x76 +#define OV7725_AWBCtrl15 0x77 +#define OV7725_AWBCtrl16 0x78 +#define OV7725_AWBCtrl17 0x79 +#define OV7725_AWBCtrl18 0x7A +#define OV7725_AWBCtrl19 0x7B +#define OV7725_AWBCtrl20 0x7C +#define OV7725_AWBCtrl21 0x7D +#define OV7725_GAM1 0x7E +#define OV7725_GAM2 0x7F +#define OV7725_GAM3 0x80 +#define OV7725_GAM4 0x81 +#define OV7725_GAM5 0x82 +#define OV7725_GAM6 0x83 +#define OV7725_GAM7 0x84 +#define OV7725_GAM8 0x85 +#define OV7725_GAM9 0x86 +#define OV7725_GAM10 0x87 +#define OV7725_GAM11 0x88 +#define OV7725_GAM12 0x89 +#define OV7725_GAM13 0x8A +#define OV7725_GAM14 0x8B +#define OV7725_GAM15 0x8C +#define OV7725_SLOP 0x8D +#define OV7725_DNSTh 0x8E +#define OV7725_EDGE0 0x8F +#define OV7725_EDGE1 0x90 +#define OV7725_DNSOff 0x91 +#define OV7725_EDGE2 0x92 +#define OV7725_EDGE3 0x93 +#define OV7725_MTX1 0x94 +#define OV7725_MTX2 0x95 +#define OV7725_MTX3 0x96 +#define OV7725_MTX4 0x97 +#define OV7725_MTX5 0x98 +#define OV7725_MTX6 0x99 +#define OV7725_MTX_Ctrl 0x9A +#define OV7725_BRIGHT 0x9B +#define OV7725_CNST 0x9C +#define OV7725_UVADJ0 0x9E +#define OV7725_UVADJ1 0x9F +#define OV7725_SCAL0 0xA0 +#define OV7725_SCAL1 0xA1 +#define OV7725_SCAL2 0xA2 +#define OV7725_SDE 0xA6 +#define OV7725_USAT 0xA7 +#define OV7725_VSAT 0xA8 +#define OV7725_HUECOS 0xA9 +#define OV7725_HUESIN 0xAA +#define OV7725_SIGN 0xAB +#define OV7725_DSPAuto 0xAC + + +#define OV7725_DEV_ADD 0x42>>1 + + +//配置摄像头参数 +#define OV7725_W 160 //定义摄像头图像宽度 可设置参数 80 160 240 320 +#define OV7725_H 120 //定义摄像头图像高度 可设置参数 60 120 180 240 +#define OV7725_SIZE (OV7725_W * OV7725_H/8 ) //图像占用空间大小 +#define OV7725_DMA_NUM (OV7725_SIZE) //一副图像DMA采集次数 + + +//-------------------------------------------------------------------------------------------------- +//引脚配置 +//-------------------------------------------------------------------------------------------------- +#define OV7725_VSYNC_PIN ERU_CH3_REQ6_P02_0 //场中断引脚 可选范围参考ERU_PIN_enum枚举 不可与像素引脚选择为同一个通道,或者是共用中断的通道 + //例如场中断选择ERU_CH3 那么像素引脚就不能选择ERU_CH7,因为3和7的中断是共用的。 + +#define OV7725_DATA_PIN P00_0 //定义D0数据引脚 假设D0定义为P00_0 那么D1所使用的引脚则为P00_1,依次类推 + //可设置参数P00_0、P02_0、P15_0,不能设置为其他参数 + +#define OV7725_PCLK_PIN ERU_CH2_REQ14_P02_1 //定义像素时钟引脚 可选范围参考ERU_PIN_enum枚举 不可与场中断引脚选择为同一个通道,或者是共用中断的通道 + //例如场中断选择ERU_CH3 那么像素引脚就不能选择ERU_CH7,因为3和7的中断是共用的。 + +#define OV7725_DMA_CH IfxDma_ChannelId_5 //定义使用的DMA通道 0-47可选 通道号越大优先级越低 + //修改此处之后,需要修改对应的ERU中断优先级,例如此处设置为IfxDma_ChannelId_5则对应的ERU中断优先级应该设置为5 + + + +extern uint8 image_bin[OV7725_H][OV7725_W/8]; //定义存储接收图像的数组 +extern uint8 image_dec[OV7725_H][OV7725_W]; //图像解压后的数组 + +extern uint8 ov7725_finish_flag; //图像采集完成标志位 + + +//函数声明 +uint8 ov7725_init(void); +void ov7725_vsync(void); +void ov7725_dma(void); +void image_decompression(uint8 *data1,uint8 *data2); +void seekfree_sendimg_7725(UARTN_enum uartn); + + + +#endif + + + diff --git a/Example/5-UART_Demo/Libraries/seekfree_peripheral/SEEKFREE_ICM20602.c b/Example/5-UART_Demo/Libraries/seekfree_peripheral/SEEKFREE_ICM20602.c index 095f9e3..5d167c9 100644 --- a/Example/5-UART_Demo/Libraries/seekfree_peripheral/SEEKFREE_ICM20602.c +++ b/Example/5-UART_Demo/Libraries/seekfree_peripheral/SEEKFREE_ICM20602.c @@ -68,6 +68,7 @@ void icm20602_self1_check(void) //------------------------------------------------------------------------------------------------------------------- void icm20602_init(void) { + simiic_init(); systick_delay_ms(STM0, 10); //上电延时 //检测 diff --git a/Example/5-UART_Demo/Libraries/seekfree_peripheral/SEEKFREE_IIC.c b/Example/5-UART_Demo/Libraries/seekfree_peripheral/SEEKFREE_IIC.c index 196fd57..f56a41a 100644 --- a/Example/5-UART_Demo/Libraries/seekfree_peripheral/SEEKFREE_IIC.c +++ b/Example/5-UART_Demo/Libraries/seekfree_peripheral/SEEKFREE_IIC.c @@ -50,7 +50,7 @@ uint8 IIC_num; // -static uint16 simiic_delay_time=100; //ICM等传感器应设置为100 +static uint16 simiic_delay_time = SIMIIC_DELAY_TIME; //ICM等传感器应设置为20 //------------------------------------------------------------------------------------------------------------------- diff --git a/Example/5-UART_Demo/Libraries/seekfree_peripheral/SEEKFREE_IIC.h b/Example/5-UART_Demo/Libraries/seekfree_peripheral/SEEKFREE_IIC.h index 293a02a..6a9c1e3 100644 --- a/Example/5-UART_Demo/Libraries/seekfree_peripheral/SEEKFREE_IIC.h +++ b/Example/5-UART_Demo/Libraries/seekfree_peripheral/SEEKFREE_IIC.h @@ -34,8 +34,12 @@ -#define SEEKFREE_SCL P13_0 //定义SCL引脚 可任意更改为其他IO -#define SEEKFREE_SDA P13_1 //定义SDA引脚 可任意更改为其他IO +#define SEEKFREE_SCL P02_3 //定义SCL引脚 可任意更改为其他IO +#define SEEKFREE_SDA P02_2 //定义SDA引脚 可任意更改为其他IO + + +#define SIMIIC_DELAY_TIME 20 + typedef enum IIC //DAC模块 { diff --git a/Example/5-UART_Demo/Libraries/seekfree_peripheral/SEEKFREE_L3G4200D.c b/Example/5-UART_Demo/Libraries/seekfree_peripheral/SEEKFREE_L3G4200D.c index 0f0c23a..5deb7d3 100644 --- a/Example/5-UART_Demo/Libraries/seekfree_peripheral/SEEKFREE_L3G4200D.c +++ b/Example/5-UART_Demo/Libraries/seekfree_peripheral/SEEKFREE_L3G4200D.c @@ -65,6 +65,7 @@ void l3g4200d_self_check(void) //------------------------------------------------------------------------------------------------------------------- void l3g4200d_init(void) { + simiic_init(); systick_delay_ms(STM0, 50); l3g4200d_self_check(); diff --git a/Example/5-UART_Demo/Libraries/seekfree_peripheral/SEEKFREE_MMA8451.c b/Example/5-UART_Demo/Libraries/seekfree_peripheral/SEEKFREE_MMA8451.c index c200427..8a5eec4 100644 --- a/Example/5-UART_Demo/Libraries/seekfree_peripheral/SEEKFREE_MMA8451.c +++ b/Example/5-UART_Demo/Libraries/seekfree_peripheral/SEEKFREE_MMA8451.c @@ -68,6 +68,7 @@ void mma8451_self_check(void) //------------------------------------------------------------------------------------------------------------------- uint8 mma845x_init(void) { + simiic_init(); systick_delay_ms(STM0, 50); mma8451_self_check(); diff --git a/Example/5-UART_Demo/Libraries/seekfree_peripheral/SEEKFREE_MPU6050.c b/Example/5-UART_Demo/Libraries/seekfree_peripheral/SEEKFREE_MPU6050.c index 0317aa0..686550d 100644 --- a/Example/5-UART_Demo/Libraries/seekfree_peripheral/SEEKFREE_MPU6050.c +++ b/Example/5-UART_Demo/Libraries/seekfree_peripheral/SEEKFREE_MPU6050.c @@ -71,6 +71,7 @@ void mpu6050_self1_check(void) //------------------------------------------------------------------------------------------------------------------- void mpu6050_init(void) { + simiic_init(); systick_delay_ms(STM0, 100); //上电延时 mpu6050_self1_check(); diff --git a/Example/5-UART_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.c b/Example/5-UART_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.c index 014b435..05f181f 100644 --- a/Example/5-UART_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.c +++ b/Example/5-UART_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.c @@ -38,7 +38,6 @@ #include "zf_gpio.h" #include "zf_eru.h" #include "zf_eru_dma.h" -#include "stdio.h" #include "SEEKFREE_MT9V03X.h" @@ -49,6 +48,8 @@ uint8 receive[3]; uint8 receive_num = 0; vuint8 uart_receive_flag; +uint8 link_list_num; + //需要配置到摄像头的数据 int16 MT9V03X_CFG[CONFIG_FINISH][2]= { @@ -305,7 +306,7 @@ void mt9v03x_init(void) gpio_init((PIN_enum)(MT9V03X_DATA_PIN+i), GPI, 0, PULLUP); } - eru_dma_init(MT9V03X_DMA_CH, GET_PORT_IN_ADDR(MT9V03X_DATA_PIN), mt9v03x_image[0], MT9V03X_PCLK_PIN, RISING, MT9V03X_W); + link_list_num = eru_dma_init(MT9V03X_DMA_CH, GET_PORT_IN_ADDR(MT9V03X_DATA_PIN), mt9v03x_image[0], MT9V03X_PCLK_PIN, RISING, MT9V03X_W*MT9V03X_H); eru_init(MT9V03X_VSYNC_PIN, FALLING); //初始化场中断,并设置为下降沿触发中断 restoreInterrupts(interrupt_state); @@ -313,7 +314,6 @@ void mt9v03x_init(void) uint8 mt9v03x_finish_flag = 0; //一场图像采集完成标志位 -uint8 now_col; //当前正在采集的行 //------------------------------------------------------------------------------------------------------------------- // @brief MT9V03X摄像头场中断 // @param NULL @@ -324,16 +324,15 @@ uint8 now_col; // void mt9v03x_vsync(void) { CLEAR_GPIO_FLAG(MT9V03X_VSYNC_PIN); - now_col = 0; + if(!mt9v03x_finish_flag)//查看图像数组是否使用完毕,如果未使用完毕则不开始采集,避免出现访问冲突 { - DMA_SET_DESTINATION(MT9V03X_DMA_CH, (void *)&mt9v03x_image[0]); dma_start(MT9V03X_DMA_CH); } } - +uint8 mt9v03x_dma_int_num; //当前DMA中断次数 //------------------------------------------------------------------------------------------------------------------- // @brief MT9V03X摄像头DMA完成中断 // @param NULL @@ -344,16 +343,15 @@ void mt9v03x_vsync(void) void mt9v03x_dma(void) { CLEAR_DMA_FLAG(MT9V03X_DMA_CH); + mt9v03x_dma_int_num++; - now_col++; - - if(MT9V03X_H > now_col) - { - dma_start(MT9V03X_DMA_CH); - } - else + if(mt9v03x_dma_int_num >= link_list_num) { + //采集完成 + mt9v03x_dma_int_num = 0; mt9v03x_finish_flag = 1;//一副图像从采集开始到采集结束耗时3.8MS左右(50FPS、188*120分辨率) + dma_stop(MT9V03X_DMA_CH); + } } diff --git a/Example/5-UART_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.h b/Example/5-UART_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.h index a29edd2..0c8a785 100644 --- a/Example/5-UART_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.h +++ b/Example/5-UART_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.h @@ -63,9 +63,7 @@ //例如场中断选择ERU_CH3 那么像素引脚就不能选择ERU_CH7,因为3和7的中断是共用的。 #define MT9V03X_DMA_CH IfxDma_ChannelId_5 //定义使用的DMA通道 0-47可选 通道号越大优先级越低 - //修改此处之后,需要修改对应的ERU中断优先级,例如此处设置为IfxDma_ChannelId_5则对应的ERU中断优先级应该设置为5 - - + //摄像头命令枚举 typedef enum { diff --git a/Example/5-UART_Demo/USER/isr.c b/Example/5-UART_Demo/USER/isr.c index 15666f2..c6376b0 100644 --- a/Example/5-UART_Demo/USER/isr.c +++ b/Example/5-UART_Demo/USER/isr.c @@ -98,7 +98,8 @@ IFX_INTERRUPT(eru_ch3_ch7_isr, ERU_CH3_CH7_INT_SERVICE, ERU_CH3_CH7_INT_PRIO) if(GET_GPIO_FLAG(ERU_CH3_REQ6_P02_0))//通道3中断 { CLEAR_GPIO_FLAG(ERU_CH3_REQ6_P02_0); - if(1 == camera_type)mt9v03x_vsync(); + if (1 == camera_type) mt9v03x_vsync(); + else if (3 == camera_type) ov7725_vsync(); } if(GET_GPIO_FLAG(ERU_CH7_REQ16_P15_1))//通道7中断 @@ -113,7 +114,8 @@ IFX_INTERRUPT(eru_ch3_ch7_isr, ERU_CH3_CH7_INT_SERVICE, ERU_CH3_CH7_INT_PRIO) IFX_INTERRUPT(dma_ch5_isr, ERU_DMA_INT_SERVICE, ERU_DMA_INT_PRIO) { - if(1 == camera_type) mt9v03x_dma(); + if (1 == camera_type) mt9v03x_dma(); + else if (3 == camera_type) ov7725_dma(); } diff --git a/Example/6-Printf_Demo/Libraries/doc/version.txt b/Example/6-Printf_Demo/Libraries/doc/version.txt index b85cd50..a42bc58 100644 --- a/Example/6-Printf_Demo/Libraries/doc/version.txt +++ b/Example/6-Printf_Demo/Libraries/doc/version.txt @@ -1,9 +1,17 @@ V1.0.0 - 初始版本 + 初始版本 V1.0.1 对总钻风摄像头的场中断进行修改,判断标志位为0才采集下一幅图像,避免出现访问冲突 修改SPI初始化中的错误,引用了固定的SPI2基地址 修复STM中无法使用STM1的问题 - 修复gtm pwm中最大占空比只有GTM_ATOM0_PWM_DUTY_MAX设置有效的问题 \ No newline at end of file + 修复gtm pwm中最大占空比只有GTM_ATOM0_PWM_DUTY_MAX设置有效的问题 + +V1.0.2 + 修改模拟IIC默认延时时间为20 + 添加 需要特别注意P20_2是不能用于输出的,仅仅只有输入的功能 注意事项 + 将摄像头采集DMA改为link传输,可以大大降低DMA中断次数 + 修改默认的软件IIC引脚定义 + 将6050等 需要用到软件IIC的模块,在初始化函数中默认调用模拟IIC初始化 + 添加小钻风驱动程序 \ No newline at end of file diff --git a/Example/6-Printf_Demo/Libraries/seekfree_libraries/common/common.c b/Example/6-Printf_Demo/Libraries/seekfree_libraries/common/common.c index 0460d15..ac42b19 100644 --- a/Example/6-Printf_Demo/Libraries/seekfree_libraries/common/common.c +++ b/Example/6-Printf_Demo/Libraries/seekfree_libraries/common/common.c @@ -22,7 +22,7 @@ #include "SysSe/Bsp/Bsp.h" #include "common.h" -uint8 camera_type; +uint8 camera_type; //摄像头型号 1:总钻风 2:凌瞳(暂未支持)3:小钻风 diff --git a/Example/6-Printf_Demo/Libraries/seekfree_libraries/common/common.h b/Example/6-Printf_Demo/Libraries/seekfree_libraries/common/common.h index fe7ec63..13d03cd 100644 --- a/Example/6-Printf_Demo/Libraries/seekfree_libraries/common/common.h +++ b/Example/6-Printf_Demo/Libraries/seekfree_libraries/common/common.h @@ -111,7 +111,7 @@ typedef enum //枚 #include -extern uint8 camera_type; +extern uint8 camera_type; //摄像头型号 1:总钻风 2:凌瞳(暂未支持)3:小钻风 void get_clk(void); diff --git a/Example/6-Printf_Demo/Libraries/seekfree_libraries/headfile.h b/Example/6-Printf_Demo/Libraries/seekfree_libraries/headfile.h index 0e8024f..e11bd83 100644 --- a/Example/6-Printf_Demo/Libraries/seekfree_libraries/headfile.h +++ b/Example/6-Printf_Demo/Libraries/seekfree_libraries/headfile.h @@ -62,6 +62,7 @@ #include "SEEKFREE_L3G4200D.h" #include "SEEKFREE_WIRELESS.h" #include "SEEKFREE_IPS200_PARALLEL8.h" +#include "SEEKFREE_7725.h" #endif diff --git a/Example/6-Printf_Demo/Libraries/seekfree_libraries/zf_eru_dma.c b/Example/6-Printf_Demo/Libraries/seekfree_libraries/zf_eru_dma.c index f7aab10..86c0158 100644 --- a/Example/6-Printf_Demo/Libraries/seekfree_libraries/zf_eru_dma.c +++ b/Example/6-Printf_Demo/Libraries/seekfree_libraries/zf_eru_dma.c @@ -21,9 +21,18 @@ #include "IfxDma_Dma.h" #include "IfxScuEru.h" #include "isr_config.h" +#include "zf_assert.h" #include "zf_eru_dma.h" +typedef struct +{ + Ifx_DMA_CH IFX_ALIGN(256) linked_list[8];//DMA链表 + IfxDma_Dma_Channel channel; //DMA通道句柄 +}DMA_LINK; + + +DMA_LINK dma_link_list; //------------------------------------------------------------------------------------------------------------------- // @brief eru触发dma初始化 @@ -36,7 +45,7 @@ // @return void // Sample usage: //------------------------------------------------------------------------------------------------------------------- -void eru_dma_init(IfxDma_ChannelId dma_ch, uint8 *source_addr, uint8 *destination_addr, ERU_PIN_enum eru_pin, TRIGGER_enum trigger, uint16 dma_count) +uint8 eru_dma_init(IfxDma_ChannelId dma_ch, uint8 *source_addr, uint8 *destination_addr, ERU_PIN_enum eru_pin, TRIGGER_enum trigger, uint16 dma_count) { IfxDma_Dma_Channel dmaChn; //eru触发DMA通道号 在eru文件中设置eru的优先级,即为触发的通道 @@ -51,27 +60,85 @@ void eru_dma_init(IfxDma_ChannelId dma_ch, uint8 *source_addr, uint8 *destinatio IfxDma_Dma_ChannelConfig cfg; IfxDma_Dma_initChannelConfig(&cfg, &dma); - cfg.transferCount = dma_count; + uint8 list_num, i; + uint16 single_channel_dma_count; + + ZF_ASSERT(!(dma_count%8));//传输次数必须为8的倍数 + + + list_num = 1; + single_channel_dma_count = dma_count / list_num; + if(16384 < single_channel_dma_count) + { + while(TRUE) + { + single_channel_dma_count = dma_count / list_num; + if((single_channel_dma_count <= 16384) && !(dma_count % list_num)) + { + break; + } + list_num++; + if(list_num > 8) ZF_ASSERT(FALSE); + } + } + + + if(1 == list_num) + { + cfg.shadowControl = IfxDma_ChannelShadow_none; + cfg.operationMode = IfxDma_ChannelOperationMode_single; + cfg.shadowAddress = 0; + } + else + { + cfg.shadowControl = IfxDma_ChannelShadow_linkedList; + cfg.operationMode = IfxDma_ChannelOperationMode_continuous; + cfg.shadowAddress = IFXCPU_GLB_ADDR_DSPR(IfxCpu_getCoreId(), (unsigned)&dma_link_list.linked_list[1]); + } + cfg.requestMode = IfxDma_ChannelRequestMode_oneTransferPerRequest; cfg.moveSize = IfxDma_ChannelMoveSize_8bit; + cfg.busPriority = IfxDma_ChannelBusPriority_high; - cfg.busPriority = IfxDma_ChannelBusPriority_high; - - cfg.sourceAddress = (unsigned)(source_addr); + cfg.sourceAddress = IFXCPU_GLB_ADDR_DSPR(IfxCpu_getCoreId(), source_addr); cfg.sourceAddressCircularRange = IfxDma_ChannelIncrementCircular_none; cfg.sourceCircularBufferEnabled = TRUE; - cfg.destinationAddress = IFXCPU_GLB_ADDR_DSPR(IfxCpu_getCoreId(), destination_addr); cfg.destinationAddressIncrementStep = IfxDma_ChannelIncrementStep_1; - cfg.operationMode = IfxDma_ChannelOperationMode_single; - cfg.channelId = (IfxDma_ChannelId)dma_ch; - cfg.hardwareRequestEnabled = TRUE; - cfg.channelInterruptEnabled = TRUE; + cfg.channelId = (IfxDma_ChannelId)dma_ch; + cfg.hardwareRequestEnabled = FALSE; + cfg.channelInterruptEnabled = TRUE; cfg.channelInterruptPriority = ERU_DMA_INT_PRIO; cfg.channelInterruptTypeOfService = (IfxSrc_Tos)ERU_DMA_INT_SERVICE; + + + cfg.destinationAddress = IFXCPU_GLB_ADDR_DSPR(IfxCpu_getCoreId(), destination_addr); + + cfg.transferCount = single_channel_dma_count; + IfxDma_Dma_initChannel(&dmaChn, &cfg); + + if(1 < list_num) + { + i = 0; + while(i < list_num) + { + cfg.destinationAddress = IFXCPU_GLB_ADDR_DSPR(IfxCpu_getCoreId(), destination_addr + single_channel_dma_count * i); + if(i == (list_num - 1)) cfg.shadowAddress = IFXCPU_GLB_ADDR_DSPR(IfxCpu_getCoreId(), (unsigned)&dma_link_list.linked_list[0]); + else cfg.shadowAddress = IFXCPU_GLB_ADDR_DSPR(IfxCpu_getCoreId(), (unsigned)&dma_link_list.linked_list[i+1]); + cfg.transferCount = single_channel_dma_count; + + IfxDma_Dma_initLinkedListEntry((void *)&dma_link_list.linked_list[i], &cfg); + i++; + } + } + + + IfxDma_Dma_getSrcPointer(&dma_link_list.channel)->B.CLRR = 1; + + return list_num; } diff --git a/Example/6-Printf_Demo/Libraries/seekfree_libraries/zf_eru_dma.h b/Example/6-Printf_Demo/Libraries/seekfree_libraries/zf_eru_dma.h index 50667ad..faef169 100644 --- a/Example/6-Printf_Demo/Libraries/seekfree_libraries/zf_eru_dma.h +++ b/Example/6-Printf_Demo/Libraries/seekfree_libraries/zf_eru_dma.h @@ -29,9 +29,9 @@ #define CLEAR_DMA_FLAG(dma_ch) IfxDma_clearChannelInterrupt(&MODULE_DMA, dma_ch); -#define DMA_SET_DESTINATION(dma_ch, destination_addr) IfxDma_setChannelDestinationAddress(&MODULE_DMA, dma_ch, (void *)destination_addr) +#define DMA_SET_DESTINATION(dma_ch, destination_addr) IfxDma_setChannelDestinationAddress(&MODULE_DMA, dma_ch, (void *)IFXCPU_GLB_ADDR_DSPR(IfxCpu_getCoreId(), destination_addr)) -void eru_dma_init(IfxDma_ChannelId dma_ch, uint8 *source_addr, uint8 *destination_addr, ERU_PIN_enum eru_pin, TRIGGER_enum trigger, uint16 dma_count); +uint8 eru_dma_init(IfxDma_ChannelId dma_ch, uint8 *source_addr, uint8 *destination_addr, ERU_PIN_enum eru_pin, TRIGGER_enum trigger, uint16 dma_count); void dma_stop(IfxDma_ChannelId dma_ch); void dma_start(IfxDma_ChannelId dma_ch); diff --git a/Example/6-Printf_Demo/Libraries/seekfree_libraries/zf_gpio.c b/Example/6-Printf_Demo/Libraries/seekfree_libraries/zf_gpio.c index 3c937cf..1d2466c 100644 --- a/Example/6-Printf_Demo/Libraries/seekfree_libraries/zf_gpio.c +++ b/Example/6-Printf_Demo/Libraries/seekfree_libraries/zf_gpio.c @@ -60,6 +60,7 @@ Ifx_P* get_port(PIN_enum pin) // @param pinmode 引脚配置(可设置参数由zf_gpio.h文件内GPIOMODE_enum枚举值确定) // @return void // Sample usage: gpio_init(P00_0, GPO, 1, PUSHPULL);//P00_0初始化为GPIO功能、输出模式、输出高电平、推挽输出 +// @note 需要特别注意P20_2是不能用于输出的,仅仅只有输入的功能 //------------------------------------------------------------------------------------------------------------------- void gpio_init(PIN_enum pin, GPIODIR_enum dir, uint8 dat, GPIOMODE_enum pinmode) { diff --git a/Example/6-Printf_Demo/Libraries/seekfree_libraries/zf_gpio.h b/Example/6-Printf_Demo/Libraries/seekfree_libraries/zf_gpio.h index cfbd666..e3d144f 100644 --- a/Example/6-Printf_Demo/Libraries/seekfree_libraries/zf_gpio.h +++ b/Example/6-Printf_Demo/Libraries/seekfree_libraries/zf_gpio.h @@ -38,6 +38,15 @@ typedef enum // 枚 #define GET_PORT_IN_ADDR(pin) (uint8 *)(&IfxPort_getAddress((IfxPort_Index)(pin/32))->IN + pin%32/8) + + +//需要特别注意P20_2是不能用于输出的,仅仅只有输入的功能 +//需要特别注意P20_2是不能用于输出的,仅仅只有输入的功能 +//需要特别注意P20_2是不能用于输出的,仅仅只有输入的功能 + + + + //------------------------------------------------------ //通用GPIO操作 void gpio_init(PIN_enum pin, GPIODIR_enum dir, uint8 dat, GPIOMODE_enum pinconf); diff --git a/Example/6-Printf_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.c b/Example/6-Printf_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.c new file mode 100644 index 0000000..806b8d9 --- /dev/null +++ b/Example/6-Printf_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.c @@ -0,0 +1,262 @@ +/********************************************************************************************************************* + * COPYRIGHT NOTICE + * Copyright (c) 2020,逐飞科技 + * All rights reserved. + * 技术讨论QQ群:三群:824575535 + * + * 以下所有内容版权均属逐飞科技所有,未经允许不得用于商业用途, + * 欢迎各位使用并传播本程序,修改内容时必须保留逐飞科技的版权声明。 + * + * @file main + * @company 成都逐飞科技有限公司 + * @author 逐飞科技(QQ3184284598) + * @version 查看doc内version文件 版本说明 + * @Software tasking v6.3r1 + * @Target core TC264D + * @Taobao https://seekfree.taobao.com/ + * @date 2020-3-23 + * @note + 接线定义: + ------------------------------------ + 模块管脚 单片机管脚 + SDA 查看SEEKFREE_IIC文件内的SEEKFREE_SDA宏定义 + SCL 查看SEEKFREE_IIC文件内的SEEKFREE_SCL宏定义 + 场中断(VSY) 查看SEEKFREE_OV7725.h文件中的OV7725_VSYNC_PIN宏定义 + 行中断(HREF) 未使用,因此不接 + 像素中断(PCLK) 查看SEEKFREE_OV7725.h文件中的OV7725_PCLK_PIN宏定义 + 数据口(D0-D7) 查看SEEKFREE_OV7725.h文件中的OV7725_DATA_PIN宏定义 + ------------------------------------ + + 默认分辨率是 160*120 + 默认FPS 50帧 + ********************************************************************************************************************/ + + +#include "IfxDma.h" +#include "IfxScuEru.h" +#include "zf_stm_systick.h" +#include "zf_gpio.h" +#include "zf_eru.h" +#include "zf_eru_dma.h" +#include "SEEKFREE_IIC.h" +#include "SEEKFREE_7725.h" + + + +IFX_ALIGN(4) uint8 image_bin[OV7725_H][OV7725_W/8]; //定义存储接收图像的数组 +uint8 image_dec[OV7725_H][OV7725_W]; + +uint8 ov7725_idcode = 0; + +//------------------------------------------------------------------------------------------------------------------- +// @brief 小钻风摄像头内部寄存器初始化(内部使用,用户无需调用) +// @param NULL +// @return uint8 返回0则出错,返回1则成功 +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +uint8 ov7725_reg_init(void) +{ + simiic_delay_set(500); + simiic_write_reg ( OV7725_DEV_ADD, OV7725_COM7, 0x80 ); //复位摄像头 + systick_delay_ms(STM0, 50); + ov7725_idcode = simiic_read_reg( OV7725_DEV_ADD, OV7725_VER ,SCCB); + if( ov7725_idcode != OV7725_ID ) return 0; //校验摄像头ID号 + + //ID号确认无误 然后配置寄存器 + simiic_write_reg(OV7725_DEV_ADD, OV7725_COM4 , 0xC1); + simiic_write_reg(OV7725_DEV_ADD, OV7725_CLKRC , 0x01); + simiic_write_reg(OV7725_DEV_ADD, OV7725_COM2 , 0x03); + simiic_write_reg(OV7725_DEV_ADD, OV7725_COM3 , 0xD0); + simiic_write_reg(OV7725_DEV_ADD, OV7725_COM7 , 0x40); + simiic_write_reg(OV7725_DEV_ADD, OV7725_COM8 , 0xCE); //0xCE:关闭自动曝光 0xCF:开启自动曝光 + simiic_write_reg(OV7725_DEV_ADD, OV7725_HSTART , 0x3F); + simiic_write_reg(OV7725_DEV_ADD, OV7725_HSIZE , 0x50); + simiic_write_reg(OV7725_DEV_ADD, OV7725_VSTRT , 0x03); + simiic_write_reg(OV7725_DEV_ADD, OV7725_VSIZE , 0x78); + simiic_write_reg(OV7725_DEV_ADD, OV7725_HREF , 0x00); + simiic_write_reg(OV7725_DEV_ADD, OV7725_SCAL0 , 0x0A); + simiic_write_reg(OV7725_DEV_ADD, OV7725_AWB_Ctrl0 , 0xE0); + simiic_write_reg(OV7725_DEV_ADD, OV7725_DSPAuto , 0xff); + simiic_write_reg(OV7725_DEV_ADD, OV7725_DSP_Ctrl2 , 0x0C); + simiic_write_reg(OV7725_DEV_ADD, OV7725_DSP_Ctrl3 , 0x00); + simiic_write_reg(OV7725_DEV_ADD, OV7725_DSP_Ctrl4 , 0x00); + + if(OV7725_W == 80) simiic_write_reg(OV7725_DEV_ADD, OV7725_HOutSize , 0x14); + else if(OV7725_W == 160) simiic_write_reg(OV7725_DEV_ADD, OV7725_HOutSize , 0x28); + else if(OV7725_W == 240) simiic_write_reg(OV7725_DEV_ADD, OV7725_HOutSize , 0x3c); + else if(OV7725_W == 320) simiic_write_reg(OV7725_DEV_ADD, OV7725_HOutSize , 0x50); + + if(OV7725_H == 60) simiic_write_reg(OV7725_DEV_ADD, OV7725_VOutSize , 0x1E); + else if(OV7725_H == 120) simiic_write_reg(OV7725_DEV_ADD, OV7725_VOutSize , 0x3c); + else if(OV7725_H == 180) simiic_write_reg(OV7725_DEV_ADD, OV7725_VOutSize , 0x5a); + else if(OV7725_H == 240) simiic_write_reg(OV7725_DEV_ADD, OV7725_VOutSize , 0x78); + + simiic_write_reg(OV7725_DEV_ADD, OV7725_REG28 , 0x01); + simiic_write_reg(OV7725_DEV_ADD, OV7725_EXHCH , 0x10); + simiic_write_reg(OV7725_DEV_ADD, OV7725_EXHCL , 0x1F); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM1 , 0x0c); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM2 , 0x16); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM3 , 0x2a); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM4 , 0x4e); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM5 , 0x61); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM6 , 0x6f); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM7 , 0x7b); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM8 , 0x86); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM9 , 0x8e); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM10 , 0x97); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM11 , 0xa4); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM12 , 0xaf); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM13 , 0xc5); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM14 , 0xd7); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM15 , 0xe8); + simiic_write_reg(OV7725_DEV_ADD, OV7725_SLOP , 0x20); + simiic_write_reg(OV7725_DEV_ADD, OV7725_LC_RADI , 0x00); + simiic_write_reg(OV7725_DEV_ADD, OV7725_LC_COEF , 0x13); + simiic_write_reg(OV7725_DEV_ADD, OV7725_LC_XC , 0x08); + simiic_write_reg(OV7725_DEV_ADD, OV7725_LC_COEFB , 0x14); + simiic_write_reg(OV7725_DEV_ADD, OV7725_LC_COEFR , 0x17); + simiic_write_reg(OV7725_DEV_ADD, OV7725_LC_CTR , 0x05); + simiic_write_reg(OV7725_DEV_ADD, OV7725_BDBase , 0x99); + simiic_write_reg(OV7725_DEV_ADD, OV7725_BDMStep , 0x03); + simiic_write_reg(OV7725_DEV_ADD, OV7725_SDE , 0x04); + simiic_write_reg(OV7725_DEV_ADD, OV7725_BRIGHT , 0x00); + simiic_write_reg(OV7725_DEV_ADD, OV7725_CNST , 0x40); + simiic_write_reg(OV7725_DEV_ADD, OV7725_SIGN , 0x06); + simiic_write_reg(OV7725_DEV_ADD, OV7725_UVADJ0 , 0x11); + simiic_write_reg(OV7725_DEV_ADD, OV7725_UVADJ1 , 0x02); + + + simiic_delay_set(SIMIIC_DELAY_TIME);//修改为默认的20 + return 1; + + +} + + + + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 小钻风摄像头采集程序初始化(内部使用,用户无需调用) +// @param NULL +// @return void +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +void ov7725_port_init(void) +{ + uint8 i; + camera_type = 3;//设置连接摄像头类型 + + //摄像头采集初始化 + //初始化 数据引脚 + for(i=0; i<8; i++) + { + gpio_init((PIN_enum)(OV7725_DATA_PIN+i), GPI, 0, PULLUP); + } + eru_dma_init(OV7725_DMA_CH, GET_PORT_IN_ADDR(OV7725_DATA_PIN), image_bin[0], OV7725_PCLK_PIN, FALLING, OV7725_DMA_NUM); + eru_init(OV7725_VSYNC_PIN, FALLING); //初始化场中断,并设置为下降沿触发中断 + +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 小钻风摄像头初始化(调用之后设置好相关中断函数即可采集图像) +// @param NULL +// @return 0 +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +uint8 ov7725_init(void) +{ + simiic_init(); + ov7725_reg_init(); //摄像头寄存器配置 + ov7725_port_init(); //摄像头中断引脚及DMA配置 + return 0; +} + + + + +uint8 ov7725_finish_flag = 0; +//------------------------------------------------------------------------------------------------------------------- +// @brief 小钻风摄像头场中断 +// @param NULL +// @return void +// @since v1.0 +// Sample usage: 此函数在isr.c中被eru(GPIO中断)中断调用 +//------------------------------------------------------------------------------------------------------------------- +void ov7725_vsync(void) +{ + CLEAR_GPIO_FLAG(OV7725_VSYNC_PIN); + + if(!ov7725_finish_flag)//查看图像数组是否使用完毕,如果未使用完毕则不开始采集,避免出现访问冲突 + { + DMA_SET_DESTINATION(OV7725_DMA_CH, image_bin[0]); + dma_start(OV7725_DMA_CH); + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 小钻风摄像头DMA完成中断 +// @param NULL +// @return void +// @since v1.0 +// Sample usage: 此函数在isr.c中被dma中断调用 +//------------------------------------------------------------------------------------------------------------------- +void ov7725_dma(void) +{ + CLEAR_DMA_FLAG(OV7725_DMA_CH); + ov7725_finish_flag = 1; + dma_stop(OV7725_DMA_CH); +} + + + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 小钻风摄像头数据解压函数 +// @param *data1 源地址 +// @param *data2 目的地址 +// @return void +// @since v1.0 +// Sample usage: Image_Decompression(da1,dat2[0]);//将一维数组dat1的内容解压到二维数组dat2里. +//------------------------------------------------------------------------------------------------------------------- +void image_decompression(uint8 *data1,uint8 *data2) +{ + uint8 temp[2] = {0,255}; + uint16 lenth = OV7725_SIZE; + uint8 i = 8; + + + while(lenth--) + { + i = 8; + while(i--) + { + *data2++ = temp[(*data1 >> i) & 0x01]; + } + data1++; + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 小钻风摄像头未解压图像发送至上位机查看图像 +// @param *imgaddr 压缩图像数据地址 +// @param *imgsize 图像大小(直接填写OV7725_SIZE) +// @return void +// @since v1.0 +// Sample usage: 调用该函数前请先初始化uart2 +//------------------------------------------------------------------------------------------------------------------- +void seekfree_sendimg_7725(UARTN_enum uartn) +{ + uart_putchar(uartn, 0x00);uart_putchar(uartn, 0xff);uart_putchar(uartn, 0x01);uart_putchar(uartn, 0x01);//发送四个字节命令 + uart_putbuff(uartn, image_bin[0], OV7725_SIZE); //再发送图像 +} + + + + diff --git a/Example/6-Printf_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.h b/Example/6-Printf_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.h new file mode 100644 index 0000000..e513250 --- /dev/null +++ b/Example/6-Printf_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.h @@ -0,0 +1,243 @@ +/********************************************************************************************************************* + * COPYRIGHT NOTICE + * Copyright (c) 2020,逐飞科技 + * All rights reserved. + * 技术讨论QQ群:三群:824575535 + * + * 以下所有内容版权均属逐飞科技所有,未经允许不得用于商业用途, + * 欢迎各位使用并传播本程序,修改内容时必须保留逐飞科技的版权声明。 + * + * @file main + * @company 成都逐飞科技有限公司 + * @author 逐飞科技(QQ3184284598) + * @version 查看doc内version文件 版本说明 + * @Software tasking v6.3r1 + * @Target core TC264D + * @Taobao https://seekfree.taobao.com/ + * @date 2020-3-23 + * @note + 接线定义: + ------------------------------------ + 模块管脚 单片机管脚 + SDA 查看SEEKFREE_IIC文件内的SEEKFREE_SDA宏定义 + SCL 查看SEEKFREE_IIC文件内的SEEKFREE_SCL宏定义 + 场中断(VSY) 查看SEEKFREE_OV7725.h文件中的OV7725_VSYNC_PIN宏定义 + 行中断(HREF) 未使用,因此不接 + 像素中断(PCLK) 查看SEEKFREE_OV7725.h文件中的OV7725_PCLK_PIN宏定义 + 数据口(D0-D7) 查看SEEKFREE_OV7725.h文件中的OV7725_DATA_PIN宏定义 + ------------------------------------ + + 默认分辨率是 160*120 + 默认FPS 50帧 + ********************************************************************************************************************/ + + + +#ifndef _SEEKFREE_7725_h +#define _SEEKFREE_7725_h + +#include "common.h" +#include "IfxDma_cfg.h" +#include "zf_uart.h" + + +//摄像头ID号 +#define OV7725_ID 0x21 + +//摄像头寄存器 +#define OV7725_GAIN 0x00 +#define OV7725_BLUE 0x01 +#define OV7725_RED 0x02 +#define OV7725_GREEN 0x03 +#define OV7725_BAVG 0x05 +#define OV7725_GAVG 0x06 +#define OV7725_RAVG 0x07 +#define OV7725_AECH 0x08 +#define OV7725_COM2 0x09 +#define OV7725_PID 0x0A +#define OV7725_VER 0x0B +#define OV7725_COM3 0x0C +#define OV7725_COM4 0x0D +#define OV7725_COM5 0x0E +#define OV7725_COM6 0x0F +#define OV7725_AEC 0x10 +#define OV7725_CLKRC 0x11 +#define OV7725_COM7 0x12 +#define OV7725_COM8 0x13 +#define OV7725_COM9 0x14 +#define OV7725_COM10 0x15 +#define OV7725_REG16 0x16 +#define OV7725_HSTART 0x17 +#define OV7725_HSIZE 0x18 +#define OV7725_VSTRT 0x19 +#define OV7725_VSIZE 0x1A +#define OV7725_PSHFT 0x1B +#define OV7725_MIDH 0x1C +#define OV7725_MIDL 0x1D +#define OV7725_LAEC 0x1F +#define OV7725_COM11 0x20 +#define OV7725_BDBase 0x22 +#define OV7725_BDMStep 0x23 +#define OV7725_AEW 0x24 +#define OV7725_AEB 0x25 +#define OV7725_VPT 0x26 +#define OV7725_REG28 0x28 +#define OV7725_HOutSize 0x29 +#define OV7725_EXHCH 0x2A +#define OV7725_EXHCL 0x2B +#define OV7725_VOutSize 0x2C +#define OV7725_ADVFL 0x2D +#define OV7725_ADVFH 0x2E +#define OV7725_YAVE 0x2F +#define OV7725_LumHTh 0x30 +#define OV7725_LumLTh 0x31 +#define OV7725_HREF 0x32 +#define OV7725_DM_LNL 0x33 +#define OV7725_DM_LNH 0x34 +#define OV7725_ADoff_B 0x35 +#define OV7725_ADoff_R 0x36 +#define OV7725_ADoff_Gb 0x37 +#define OV7725_ADoff_Gr 0x38 +#define OV7725_Off_B 0x39 +#define OV7725_Off_R 0x3A +#define OV7725_Off_Gb 0x3B +#define OV7725_Off_Gr 0x3C +#define OV7725_COM12 0x3D +#define OV7725_COM13 0x3E +#define OV7725_COM14 0x3F +#define OV7725_COM16 0x41 +#define OV7725_TGT_B 0x42 +#define OV7725_TGT_R 0x43 +#define OV7725_TGT_Gb 0x44 +#define OV7725_TGT_Gr 0x45 +#define OV7725_LC_CTR 0x46 +#define OV7725_LC_XC 0x47 +#define OV7725_LC_YC 0x48 +#define OV7725_LC_COEF 0x49 +#define OV7725_LC_RADI 0x4A +#define OV7725_LC_COEFB 0x4B +#define OV7725_LC_COEFR 0x4C +#define OV7725_FixGain 0x4D +#define OV7725_AREF1 0x4F +#define OV7725_AREF6 0x54 +#define OV7725_UFix 0x60 +#define OV7725_VFix 0x61 +#define OV7725_AWBb_blk 0x62 +#define OV7725_AWB_Ctrl0 0x63 +#define OV7725_DSP_Ctrl1 0x64 +#define OV7725_DSP_Ctrl2 0x65 +#define OV7725_DSP_Ctrl3 0x66 +#define OV7725_DSP_Ctrl4 0x67 +#define OV7725_AWB_bias 0x68 +#define OV7725_AWBCtrl1 0x69 +#define OV7725_AWBCtrl2 0x6A +#define OV7725_AWBCtrl3 0x6B +#define OV7725_AWBCtrl4 0x6C +#define OV7725_AWBCtrl5 0x6D +#define OV7725_AWBCtrl6 0x6E +#define OV7725_AWBCtrl7 0x6F +#define OV7725_AWBCtrl8 0x70 +#define OV7725_AWBCtrl9 0x71 +#define OV7725_AWBCtrl10 0x72 +#define OV7725_AWBCtrl11 0x73 +#define OV7725_AWBCtrl12 0x74 +#define OV7725_AWBCtrl13 0x75 +#define OV7725_AWBCtrl14 0x76 +#define OV7725_AWBCtrl15 0x77 +#define OV7725_AWBCtrl16 0x78 +#define OV7725_AWBCtrl17 0x79 +#define OV7725_AWBCtrl18 0x7A +#define OV7725_AWBCtrl19 0x7B +#define OV7725_AWBCtrl20 0x7C +#define OV7725_AWBCtrl21 0x7D +#define OV7725_GAM1 0x7E +#define OV7725_GAM2 0x7F +#define OV7725_GAM3 0x80 +#define OV7725_GAM4 0x81 +#define OV7725_GAM5 0x82 +#define OV7725_GAM6 0x83 +#define OV7725_GAM7 0x84 +#define OV7725_GAM8 0x85 +#define OV7725_GAM9 0x86 +#define OV7725_GAM10 0x87 +#define OV7725_GAM11 0x88 +#define OV7725_GAM12 0x89 +#define OV7725_GAM13 0x8A +#define OV7725_GAM14 0x8B +#define OV7725_GAM15 0x8C +#define OV7725_SLOP 0x8D +#define OV7725_DNSTh 0x8E +#define OV7725_EDGE0 0x8F +#define OV7725_EDGE1 0x90 +#define OV7725_DNSOff 0x91 +#define OV7725_EDGE2 0x92 +#define OV7725_EDGE3 0x93 +#define OV7725_MTX1 0x94 +#define OV7725_MTX2 0x95 +#define OV7725_MTX3 0x96 +#define OV7725_MTX4 0x97 +#define OV7725_MTX5 0x98 +#define OV7725_MTX6 0x99 +#define OV7725_MTX_Ctrl 0x9A +#define OV7725_BRIGHT 0x9B +#define OV7725_CNST 0x9C +#define OV7725_UVADJ0 0x9E +#define OV7725_UVADJ1 0x9F +#define OV7725_SCAL0 0xA0 +#define OV7725_SCAL1 0xA1 +#define OV7725_SCAL2 0xA2 +#define OV7725_SDE 0xA6 +#define OV7725_USAT 0xA7 +#define OV7725_VSAT 0xA8 +#define OV7725_HUECOS 0xA9 +#define OV7725_HUESIN 0xAA +#define OV7725_SIGN 0xAB +#define OV7725_DSPAuto 0xAC + + +#define OV7725_DEV_ADD 0x42>>1 + + +//配置摄像头参数 +#define OV7725_W 160 //定义摄像头图像宽度 可设置参数 80 160 240 320 +#define OV7725_H 120 //定义摄像头图像高度 可设置参数 60 120 180 240 +#define OV7725_SIZE (OV7725_W * OV7725_H/8 ) //图像占用空间大小 +#define OV7725_DMA_NUM (OV7725_SIZE) //一副图像DMA采集次数 + + +//-------------------------------------------------------------------------------------------------- +//引脚配置 +//-------------------------------------------------------------------------------------------------- +#define OV7725_VSYNC_PIN ERU_CH3_REQ6_P02_0 //场中断引脚 可选范围参考ERU_PIN_enum枚举 不可与像素引脚选择为同一个通道,或者是共用中断的通道 + //例如场中断选择ERU_CH3 那么像素引脚就不能选择ERU_CH7,因为3和7的中断是共用的。 + +#define OV7725_DATA_PIN P00_0 //定义D0数据引脚 假设D0定义为P00_0 那么D1所使用的引脚则为P00_1,依次类推 + //可设置参数P00_0、P02_0、P15_0,不能设置为其他参数 + +#define OV7725_PCLK_PIN ERU_CH2_REQ14_P02_1 //定义像素时钟引脚 可选范围参考ERU_PIN_enum枚举 不可与场中断引脚选择为同一个通道,或者是共用中断的通道 + //例如场中断选择ERU_CH3 那么像素引脚就不能选择ERU_CH7,因为3和7的中断是共用的。 + +#define OV7725_DMA_CH IfxDma_ChannelId_5 //定义使用的DMA通道 0-47可选 通道号越大优先级越低 + //修改此处之后,需要修改对应的ERU中断优先级,例如此处设置为IfxDma_ChannelId_5则对应的ERU中断优先级应该设置为5 + + + +extern uint8 image_bin[OV7725_H][OV7725_W/8]; //定义存储接收图像的数组 +extern uint8 image_dec[OV7725_H][OV7725_W]; //图像解压后的数组 + +extern uint8 ov7725_finish_flag; //图像采集完成标志位 + + +//函数声明 +uint8 ov7725_init(void); +void ov7725_vsync(void); +void ov7725_dma(void); +void image_decompression(uint8 *data1,uint8 *data2); +void seekfree_sendimg_7725(UARTN_enum uartn); + + + +#endif + + + diff --git a/Example/6-Printf_Demo/Libraries/seekfree_peripheral/SEEKFREE_ICM20602.c b/Example/6-Printf_Demo/Libraries/seekfree_peripheral/SEEKFREE_ICM20602.c index 095f9e3..5d167c9 100644 --- a/Example/6-Printf_Demo/Libraries/seekfree_peripheral/SEEKFREE_ICM20602.c +++ b/Example/6-Printf_Demo/Libraries/seekfree_peripheral/SEEKFREE_ICM20602.c @@ -68,6 +68,7 @@ void icm20602_self1_check(void) //------------------------------------------------------------------------------------------------------------------- void icm20602_init(void) { + simiic_init(); systick_delay_ms(STM0, 10); //上电延时 //检测 diff --git a/Example/6-Printf_Demo/Libraries/seekfree_peripheral/SEEKFREE_IIC.c b/Example/6-Printf_Demo/Libraries/seekfree_peripheral/SEEKFREE_IIC.c index 196fd57..f56a41a 100644 --- a/Example/6-Printf_Demo/Libraries/seekfree_peripheral/SEEKFREE_IIC.c +++ b/Example/6-Printf_Demo/Libraries/seekfree_peripheral/SEEKFREE_IIC.c @@ -50,7 +50,7 @@ uint8 IIC_num; // -static uint16 simiic_delay_time=100; //ICM等传感器应设置为100 +static uint16 simiic_delay_time = SIMIIC_DELAY_TIME; //ICM等传感器应设置为20 //------------------------------------------------------------------------------------------------------------------- diff --git a/Example/6-Printf_Demo/Libraries/seekfree_peripheral/SEEKFREE_IIC.h b/Example/6-Printf_Demo/Libraries/seekfree_peripheral/SEEKFREE_IIC.h index 293a02a..6a9c1e3 100644 --- a/Example/6-Printf_Demo/Libraries/seekfree_peripheral/SEEKFREE_IIC.h +++ b/Example/6-Printf_Demo/Libraries/seekfree_peripheral/SEEKFREE_IIC.h @@ -34,8 +34,12 @@ -#define SEEKFREE_SCL P13_0 //定义SCL引脚 可任意更改为其他IO -#define SEEKFREE_SDA P13_1 //定义SDA引脚 可任意更改为其他IO +#define SEEKFREE_SCL P02_3 //定义SCL引脚 可任意更改为其他IO +#define SEEKFREE_SDA P02_2 //定义SDA引脚 可任意更改为其他IO + + +#define SIMIIC_DELAY_TIME 20 + typedef enum IIC //DAC模块 { diff --git a/Example/6-Printf_Demo/Libraries/seekfree_peripheral/SEEKFREE_L3G4200D.c b/Example/6-Printf_Demo/Libraries/seekfree_peripheral/SEEKFREE_L3G4200D.c index 0f0c23a..5deb7d3 100644 --- a/Example/6-Printf_Demo/Libraries/seekfree_peripheral/SEEKFREE_L3G4200D.c +++ b/Example/6-Printf_Demo/Libraries/seekfree_peripheral/SEEKFREE_L3G4200D.c @@ -65,6 +65,7 @@ void l3g4200d_self_check(void) //------------------------------------------------------------------------------------------------------------------- void l3g4200d_init(void) { + simiic_init(); systick_delay_ms(STM0, 50); l3g4200d_self_check(); diff --git a/Example/6-Printf_Demo/Libraries/seekfree_peripheral/SEEKFREE_MMA8451.c b/Example/6-Printf_Demo/Libraries/seekfree_peripheral/SEEKFREE_MMA8451.c index c200427..8a5eec4 100644 --- a/Example/6-Printf_Demo/Libraries/seekfree_peripheral/SEEKFREE_MMA8451.c +++ b/Example/6-Printf_Demo/Libraries/seekfree_peripheral/SEEKFREE_MMA8451.c @@ -68,6 +68,7 @@ void mma8451_self_check(void) //------------------------------------------------------------------------------------------------------------------- uint8 mma845x_init(void) { + simiic_init(); systick_delay_ms(STM0, 50); mma8451_self_check(); diff --git a/Example/6-Printf_Demo/Libraries/seekfree_peripheral/SEEKFREE_MPU6050.c b/Example/6-Printf_Demo/Libraries/seekfree_peripheral/SEEKFREE_MPU6050.c index 0317aa0..686550d 100644 --- a/Example/6-Printf_Demo/Libraries/seekfree_peripheral/SEEKFREE_MPU6050.c +++ b/Example/6-Printf_Demo/Libraries/seekfree_peripheral/SEEKFREE_MPU6050.c @@ -71,6 +71,7 @@ void mpu6050_self1_check(void) //------------------------------------------------------------------------------------------------------------------- void mpu6050_init(void) { + simiic_init(); systick_delay_ms(STM0, 100); //上电延时 mpu6050_self1_check(); diff --git a/Example/6-Printf_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.c b/Example/6-Printf_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.c index 014b435..05f181f 100644 --- a/Example/6-Printf_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.c +++ b/Example/6-Printf_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.c @@ -38,7 +38,6 @@ #include "zf_gpio.h" #include "zf_eru.h" #include "zf_eru_dma.h" -#include "stdio.h" #include "SEEKFREE_MT9V03X.h" @@ -49,6 +48,8 @@ uint8 receive[3]; uint8 receive_num = 0; vuint8 uart_receive_flag; +uint8 link_list_num; + //需要配置到摄像头的数据 int16 MT9V03X_CFG[CONFIG_FINISH][2]= { @@ -305,7 +306,7 @@ void mt9v03x_init(void) gpio_init((PIN_enum)(MT9V03X_DATA_PIN+i), GPI, 0, PULLUP); } - eru_dma_init(MT9V03X_DMA_CH, GET_PORT_IN_ADDR(MT9V03X_DATA_PIN), mt9v03x_image[0], MT9V03X_PCLK_PIN, RISING, MT9V03X_W); + link_list_num = eru_dma_init(MT9V03X_DMA_CH, GET_PORT_IN_ADDR(MT9V03X_DATA_PIN), mt9v03x_image[0], MT9V03X_PCLK_PIN, RISING, MT9V03X_W*MT9V03X_H); eru_init(MT9V03X_VSYNC_PIN, FALLING); //初始化场中断,并设置为下降沿触发中断 restoreInterrupts(interrupt_state); @@ -313,7 +314,6 @@ void mt9v03x_init(void) uint8 mt9v03x_finish_flag = 0; //一场图像采集完成标志位 -uint8 now_col; //当前正在采集的行 //------------------------------------------------------------------------------------------------------------------- // @brief MT9V03X摄像头场中断 // @param NULL @@ -324,16 +324,15 @@ uint8 now_col; // void mt9v03x_vsync(void) { CLEAR_GPIO_FLAG(MT9V03X_VSYNC_PIN); - now_col = 0; + if(!mt9v03x_finish_flag)//查看图像数组是否使用完毕,如果未使用完毕则不开始采集,避免出现访问冲突 { - DMA_SET_DESTINATION(MT9V03X_DMA_CH, (void *)&mt9v03x_image[0]); dma_start(MT9V03X_DMA_CH); } } - +uint8 mt9v03x_dma_int_num; //当前DMA中断次数 //------------------------------------------------------------------------------------------------------------------- // @brief MT9V03X摄像头DMA完成中断 // @param NULL @@ -344,16 +343,15 @@ void mt9v03x_vsync(void) void mt9v03x_dma(void) { CLEAR_DMA_FLAG(MT9V03X_DMA_CH); + mt9v03x_dma_int_num++; - now_col++; - - if(MT9V03X_H > now_col) - { - dma_start(MT9V03X_DMA_CH); - } - else + if(mt9v03x_dma_int_num >= link_list_num) { + //采集完成 + mt9v03x_dma_int_num = 0; mt9v03x_finish_flag = 1;//一副图像从采集开始到采集结束耗时3.8MS左右(50FPS、188*120分辨率) + dma_stop(MT9V03X_DMA_CH); + } } diff --git a/Example/6-Printf_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.h b/Example/6-Printf_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.h index a29edd2..0c8a785 100644 --- a/Example/6-Printf_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.h +++ b/Example/6-Printf_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.h @@ -63,9 +63,7 @@ //例如场中断选择ERU_CH3 那么像素引脚就不能选择ERU_CH7,因为3和7的中断是共用的。 #define MT9V03X_DMA_CH IfxDma_ChannelId_5 //定义使用的DMA通道 0-47可选 通道号越大优先级越低 - //修改此处之后,需要修改对应的ERU中断优先级,例如此处设置为IfxDma_ChannelId_5则对应的ERU中断优先级应该设置为5 - - + //摄像头命令枚举 typedef enum { diff --git a/Example/6-Printf_Demo/USER/isr.c b/Example/6-Printf_Demo/USER/isr.c index 15666f2..c6376b0 100644 --- a/Example/6-Printf_Demo/USER/isr.c +++ b/Example/6-Printf_Demo/USER/isr.c @@ -98,7 +98,8 @@ IFX_INTERRUPT(eru_ch3_ch7_isr, ERU_CH3_CH7_INT_SERVICE, ERU_CH3_CH7_INT_PRIO) if(GET_GPIO_FLAG(ERU_CH3_REQ6_P02_0))//通道3中断 { CLEAR_GPIO_FLAG(ERU_CH3_REQ6_P02_0); - if(1 == camera_type)mt9v03x_vsync(); + if (1 == camera_type) mt9v03x_vsync(); + else if (3 == camera_type) ov7725_vsync(); } if(GET_GPIO_FLAG(ERU_CH7_REQ16_P15_1))//通道7中断 @@ -113,7 +114,8 @@ IFX_INTERRUPT(eru_ch3_ch7_isr, ERU_CH3_CH7_INT_SERVICE, ERU_CH3_CH7_INT_PRIO) IFX_INTERRUPT(dma_ch5_isr, ERU_DMA_INT_SERVICE, ERU_DMA_INT_PRIO) { - if(1 == camera_type) mt9v03x_dma(); + if (1 == camera_type) mt9v03x_dma(); + else if (3 == camera_type) ov7725_dma(); } diff --git a/Example/7-GPIO_Interrupt_Demo/Libraries/doc/version.txt b/Example/7-GPIO_Interrupt_Demo/Libraries/doc/version.txt index b85cd50..a42bc58 100644 --- a/Example/7-GPIO_Interrupt_Demo/Libraries/doc/version.txt +++ b/Example/7-GPIO_Interrupt_Demo/Libraries/doc/version.txt @@ -1,9 +1,17 @@ V1.0.0 - 初始版本 + 初始版本 V1.0.1 对总钻风摄像头的场中断进行修改,判断标志位为0才采集下一幅图像,避免出现访问冲突 修改SPI初始化中的错误,引用了固定的SPI2基地址 修复STM中无法使用STM1的问题 - 修复gtm pwm中最大占空比只有GTM_ATOM0_PWM_DUTY_MAX设置有效的问题 \ No newline at end of file + 修复gtm pwm中最大占空比只有GTM_ATOM0_PWM_DUTY_MAX设置有效的问题 + +V1.0.2 + 修改模拟IIC默认延时时间为20 + 添加 需要特别注意P20_2是不能用于输出的,仅仅只有输入的功能 注意事项 + 将摄像头采集DMA改为link传输,可以大大降低DMA中断次数 + 修改默认的软件IIC引脚定义 + 将6050等 需要用到软件IIC的模块,在初始化函数中默认调用模拟IIC初始化 + 添加小钻风驱动程序 \ No newline at end of file diff --git a/Example/7-GPIO_Interrupt_Demo/Libraries/seekfree_libraries/common/common.c b/Example/7-GPIO_Interrupt_Demo/Libraries/seekfree_libraries/common/common.c index 0460d15..ac42b19 100644 --- a/Example/7-GPIO_Interrupt_Demo/Libraries/seekfree_libraries/common/common.c +++ b/Example/7-GPIO_Interrupt_Demo/Libraries/seekfree_libraries/common/common.c @@ -22,7 +22,7 @@ #include "SysSe/Bsp/Bsp.h" #include "common.h" -uint8 camera_type; +uint8 camera_type; //摄像头型号 1:总钻风 2:凌瞳(暂未支持)3:小钻风 diff --git a/Example/7-GPIO_Interrupt_Demo/Libraries/seekfree_libraries/common/common.h b/Example/7-GPIO_Interrupt_Demo/Libraries/seekfree_libraries/common/common.h index fe7ec63..13d03cd 100644 --- a/Example/7-GPIO_Interrupt_Demo/Libraries/seekfree_libraries/common/common.h +++ b/Example/7-GPIO_Interrupt_Demo/Libraries/seekfree_libraries/common/common.h @@ -111,7 +111,7 @@ typedef enum //枚 #include -extern uint8 camera_type; +extern uint8 camera_type; //摄像头型号 1:总钻风 2:凌瞳(暂未支持)3:小钻风 void get_clk(void); diff --git a/Example/7-GPIO_Interrupt_Demo/Libraries/seekfree_libraries/headfile.h b/Example/7-GPIO_Interrupt_Demo/Libraries/seekfree_libraries/headfile.h index 0e8024f..e11bd83 100644 --- a/Example/7-GPIO_Interrupt_Demo/Libraries/seekfree_libraries/headfile.h +++ b/Example/7-GPIO_Interrupt_Demo/Libraries/seekfree_libraries/headfile.h @@ -62,6 +62,7 @@ #include "SEEKFREE_L3G4200D.h" #include "SEEKFREE_WIRELESS.h" #include "SEEKFREE_IPS200_PARALLEL8.h" +#include "SEEKFREE_7725.h" #endif diff --git a/Example/7-GPIO_Interrupt_Demo/Libraries/seekfree_libraries/zf_eru_dma.c b/Example/7-GPIO_Interrupt_Demo/Libraries/seekfree_libraries/zf_eru_dma.c index f7aab10..86c0158 100644 --- a/Example/7-GPIO_Interrupt_Demo/Libraries/seekfree_libraries/zf_eru_dma.c +++ b/Example/7-GPIO_Interrupt_Demo/Libraries/seekfree_libraries/zf_eru_dma.c @@ -21,9 +21,18 @@ #include "IfxDma_Dma.h" #include "IfxScuEru.h" #include "isr_config.h" +#include "zf_assert.h" #include "zf_eru_dma.h" +typedef struct +{ + Ifx_DMA_CH IFX_ALIGN(256) linked_list[8];//DMA链表 + IfxDma_Dma_Channel channel; //DMA通道句柄 +}DMA_LINK; + + +DMA_LINK dma_link_list; //------------------------------------------------------------------------------------------------------------------- // @brief eru触发dma初始化 @@ -36,7 +45,7 @@ // @return void // Sample usage: //------------------------------------------------------------------------------------------------------------------- -void eru_dma_init(IfxDma_ChannelId dma_ch, uint8 *source_addr, uint8 *destination_addr, ERU_PIN_enum eru_pin, TRIGGER_enum trigger, uint16 dma_count) +uint8 eru_dma_init(IfxDma_ChannelId dma_ch, uint8 *source_addr, uint8 *destination_addr, ERU_PIN_enum eru_pin, TRIGGER_enum trigger, uint16 dma_count) { IfxDma_Dma_Channel dmaChn; //eru触发DMA通道号 在eru文件中设置eru的优先级,即为触发的通道 @@ -51,27 +60,85 @@ void eru_dma_init(IfxDma_ChannelId dma_ch, uint8 *source_addr, uint8 *destinatio IfxDma_Dma_ChannelConfig cfg; IfxDma_Dma_initChannelConfig(&cfg, &dma); - cfg.transferCount = dma_count; + uint8 list_num, i; + uint16 single_channel_dma_count; + + ZF_ASSERT(!(dma_count%8));//传输次数必须为8的倍数 + + + list_num = 1; + single_channel_dma_count = dma_count / list_num; + if(16384 < single_channel_dma_count) + { + while(TRUE) + { + single_channel_dma_count = dma_count / list_num; + if((single_channel_dma_count <= 16384) && !(dma_count % list_num)) + { + break; + } + list_num++; + if(list_num > 8) ZF_ASSERT(FALSE); + } + } + + + if(1 == list_num) + { + cfg.shadowControl = IfxDma_ChannelShadow_none; + cfg.operationMode = IfxDma_ChannelOperationMode_single; + cfg.shadowAddress = 0; + } + else + { + cfg.shadowControl = IfxDma_ChannelShadow_linkedList; + cfg.operationMode = IfxDma_ChannelOperationMode_continuous; + cfg.shadowAddress = IFXCPU_GLB_ADDR_DSPR(IfxCpu_getCoreId(), (unsigned)&dma_link_list.linked_list[1]); + } + cfg.requestMode = IfxDma_ChannelRequestMode_oneTransferPerRequest; cfg.moveSize = IfxDma_ChannelMoveSize_8bit; + cfg.busPriority = IfxDma_ChannelBusPriority_high; - cfg.busPriority = IfxDma_ChannelBusPriority_high; - - cfg.sourceAddress = (unsigned)(source_addr); + cfg.sourceAddress = IFXCPU_GLB_ADDR_DSPR(IfxCpu_getCoreId(), source_addr); cfg.sourceAddressCircularRange = IfxDma_ChannelIncrementCircular_none; cfg.sourceCircularBufferEnabled = TRUE; - cfg.destinationAddress = IFXCPU_GLB_ADDR_DSPR(IfxCpu_getCoreId(), destination_addr); cfg.destinationAddressIncrementStep = IfxDma_ChannelIncrementStep_1; - cfg.operationMode = IfxDma_ChannelOperationMode_single; - cfg.channelId = (IfxDma_ChannelId)dma_ch; - cfg.hardwareRequestEnabled = TRUE; - cfg.channelInterruptEnabled = TRUE; + cfg.channelId = (IfxDma_ChannelId)dma_ch; + cfg.hardwareRequestEnabled = FALSE; + cfg.channelInterruptEnabled = TRUE; cfg.channelInterruptPriority = ERU_DMA_INT_PRIO; cfg.channelInterruptTypeOfService = (IfxSrc_Tos)ERU_DMA_INT_SERVICE; + + + cfg.destinationAddress = IFXCPU_GLB_ADDR_DSPR(IfxCpu_getCoreId(), destination_addr); + + cfg.transferCount = single_channel_dma_count; + IfxDma_Dma_initChannel(&dmaChn, &cfg); + + if(1 < list_num) + { + i = 0; + while(i < list_num) + { + cfg.destinationAddress = IFXCPU_GLB_ADDR_DSPR(IfxCpu_getCoreId(), destination_addr + single_channel_dma_count * i); + if(i == (list_num - 1)) cfg.shadowAddress = IFXCPU_GLB_ADDR_DSPR(IfxCpu_getCoreId(), (unsigned)&dma_link_list.linked_list[0]); + else cfg.shadowAddress = IFXCPU_GLB_ADDR_DSPR(IfxCpu_getCoreId(), (unsigned)&dma_link_list.linked_list[i+1]); + cfg.transferCount = single_channel_dma_count; + + IfxDma_Dma_initLinkedListEntry((void *)&dma_link_list.linked_list[i], &cfg); + i++; + } + } + + + IfxDma_Dma_getSrcPointer(&dma_link_list.channel)->B.CLRR = 1; + + return list_num; } diff --git a/Example/7-GPIO_Interrupt_Demo/Libraries/seekfree_libraries/zf_eru_dma.h b/Example/7-GPIO_Interrupt_Demo/Libraries/seekfree_libraries/zf_eru_dma.h index 50667ad..faef169 100644 --- a/Example/7-GPIO_Interrupt_Demo/Libraries/seekfree_libraries/zf_eru_dma.h +++ b/Example/7-GPIO_Interrupt_Demo/Libraries/seekfree_libraries/zf_eru_dma.h @@ -29,9 +29,9 @@ #define CLEAR_DMA_FLAG(dma_ch) IfxDma_clearChannelInterrupt(&MODULE_DMA, dma_ch); -#define DMA_SET_DESTINATION(dma_ch, destination_addr) IfxDma_setChannelDestinationAddress(&MODULE_DMA, dma_ch, (void *)destination_addr) +#define DMA_SET_DESTINATION(dma_ch, destination_addr) IfxDma_setChannelDestinationAddress(&MODULE_DMA, dma_ch, (void *)IFXCPU_GLB_ADDR_DSPR(IfxCpu_getCoreId(), destination_addr)) -void eru_dma_init(IfxDma_ChannelId dma_ch, uint8 *source_addr, uint8 *destination_addr, ERU_PIN_enum eru_pin, TRIGGER_enum trigger, uint16 dma_count); +uint8 eru_dma_init(IfxDma_ChannelId dma_ch, uint8 *source_addr, uint8 *destination_addr, ERU_PIN_enum eru_pin, TRIGGER_enum trigger, uint16 dma_count); void dma_stop(IfxDma_ChannelId dma_ch); void dma_start(IfxDma_ChannelId dma_ch); diff --git a/Example/7-GPIO_Interrupt_Demo/Libraries/seekfree_libraries/zf_gpio.c b/Example/7-GPIO_Interrupt_Demo/Libraries/seekfree_libraries/zf_gpio.c index 3c937cf..1d2466c 100644 --- a/Example/7-GPIO_Interrupt_Demo/Libraries/seekfree_libraries/zf_gpio.c +++ b/Example/7-GPIO_Interrupt_Demo/Libraries/seekfree_libraries/zf_gpio.c @@ -60,6 +60,7 @@ Ifx_P* get_port(PIN_enum pin) // @param pinmode 引脚配置(可设置参数由zf_gpio.h文件内GPIOMODE_enum枚举值确定) // @return void // Sample usage: gpio_init(P00_0, GPO, 1, PUSHPULL);//P00_0初始化为GPIO功能、输出模式、输出高电平、推挽输出 +// @note 需要特别注意P20_2是不能用于输出的,仅仅只有输入的功能 //------------------------------------------------------------------------------------------------------------------- void gpio_init(PIN_enum pin, GPIODIR_enum dir, uint8 dat, GPIOMODE_enum pinmode) { diff --git a/Example/7-GPIO_Interrupt_Demo/Libraries/seekfree_libraries/zf_gpio.h b/Example/7-GPIO_Interrupt_Demo/Libraries/seekfree_libraries/zf_gpio.h index cfbd666..e3d144f 100644 --- a/Example/7-GPIO_Interrupt_Demo/Libraries/seekfree_libraries/zf_gpio.h +++ b/Example/7-GPIO_Interrupt_Demo/Libraries/seekfree_libraries/zf_gpio.h @@ -38,6 +38,15 @@ typedef enum // 枚 #define GET_PORT_IN_ADDR(pin) (uint8 *)(&IfxPort_getAddress((IfxPort_Index)(pin/32))->IN + pin%32/8) + + +//需要特别注意P20_2是不能用于输出的,仅仅只有输入的功能 +//需要特别注意P20_2是不能用于输出的,仅仅只有输入的功能 +//需要特别注意P20_2是不能用于输出的,仅仅只有输入的功能 + + + + //------------------------------------------------------ //通用GPIO操作 void gpio_init(PIN_enum pin, GPIODIR_enum dir, uint8 dat, GPIOMODE_enum pinconf); diff --git a/Example/7-GPIO_Interrupt_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.c b/Example/7-GPIO_Interrupt_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.c new file mode 100644 index 0000000..806b8d9 --- /dev/null +++ b/Example/7-GPIO_Interrupt_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.c @@ -0,0 +1,262 @@ +/********************************************************************************************************************* + * COPYRIGHT NOTICE + * Copyright (c) 2020,逐飞科技 + * All rights reserved. + * 技术讨论QQ群:三群:824575535 + * + * 以下所有内容版权均属逐飞科技所有,未经允许不得用于商业用途, + * 欢迎各位使用并传播本程序,修改内容时必须保留逐飞科技的版权声明。 + * + * @file main + * @company 成都逐飞科技有限公司 + * @author 逐飞科技(QQ3184284598) + * @version 查看doc内version文件 版本说明 + * @Software tasking v6.3r1 + * @Target core TC264D + * @Taobao https://seekfree.taobao.com/ + * @date 2020-3-23 + * @note + 接线定义: + ------------------------------------ + 模块管脚 单片机管脚 + SDA 查看SEEKFREE_IIC文件内的SEEKFREE_SDA宏定义 + SCL 查看SEEKFREE_IIC文件内的SEEKFREE_SCL宏定义 + 场中断(VSY) 查看SEEKFREE_OV7725.h文件中的OV7725_VSYNC_PIN宏定义 + 行中断(HREF) 未使用,因此不接 + 像素中断(PCLK) 查看SEEKFREE_OV7725.h文件中的OV7725_PCLK_PIN宏定义 + 数据口(D0-D7) 查看SEEKFREE_OV7725.h文件中的OV7725_DATA_PIN宏定义 + ------------------------------------ + + 默认分辨率是 160*120 + 默认FPS 50帧 + ********************************************************************************************************************/ + + +#include "IfxDma.h" +#include "IfxScuEru.h" +#include "zf_stm_systick.h" +#include "zf_gpio.h" +#include "zf_eru.h" +#include "zf_eru_dma.h" +#include "SEEKFREE_IIC.h" +#include "SEEKFREE_7725.h" + + + +IFX_ALIGN(4) uint8 image_bin[OV7725_H][OV7725_W/8]; //定义存储接收图像的数组 +uint8 image_dec[OV7725_H][OV7725_W]; + +uint8 ov7725_idcode = 0; + +//------------------------------------------------------------------------------------------------------------------- +// @brief 小钻风摄像头内部寄存器初始化(内部使用,用户无需调用) +// @param NULL +// @return uint8 返回0则出错,返回1则成功 +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +uint8 ov7725_reg_init(void) +{ + simiic_delay_set(500); + simiic_write_reg ( OV7725_DEV_ADD, OV7725_COM7, 0x80 ); //复位摄像头 + systick_delay_ms(STM0, 50); + ov7725_idcode = simiic_read_reg( OV7725_DEV_ADD, OV7725_VER ,SCCB); + if( ov7725_idcode != OV7725_ID ) return 0; //校验摄像头ID号 + + //ID号确认无误 然后配置寄存器 + simiic_write_reg(OV7725_DEV_ADD, OV7725_COM4 , 0xC1); + simiic_write_reg(OV7725_DEV_ADD, OV7725_CLKRC , 0x01); + simiic_write_reg(OV7725_DEV_ADD, OV7725_COM2 , 0x03); + simiic_write_reg(OV7725_DEV_ADD, OV7725_COM3 , 0xD0); + simiic_write_reg(OV7725_DEV_ADD, OV7725_COM7 , 0x40); + simiic_write_reg(OV7725_DEV_ADD, OV7725_COM8 , 0xCE); //0xCE:关闭自动曝光 0xCF:开启自动曝光 + simiic_write_reg(OV7725_DEV_ADD, OV7725_HSTART , 0x3F); + simiic_write_reg(OV7725_DEV_ADD, OV7725_HSIZE , 0x50); + simiic_write_reg(OV7725_DEV_ADD, OV7725_VSTRT , 0x03); + simiic_write_reg(OV7725_DEV_ADD, OV7725_VSIZE , 0x78); + simiic_write_reg(OV7725_DEV_ADD, OV7725_HREF , 0x00); + simiic_write_reg(OV7725_DEV_ADD, OV7725_SCAL0 , 0x0A); + simiic_write_reg(OV7725_DEV_ADD, OV7725_AWB_Ctrl0 , 0xE0); + simiic_write_reg(OV7725_DEV_ADD, OV7725_DSPAuto , 0xff); + simiic_write_reg(OV7725_DEV_ADD, OV7725_DSP_Ctrl2 , 0x0C); + simiic_write_reg(OV7725_DEV_ADD, OV7725_DSP_Ctrl3 , 0x00); + simiic_write_reg(OV7725_DEV_ADD, OV7725_DSP_Ctrl4 , 0x00); + + if(OV7725_W == 80) simiic_write_reg(OV7725_DEV_ADD, OV7725_HOutSize , 0x14); + else if(OV7725_W == 160) simiic_write_reg(OV7725_DEV_ADD, OV7725_HOutSize , 0x28); + else if(OV7725_W == 240) simiic_write_reg(OV7725_DEV_ADD, OV7725_HOutSize , 0x3c); + else if(OV7725_W == 320) simiic_write_reg(OV7725_DEV_ADD, OV7725_HOutSize , 0x50); + + if(OV7725_H == 60) simiic_write_reg(OV7725_DEV_ADD, OV7725_VOutSize , 0x1E); + else if(OV7725_H == 120) simiic_write_reg(OV7725_DEV_ADD, OV7725_VOutSize , 0x3c); + else if(OV7725_H == 180) simiic_write_reg(OV7725_DEV_ADD, OV7725_VOutSize , 0x5a); + else if(OV7725_H == 240) simiic_write_reg(OV7725_DEV_ADD, OV7725_VOutSize , 0x78); + + simiic_write_reg(OV7725_DEV_ADD, OV7725_REG28 , 0x01); + simiic_write_reg(OV7725_DEV_ADD, OV7725_EXHCH , 0x10); + simiic_write_reg(OV7725_DEV_ADD, OV7725_EXHCL , 0x1F); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM1 , 0x0c); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM2 , 0x16); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM3 , 0x2a); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM4 , 0x4e); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM5 , 0x61); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM6 , 0x6f); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM7 , 0x7b); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM8 , 0x86); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM9 , 0x8e); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM10 , 0x97); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM11 , 0xa4); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM12 , 0xaf); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM13 , 0xc5); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM14 , 0xd7); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM15 , 0xe8); + simiic_write_reg(OV7725_DEV_ADD, OV7725_SLOP , 0x20); + simiic_write_reg(OV7725_DEV_ADD, OV7725_LC_RADI , 0x00); + simiic_write_reg(OV7725_DEV_ADD, OV7725_LC_COEF , 0x13); + simiic_write_reg(OV7725_DEV_ADD, OV7725_LC_XC , 0x08); + simiic_write_reg(OV7725_DEV_ADD, OV7725_LC_COEFB , 0x14); + simiic_write_reg(OV7725_DEV_ADD, OV7725_LC_COEFR , 0x17); + simiic_write_reg(OV7725_DEV_ADD, OV7725_LC_CTR , 0x05); + simiic_write_reg(OV7725_DEV_ADD, OV7725_BDBase , 0x99); + simiic_write_reg(OV7725_DEV_ADD, OV7725_BDMStep , 0x03); + simiic_write_reg(OV7725_DEV_ADD, OV7725_SDE , 0x04); + simiic_write_reg(OV7725_DEV_ADD, OV7725_BRIGHT , 0x00); + simiic_write_reg(OV7725_DEV_ADD, OV7725_CNST , 0x40); + simiic_write_reg(OV7725_DEV_ADD, OV7725_SIGN , 0x06); + simiic_write_reg(OV7725_DEV_ADD, OV7725_UVADJ0 , 0x11); + simiic_write_reg(OV7725_DEV_ADD, OV7725_UVADJ1 , 0x02); + + + simiic_delay_set(SIMIIC_DELAY_TIME);//修改为默认的20 + return 1; + + +} + + + + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 小钻风摄像头采集程序初始化(内部使用,用户无需调用) +// @param NULL +// @return void +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +void ov7725_port_init(void) +{ + uint8 i; + camera_type = 3;//设置连接摄像头类型 + + //摄像头采集初始化 + //初始化 数据引脚 + for(i=0; i<8; i++) + { + gpio_init((PIN_enum)(OV7725_DATA_PIN+i), GPI, 0, PULLUP); + } + eru_dma_init(OV7725_DMA_CH, GET_PORT_IN_ADDR(OV7725_DATA_PIN), image_bin[0], OV7725_PCLK_PIN, FALLING, OV7725_DMA_NUM); + eru_init(OV7725_VSYNC_PIN, FALLING); //初始化场中断,并设置为下降沿触发中断 + +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 小钻风摄像头初始化(调用之后设置好相关中断函数即可采集图像) +// @param NULL +// @return 0 +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +uint8 ov7725_init(void) +{ + simiic_init(); + ov7725_reg_init(); //摄像头寄存器配置 + ov7725_port_init(); //摄像头中断引脚及DMA配置 + return 0; +} + + + + +uint8 ov7725_finish_flag = 0; +//------------------------------------------------------------------------------------------------------------------- +// @brief 小钻风摄像头场中断 +// @param NULL +// @return void +// @since v1.0 +// Sample usage: 此函数在isr.c中被eru(GPIO中断)中断调用 +//------------------------------------------------------------------------------------------------------------------- +void ov7725_vsync(void) +{ + CLEAR_GPIO_FLAG(OV7725_VSYNC_PIN); + + if(!ov7725_finish_flag)//查看图像数组是否使用完毕,如果未使用完毕则不开始采集,避免出现访问冲突 + { + DMA_SET_DESTINATION(OV7725_DMA_CH, image_bin[0]); + dma_start(OV7725_DMA_CH); + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 小钻风摄像头DMA完成中断 +// @param NULL +// @return void +// @since v1.0 +// Sample usage: 此函数在isr.c中被dma中断调用 +//------------------------------------------------------------------------------------------------------------------- +void ov7725_dma(void) +{ + CLEAR_DMA_FLAG(OV7725_DMA_CH); + ov7725_finish_flag = 1; + dma_stop(OV7725_DMA_CH); +} + + + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 小钻风摄像头数据解压函数 +// @param *data1 源地址 +// @param *data2 目的地址 +// @return void +// @since v1.0 +// Sample usage: Image_Decompression(da1,dat2[0]);//将一维数组dat1的内容解压到二维数组dat2里. +//------------------------------------------------------------------------------------------------------------------- +void image_decompression(uint8 *data1,uint8 *data2) +{ + uint8 temp[2] = {0,255}; + uint16 lenth = OV7725_SIZE; + uint8 i = 8; + + + while(lenth--) + { + i = 8; + while(i--) + { + *data2++ = temp[(*data1 >> i) & 0x01]; + } + data1++; + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 小钻风摄像头未解压图像发送至上位机查看图像 +// @param *imgaddr 压缩图像数据地址 +// @param *imgsize 图像大小(直接填写OV7725_SIZE) +// @return void +// @since v1.0 +// Sample usage: 调用该函数前请先初始化uart2 +//------------------------------------------------------------------------------------------------------------------- +void seekfree_sendimg_7725(UARTN_enum uartn) +{ + uart_putchar(uartn, 0x00);uart_putchar(uartn, 0xff);uart_putchar(uartn, 0x01);uart_putchar(uartn, 0x01);//发送四个字节命令 + uart_putbuff(uartn, image_bin[0], OV7725_SIZE); //再发送图像 +} + + + + diff --git a/Example/7-GPIO_Interrupt_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.h b/Example/7-GPIO_Interrupt_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.h new file mode 100644 index 0000000..e513250 --- /dev/null +++ b/Example/7-GPIO_Interrupt_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.h @@ -0,0 +1,243 @@ +/********************************************************************************************************************* + * COPYRIGHT NOTICE + * Copyright (c) 2020,逐飞科技 + * All rights reserved. + * 技术讨论QQ群:三群:824575535 + * + * 以下所有内容版权均属逐飞科技所有,未经允许不得用于商业用途, + * 欢迎各位使用并传播本程序,修改内容时必须保留逐飞科技的版权声明。 + * + * @file main + * @company 成都逐飞科技有限公司 + * @author 逐飞科技(QQ3184284598) + * @version 查看doc内version文件 版本说明 + * @Software tasking v6.3r1 + * @Target core TC264D + * @Taobao https://seekfree.taobao.com/ + * @date 2020-3-23 + * @note + 接线定义: + ------------------------------------ + 模块管脚 单片机管脚 + SDA 查看SEEKFREE_IIC文件内的SEEKFREE_SDA宏定义 + SCL 查看SEEKFREE_IIC文件内的SEEKFREE_SCL宏定义 + 场中断(VSY) 查看SEEKFREE_OV7725.h文件中的OV7725_VSYNC_PIN宏定义 + 行中断(HREF) 未使用,因此不接 + 像素中断(PCLK) 查看SEEKFREE_OV7725.h文件中的OV7725_PCLK_PIN宏定义 + 数据口(D0-D7) 查看SEEKFREE_OV7725.h文件中的OV7725_DATA_PIN宏定义 + ------------------------------------ + + 默认分辨率是 160*120 + 默认FPS 50帧 + ********************************************************************************************************************/ + + + +#ifndef _SEEKFREE_7725_h +#define _SEEKFREE_7725_h + +#include "common.h" +#include "IfxDma_cfg.h" +#include "zf_uart.h" + + +//摄像头ID号 +#define OV7725_ID 0x21 + +//摄像头寄存器 +#define OV7725_GAIN 0x00 +#define OV7725_BLUE 0x01 +#define OV7725_RED 0x02 +#define OV7725_GREEN 0x03 +#define OV7725_BAVG 0x05 +#define OV7725_GAVG 0x06 +#define OV7725_RAVG 0x07 +#define OV7725_AECH 0x08 +#define OV7725_COM2 0x09 +#define OV7725_PID 0x0A +#define OV7725_VER 0x0B +#define OV7725_COM3 0x0C +#define OV7725_COM4 0x0D +#define OV7725_COM5 0x0E +#define OV7725_COM6 0x0F +#define OV7725_AEC 0x10 +#define OV7725_CLKRC 0x11 +#define OV7725_COM7 0x12 +#define OV7725_COM8 0x13 +#define OV7725_COM9 0x14 +#define OV7725_COM10 0x15 +#define OV7725_REG16 0x16 +#define OV7725_HSTART 0x17 +#define OV7725_HSIZE 0x18 +#define OV7725_VSTRT 0x19 +#define OV7725_VSIZE 0x1A +#define OV7725_PSHFT 0x1B +#define OV7725_MIDH 0x1C +#define OV7725_MIDL 0x1D +#define OV7725_LAEC 0x1F +#define OV7725_COM11 0x20 +#define OV7725_BDBase 0x22 +#define OV7725_BDMStep 0x23 +#define OV7725_AEW 0x24 +#define OV7725_AEB 0x25 +#define OV7725_VPT 0x26 +#define OV7725_REG28 0x28 +#define OV7725_HOutSize 0x29 +#define OV7725_EXHCH 0x2A +#define OV7725_EXHCL 0x2B +#define OV7725_VOutSize 0x2C +#define OV7725_ADVFL 0x2D +#define OV7725_ADVFH 0x2E +#define OV7725_YAVE 0x2F +#define OV7725_LumHTh 0x30 +#define OV7725_LumLTh 0x31 +#define OV7725_HREF 0x32 +#define OV7725_DM_LNL 0x33 +#define OV7725_DM_LNH 0x34 +#define OV7725_ADoff_B 0x35 +#define OV7725_ADoff_R 0x36 +#define OV7725_ADoff_Gb 0x37 +#define OV7725_ADoff_Gr 0x38 +#define OV7725_Off_B 0x39 +#define OV7725_Off_R 0x3A +#define OV7725_Off_Gb 0x3B +#define OV7725_Off_Gr 0x3C +#define OV7725_COM12 0x3D +#define OV7725_COM13 0x3E +#define OV7725_COM14 0x3F +#define OV7725_COM16 0x41 +#define OV7725_TGT_B 0x42 +#define OV7725_TGT_R 0x43 +#define OV7725_TGT_Gb 0x44 +#define OV7725_TGT_Gr 0x45 +#define OV7725_LC_CTR 0x46 +#define OV7725_LC_XC 0x47 +#define OV7725_LC_YC 0x48 +#define OV7725_LC_COEF 0x49 +#define OV7725_LC_RADI 0x4A +#define OV7725_LC_COEFB 0x4B +#define OV7725_LC_COEFR 0x4C +#define OV7725_FixGain 0x4D +#define OV7725_AREF1 0x4F +#define OV7725_AREF6 0x54 +#define OV7725_UFix 0x60 +#define OV7725_VFix 0x61 +#define OV7725_AWBb_blk 0x62 +#define OV7725_AWB_Ctrl0 0x63 +#define OV7725_DSP_Ctrl1 0x64 +#define OV7725_DSP_Ctrl2 0x65 +#define OV7725_DSP_Ctrl3 0x66 +#define OV7725_DSP_Ctrl4 0x67 +#define OV7725_AWB_bias 0x68 +#define OV7725_AWBCtrl1 0x69 +#define OV7725_AWBCtrl2 0x6A +#define OV7725_AWBCtrl3 0x6B +#define OV7725_AWBCtrl4 0x6C +#define OV7725_AWBCtrl5 0x6D +#define OV7725_AWBCtrl6 0x6E +#define OV7725_AWBCtrl7 0x6F +#define OV7725_AWBCtrl8 0x70 +#define OV7725_AWBCtrl9 0x71 +#define OV7725_AWBCtrl10 0x72 +#define OV7725_AWBCtrl11 0x73 +#define OV7725_AWBCtrl12 0x74 +#define OV7725_AWBCtrl13 0x75 +#define OV7725_AWBCtrl14 0x76 +#define OV7725_AWBCtrl15 0x77 +#define OV7725_AWBCtrl16 0x78 +#define OV7725_AWBCtrl17 0x79 +#define OV7725_AWBCtrl18 0x7A +#define OV7725_AWBCtrl19 0x7B +#define OV7725_AWBCtrl20 0x7C +#define OV7725_AWBCtrl21 0x7D +#define OV7725_GAM1 0x7E +#define OV7725_GAM2 0x7F +#define OV7725_GAM3 0x80 +#define OV7725_GAM4 0x81 +#define OV7725_GAM5 0x82 +#define OV7725_GAM6 0x83 +#define OV7725_GAM7 0x84 +#define OV7725_GAM8 0x85 +#define OV7725_GAM9 0x86 +#define OV7725_GAM10 0x87 +#define OV7725_GAM11 0x88 +#define OV7725_GAM12 0x89 +#define OV7725_GAM13 0x8A +#define OV7725_GAM14 0x8B +#define OV7725_GAM15 0x8C +#define OV7725_SLOP 0x8D +#define OV7725_DNSTh 0x8E +#define OV7725_EDGE0 0x8F +#define OV7725_EDGE1 0x90 +#define OV7725_DNSOff 0x91 +#define OV7725_EDGE2 0x92 +#define OV7725_EDGE3 0x93 +#define OV7725_MTX1 0x94 +#define OV7725_MTX2 0x95 +#define OV7725_MTX3 0x96 +#define OV7725_MTX4 0x97 +#define OV7725_MTX5 0x98 +#define OV7725_MTX6 0x99 +#define OV7725_MTX_Ctrl 0x9A +#define OV7725_BRIGHT 0x9B +#define OV7725_CNST 0x9C +#define OV7725_UVADJ0 0x9E +#define OV7725_UVADJ1 0x9F +#define OV7725_SCAL0 0xA0 +#define OV7725_SCAL1 0xA1 +#define OV7725_SCAL2 0xA2 +#define OV7725_SDE 0xA6 +#define OV7725_USAT 0xA7 +#define OV7725_VSAT 0xA8 +#define OV7725_HUECOS 0xA9 +#define OV7725_HUESIN 0xAA +#define OV7725_SIGN 0xAB +#define OV7725_DSPAuto 0xAC + + +#define OV7725_DEV_ADD 0x42>>1 + + +//配置摄像头参数 +#define OV7725_W 160 //定义摄像头图像宽度 可设置参数 80 160 240 320 +#define OV7725_H 120 //定义摄像头图像高度 可设置参数 60 120 180 240 +#define OV7725_SIZE (OV7725_W * OV7725_H/8 ) //图像占用空间大小 +#define OV7725_DMA_NUM (OV7725_SIZE) //一副图像DMA采集次数 + + +//-------------------------------------------------------------------------------------------------- +//引脚配置 +//-------------------------------------------------------------------------------------------------- +#define OV7725_VSYNC_PIN ERU_CH3_REQ6_P02_0 //场中断引脚 可选范围参考ERU_PIN_enum枚举 不可与像素引脚选择为同一个通道,或者是共用中断的通道 + //例如场中断选择ERU_CH3 那么像素引脚就不能选择ERU_CH7,因为3和7的中断是共用的。 + +#define OV7725_DATA_PIN P00_0 //定义D0数据引脚 假设D0定义为P00_0 那么D1所使用的引脚则为P00_1,依次类推 + //可设置参数P00_0、P02_0、P15_0,不能设置为其他参数 + +#define OV7725_PCLK_PIN ERU_CH2_REQ14_P02_1 //定义像素时钟引脚 可选范围参考ERU_PIN_enum枚举 不可与场中断引脚选择为同一个通道,或者是共用中断的通道 + //例如场中断选择ERU_CH3 那么像素引脚就不能选择ERU_CH7,因为3和7的中断是共用的。 + +#define OV7725_DMA_CH IfxDma_ChannelId_5 //定义使用的DMA通道 0-47可选 通道号越大优先级越低 + //修改此处之后,需要修改对应的ERU中断优先级,例如此处设置为IfxDma_ChannelId_5则对应的ERU中断优先级应该设置为5 + + + +extern uint8 image_bin[OV7725_H][OV7725_W/8]; //定义存储接收图像的数组 +extern uint8 image_dec[OV7725_H][OV7725_W]; //图像解压后的数组 + +extern uint8 ov7725_finish_flag; //图像采集完成标志位 + + +//函数声明 +uint8 ov7725_init(void); +void ov7725_vsync(void); +void ov7725_dma(void); +void image_decompression(uint8 *data1,uint8 *data2); +void seekfree_sendimg_7725(UARTN_enum uartn); + + + +#endif + + + diff --git a/Example/7-GPIO_Interrupt_Demo/Libraries/seekfree_peripheral/SEEKFREE_ICM20602.c b/Example/7-GPIO_Interrupt_Demo/Libraries/seekfree_peripheral/SEEKFREE_ICM20602.c index 095f9e3..5d167c9 100644 --- a/Example/7-GPIO_Interrupt_Demo/Libraries/seekfree_peripheral/SEEKFREE_ICM20602.c +++ b/Example/7-GPIO_Interrupt_Demo/Libraries/seekfree_peripheral/SEEKFREE_ICM20602.c @@ -68,6 +68,7 @@ void icm20602_self1_check(void) //------------------------------------------------------------------------------------------------------------------- void icm20602_init(void) { + simiic_init(); systick_delay_ms(STM0, 10); //上电延时 //检测 diff --git a/Example/7-GPIO_Interrupt_Demo/Libraries/seekfree_peripheral/SEEKFREE_IIC.c b/Example/7-GPIO_Interrupt_Demo/Libraries/seekfree_peripheral/SEEKFREE_IIC.c index 196fd57..f56a41a 100644 --- a/Example/7-GPIO_Interrupt_Demo/Libraries/seekfree_peripheral/SEEKFREE_IIC.c +++ b/Example/7-GPIO_Interrupt_Demo/Libraries/seekfree_peripheral/SEEKFREE_IIC.c @@ -50,7 +50,7 @@ uint8 IIC_num; // -static uint16 simiic_delay_time=100; //ICM等传感器应设置为100 +static uint16 simiic_delay_time = SIMIIC_DELAY_TIME; //ICM等传感器应设置为20 //------------------------------------------------------------------------------------------------------------------- diff --git a/Example/7-GPIO_Interrupt_Demo/Libraries/seekfree_peripheral/SEEKFREE_IIC.h b/Example/7-GPIO_Interrupt_Demo/Libraries/seekfree_peripheral/SEEKFREE_IIC.h index 293a02a..6a9c1e3 100644 --- a/Example/7-GPIO_Interrupt_Demo/Libraries/seekfree_peripheral/SEEKFREE_IIC.h +++ b/Example/7-GPIO_Interrupt_Demo/Libraries/seekfree_peripheral/SEEKFREE_IIC.h @@ -34,8 +34,12 @@ -#define SEEKFREE_SCL P13_0 //定义SCL引脚 可任意更改为其他IO -#define SEEKFREE_SDA P13_1 //定义SDA引脚 可任意更改为其他IO +#define SEEKFREE_SCL P02_3 //定义SCL引脚 可任意更改为其他IO +#define SEEKFREE_SDA P02_2 //定义SDA引脚 可任意更改为其他IO + + +#define SIMIIC_DELAY_TIME 20 + typedef enum IIC //DAC模块 { diff --git a/Example/7-GPIO_Interrupt_Demo/Libraries/seekfree_peripheral/SEEKFREE_L3G4200D.c b/Example/7-GPIO_Interrupt_Demo/Libraries/seekfree_peripheral/SEEKFREE_L3G4200D.c index 0f0c23a..5deb7d3 100644 --- a/Example/7-GPIO_Interrupt_Demo/Libraries/seekfree_peripheral/SEEKFREE_L3G4200D.c +++ b/Example/7-GPIO_Interrupt_Demo/Libraries/seekfree_peripheral/SEEKFREE_L3G4200D.c @@ -65,6 +65,7 @@ void l3g4200d_self_check(void) //------------------------------------------------------------------------------------------------------------------- void l3g4200d_init(void) { + simiic_init(); systick_delay_ms(STM0, 50); l3g4200d_self_check(); diff --git a/Example/7-GPIO_Interrupt_Demo/Libraries/seekfree_peripheral/SEEKFREE_MMA8451.c b/Example/7-GPIO_Interrupt_Demo/Libraries/seekfree_peripheral/SEEKFREE_MMA8451.c index c200427..8a5eec4 100644 --- a/Example/7-GPIO_Interrupt_Demo/Libraries/seekfree_peripheral/SEEKFREE_MMA8451.c +++ b/Example/7-GPIO_Interrupt_Demo/Libraries/seekfree_peripheral/SEEKFREE_MMA8451.c @@ -68,6 +68,7 @@ void mma8451_self_check(void) //------------------------------------------------------------------------------------------------------------------- uint8 mma845x_init(void) { + simiic_init(); systick_delay_ms(STM0, 50); mma8451_self_check(); diff --git a/Example/7-GPIO_Interrupt_Demo/Libraries/seekfree_peripheral/SEEKFREE_MPU6050.c b/Example/7-GPIO_Interrupt_Demo/Libraries/seekfree_peripheral/SEEKFREE_MPU6050.c index 0317aa0..686550d 100644 --- a/Example/7-GPIO_Interrupt_Demo/Libraries/seekfree_peripheral/SEEKFREE_MPU6050.c +++ b/Example/7-GPIO_Interrupt_Demo/Libraries/seekfree_peripheral/SEEKFREE_MPU6050.c @@ -71,6 +71,7 @@ void mpu6050_self1_check(void) //------------------------------------------------------------------------------------------------------------------- void mpu6050_init(void) { + simiic_init(); systick_delay_ms(STM0, 100); //上电延时 mpu6050_self1_check(); diff --git a/Example/7-GPIO_Interrupt_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.c b/Example/7-GPIO_Interrupt_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.c index 014b435..05f181f 100644 --- a/Example/7-GPIO_Interrupt_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.c +++ b/Example/7-GPIO_Interrupt_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.c @@ -38,7 +38,6 @@ #include "zf_gpio.h" #include "zf_eru.h" #include "zf_eru_dma.h" -#include "stdio.h" #include "SEEKFREE_MT9V03X.h" @@ -49,6 +48,8 @@ uint8 receive[3]; uint8 receive_num = 0; vuint8 uart_receive_flag; +uint8 link_list_num; + //需要配置到摄像头的数据 int16 MT9V03X_CFG[CONFIG_FINISH][2]= { @@ -305,7 +306,7 @@ void mt9v03x_init(void) gpio_init((PIN_enum)(MT9V03X_DATA_PIN+i), GPI, 0, PULLUP); } - eru_dma_init(MT9V03X_DMA_CH, GET_PORT_IN_ADDR(MT9V03X_DATA_PIN), mt9v03x_image[0], MT9V03X_PCLK_PIN, RISING, MT9V03X_W); + link_list_num = eru_dma_init(MT9V03X_DMA_CH, GET_PORT_IN_ADDR(MT9V03X_DATA_PIN), mt9v03x_image[0], MT9V03X_PCLK_PIN, RISING, MT9V03X_W*MT9V03X_H); eru_init(MT9V03X_VSYNC_PIN, FALLING); //初始化场中断,并设置为下降沿触发中断 restoreInterrupts(interrupt_state); @@ -313,7 +314,6 @@ void mt9v03x_init(void) uint8 mt9v03x_finish_flag = 0; //一场图像采集完成标志位 -uint8 now_col; //当前正在采集的行 //------------------------------------------------------------------------------------------------------------------- // @brief MT9V03X摄像头场中断 // @param NULL @@ -324,16 +324,15 @@ uint8 now_col; // void mt9v03x_vsync(void) { CLEAR_GPIO_FLAG(MT9V03X_VSYNC_PIN); - now_col = 0; + if(!mt9v03x_finish_flag)//查看图像数组是否使用完毕,如果未使用完毕则不开始采集,避免出现访问冲突 { - DMA_SET_DESTINATION(MT9V03X_DMA_CH, (void *)&mt9v03x_image[0]); dma_start(MT9V03X_DMA_CH); } } - +uint8 mt9v03x_dma_int_num; //当前DMA中断次数 //------------------------------------------------------------------------------------------------------------------- // @brief MT9V03X摄像头DMA完成中断 // @param NULL @@ -344,16 +343,15 @@ void mt9v03x_vsync(void) void mt9v03x_dma(void) { CLEAR_DMA_FLAG(MT9V03X_DMA_CH); + mt9v03x_dma_int_num++; - now_col++; - - if(MT9V03X_H > now_col) - { - dma_start(MT9V03X_DMA_CH); - } - else + if(mt9v03x_dma_int_num >= link_list_num) { + //采集完成 + mt9v03x_dma_int_num = 0; mt9v03x_finish_flag = 1;//一副图像从采集开始到采集结束耗时3.8MS左右(50FPS、188*120分辨率) + dma_stop(MT9V03X_DMA_CH); + } } diff --git a/Example/7-GPIO_Interrupt_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.h b/Example/7-GPIO_Interrupt_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.h index a29edd2..0c8a785 100644 --- a/Example/7-GPIO_Interrupt_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.h +++ b/Example/7-GPIO_Interrupt_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.h @@ -63,9 +63,7 @@ //例如场中断选择ERU_CH3 那么像素引脚就不能选择ERU_CH7,因为3和7的中断是共用的。 #define MT9V03X_DMA_CH IfxDma_ChannelId_5 //定义使用的DMA通道 0-47可选 通道号越大优先级越低 - //修改此处之后,需要修改对应的ERU中断优先级,例如此处设置为IfxDma_ChannelId_5则对应的ERU中断优先级应该设置为5 - - + //摄像头命令枚举 typedef enum { diff --git a/Example/7-GPIO_Interrupt_Demo/USER/isr.c b/Example/7-GPIO_Interrupt_Demo/USER/isr.c index f7e3966..c6376b0 100644 --- a/Example/7-GPIO_Interrupt_Demo/USER/isr.c +++ b/Example/7-GPIO_Interrupt_Demo/USER/isr.c @@ -55,13 +55,11 @@ IFX_INTERRUPT(eru_ch0_ch4_isr, ERU_CH0_CH4_INT_SERVICE, ERU_CH0_CH4_INT_PRIO) if(GET_GPIO_FLAG(ERU_CH0_REQ4_P10_7))//通道0中断 { CLEAR_GPIO_FLAG(ERU_CH0_REQ4_P10_7); - printf("eru ch0 be triggered\n"); } if(GET_GPIO_FLAG(ERU_CH4_REQ13_P15_5))//通道4中断 { CLEAR_GPIO_FLAG(ERU_CH4_REQ13_P15_5); - printf("eru ch4 be triggered\n"); } } @@ -70,13 +68,11 @@ IFX_INTERRUPT(eru_ch1_ch5_isr, ERU_CH1_CH5_INT_SERVICE, ERU_CH1_CH5_INT_PRIO) if(GET_GPIO_FLAG(ERU_CH1_REQ5_P10_8))//通道1中断 { CLEAR_GPIO_FLAG(ERU_CH1_REQ5_P10_8); - printf("eru ch1 be triggered\n"); } if(GET_GPIO_FLAG(ERU_CH5_REQ1_P15_8))//通道5中断 { CLEAR_GPIO_FLAG(ERU_CH5_REQ1_P15_8); - printf("eru ch5 be triggered\n"); } } @@ -102,7 +98,8 @@ IFX_INTERRUPT(eru_ch3_ch7_isr, ERU_CH3_CH7_INT_SERVICE, ERU_CH3_CH7_INT_PRIO) if(GET_GPIO_FLAG(ERU_CH3_REQ6_P02_0))//通道3中断 { CLEAR_GPIO_FLAG(ERU_CH3_REQ6_P02_0); - if(1 == camera_type)mt9v03x_vsync(); + if (1 == camera_type) mt9v03x_vsync(); + else if (3 == camera_type) ov7725_vsync(); } if(GET_GPIO_FLAG(ERU_CH7_REQ16_P15_1))//通道7中断 @@ -117,7 +114,8 @@ IFX_INTERRUPT(eru_ch3_ch7_isr, ERU_CH3_CH7_INT_SERVICE, ERU_CH3_CH7_INT_PRIO) IFX_INTERRUPT(dma_ch5_isr, ERU_DMA_INT_SERVICE, ERU_DMA_INT_PRIO) { - if(1 == camera_type) mt9v03x_dma(); + if (1 == camera_type) mt9v03x_dma(); + else if (3 == camera_type) ov7725_dma(); } diff --git a/Example/8-EEPROM_Demo/Libraries/doc/version.txt b/Example/8-EEPROM_Demo/Libraries/doc/version.txt index b85cd50..a42bc58 100644 --- a/Example/8-EEPROM_Demo/Libraries/doc/version.txt +++ b/Example/8-EEPROM_Demo/Libraries/doc/version.txt @@ -1,9 +1,17 @@ V1.0.0 - 初始版本 + 初始版本 V1.0.1 对总钻风摄像头的场中断进行修改,判断标志位为0才采集下一幅图像,避免出现访问冲突 修改SPI初始化中的错误,引用了固定的SPI2基地址 修复STM中无法使用STM1的问题 - 修复gtm pwm中最大占空比只有GTM_ATOM0_PWM_DUTY_MAX设置有效的问题 \ No newline at end of file + 修复gtm pwm中最大占空比只有GTM_ATOM0_PWM_DUTY_MAX设置有效的问题 + +V1.0.2 + 修改模拟IIC默认延时时间为20 + 添加 需要特别注意P20_2是不能用于输出的,仅仅只有输入的功能 注意事项 + 将摄像头采集DMA改为link传输,可以大大降低DMA中断次数 + 修改默认的软件IIC引脚定义 + 将6050等 需要用到软件IIC的模块,在初始化函数中默认调用模拟IIC初始化 + 添加小钻风驱动程序 \ No newline at end of file diff --git a/Example/8-EEPROM_Demo/Libraries/seekfree_libraries/common/common.c b/Example/8-EEPROM_Demo/Libraries/seekfree_libraries/common/common.c index 0460d15..ac42b19 100644 --- a/Example/8-EEPROM_Demo/Libraries/seekfree_libraries/common/common.c +++ b/Example/8-EEPROM_Demo/Libraries/seekfree_libraries/common/common.c @@ -22,7 +22,7 @@ #include "SysSe/Bsp/Bsp.h" #include "common.h" -uint8 camera_type; +uint8 camera_type; //摄像头型号 1:总钻风 2:凌瞳(暂未支持)3:小钻风 diff --git a/Example/8-EEPROM_Demo/Libraries/seekfree_libraries/common/common.h b/Example/8-EEPROM_Demo/Libraries/seekfree_libraries/common/common.h index fe7ec63..13d03cd 100644 --- a/Example/8-EEPROM_Demo/Libraries/seekfree_libraries/common/common.h +++ b/Example/8-EEPROM_Demo/Libraries/seekfree_libraries/common/common.h @@ -111,7 +111,7 @@ typedef enum //枚 #include -extern uint8 camera_type; +extern uint8 camera_type; //摄像头型号 1:总钻风 2:凌瞳(暂未支持)3:小钻风 void get_clk(void); diff --git a/Example/8-EEPROM_Demo/Libraries/seekfree_libraries/headfile.h b/Example/8-EEPROM_Demo/Libraries/seekfree_libraries/headfile.h index 0e8024f..e11bd83 100644 --- a/Example/8-EEPROM_Demo/Libraries/seekfree_libraries/headfile.h +++ b/Example/8-EEPROM_Demo/Libraries/seekfree_libraries/headfile.h @@ -62,6 +62,7 @@ #include "SEEKFREE_L3G4200D.h" #include "SEEKFREE_WIRELESS.h" #include "SEEKFREE_IPS200_PARALLEL8.h" +#include "SEEKFREE_7725.h" #endif diff --git a/Example/8-EEPROM_Demo/Libraries/seekfree_libraries/zf_eru_dma.c b/Example/8-EEPROM_Demo/Libraries/seekfree_libraries/zf_eru_dma.c index f7aab10..86c0158 100644 --- a/Example/8-EEPROM_Demo/Libraries/seekfree_libraries/zf_eru_dma.c +++ b/Example/8-EEPROM_Demo/Libraries/seekfree_libraries/zf_eru_dma.c @@ -21,9 +21,18 @@ #include "IfxDma_Dma.h" #include "IfxScuEru.h" #include "isr_config.h" +#include "zf_assert.h" #include "zf_eru_dma.h" +typedef struct +{ + Ifx_DMA_CH IFX_ALIGN(256) linked_list[8];//DMA链表 + IfxDma_Dma_Channel channel; //DMA通道句柄 +}DMA_LINK; + + +DMA_LINK dma_link_list; //------------------------------------------------------------------------------------------------------------------- // @brief eru触发dma初始化 @@ -36,7 +45,7 @@ // @return void // Sample usage: //------------------------------------------------------------------------------------------------------------------- -void eru_dma_init(IfxDma_ChannelId dma_ch, uint8 *source_addr, uint8 *destination_addr, ERU_PIN_enum eru_pin, TRIGGER_enum trigger, uint16 dma_count) +uint8 eru_dma_init(IfxDma_ChannelId dma_ch, uint8 *source_addr, uint8 *destination_addr, ERU_PIN_enum eru_pin, TRIGGER_enum trigger, uint16 dma_count) { IfxDma_Dma_Channel dmaChn; //eru触发DMA通道号 在eru文件中设置eru的优先级,即为触发的通道 @@ -51,27 +60,85 @@ void eru_dma_init(IfxDma_ChannelId dma_ch, uint8 *source_addr, uint8 *destinatio IfxDma_Dma_ChannelConfig cfg; IfxDma_Dma_initChannelConfig(&cfg, &dma); - cfg.transferCount = dma_count; + uint8 list_num, i; + uint16 single_channel_dma_count; + + ZF_ASSERT(!(dma_count%8));//传输次数必须为8的倍数 + + + list_num = 1; + single_channel_dma_count = dma_count / list_num; + if(16384 < single_channel_dma_count) + { + while(TRUE) + { + single_channel_dma_count = dma_count / list_num; + if((single_channel_dma_count <= 16384) && !(dma_count % list_num)) + { + break; + } + list_num++; + if(list_num > 8) ZF_ASSERT(FALSE); + } + } + + + if(1 == list_num) + { + cfg.shadowControl = IfxDma_ChannelShadow_none; + cfg.operationMode = IfxDma_ChannelOperationMode_single; + cfg.shadowAddress = 0; + } + else + { + cfg.shadowControl = IfxDma_ChannelShadow_linkedList; + cfg.operationMode = IfxDma_ChannelOperationMode_continuous; + cfg.shadowAddress = IFXCPU_GLB_ADDR_DSPR(IfxCpu_getCoreId(), (unsigned)&dma_link_list.linked_list[1]); + } + cfg.requestMode = IfxDma_ChannelRequestMode_oneTransferPerRequest; cfg.moveSize = IfxDma_ChannelMoveSize_8bit; + cfg.busPriority = IfxDma_ChannelBusPriority_high; - cfg.busPriority = IfxDma_ChannelBusPriority_high; - - cfg.sourceAddress = (unsigned)(source_addr); + cfg.sourceAddress = IFXCPU_GLB_ADDR_DSPR(IfxCpu_getCoreId(), source_addr); cfg.sourceAddressCircularRange = IfxDma_ChannelIncrementCircular_none; cfg.sourceCircularBufferEnabled = TRUE; - cfg.destinationAddress = IFXCPU_GLB_ADDR_DSPR(IfxCpu_getCoreId(), destination_addr); cfg.destinationAddressIncrementStep = IfxDma_ChannelIncrementStep_1; - cfg.operationMode = IfxDma_ChannelOperationMode_single; - cfg.channelId = (IfxDma_ChannelId)dma_ch; - cfg.hardwareRequestEnabled = TRUE; - cfg.channelInterruptEnabled = TRUE; + cfg.channelId = (IfxDma_ChannelId)dma_ch; + cfg.hardwareRequestEnabled = FALSE; + cfg.channelInterruptEnabled = TRUE; cfg.channelInterruptPriority = ERU_DMA_INT_PRIO; cfg.channelInterruptTypeOfService = (IfxSrc_Tos)ERU_DMA_INT_SERVICE; + + + cfg.destinationAddress = IFXCPU_GLB_ADDR_DSPR(IfxCpu_getCoreId(), destination_addr); + + cfg.transferCount = single_channel_dma_count; + IfxDma_Dma_initChannel(&dmaChn, &cfg); + + if(1 < list_num) + { + i = 0; + while(i < list_num) + { + cfg.destinationAddress = IFXCPU_GLB_ADDR_DSPR(IfxCpu_getCoreId(), destination_addr + single_channel_dma_count * i); + if(i == (list_num - 1)) cfg.shadowAddress = IFXCPU_GLB_ADDR_DSPR(IfxCpu_getCoreId(), (unsigned)&dma_link_list.linked_list[0]); + else cfg.shadowAddress = IFXCPU_GLB_ADDR_DSPR(IfxCpu_getCoreId(), (unsigned)&dma_link_list.linked_list[i+1]); + cfg.transferCount = single_channel_dma_count; + + IfxDma_Dma_initLinkedListEntry((void *)&dma_link_list.linked_list[i], &cfg); + i++; + } + } + + + IfxDma_Dma_getSrcPointer(&dma_link_list.channel)->B.CLRR = 1; + + return list_num; } diff --git a/Example/8-EEPROM_Demo/Libraries/seekfree_libraries/zf_eru_dma.h b/Example/8-EEPROM_Demo/Libraries/seekfree_libraries/zf_eru_dma.h index 50667ad..faef169 100644 --- a/Example/8-EEPROM_Demo/Libraries/seekfree_libraries/zf_eru_dma.h +++ b/Example/8-EEPROM_Demo/Libraries/seekfree_libraries/zf_eru_dma.h @@ -29,9 +29,9 @@ #define CLEAR_DMA_FLAG(dma_ch) IfxDma_clearChannelInterrupt(&MODULE_DMA, dma_ch); -#define DMA_SET_DESTINATION(dma_ch, destination_addr) IfxDma_setChannelDestinationAddress(&MODULE_DMA, dma_ch, (void *)destination_addr) +#define DMA_SET_DESTINATION(dma_ch, destination_addr) IfxDma_setChannelDestinationAddress(&MODULE_DMA, dma_ch, (void *)IFXCPU_GLB_ADDR_DSPR(IfxCpu_getCoreId(), destination_addr)) -void eru_dma_init(IfxDma_ChannelId dma_ch, uint8 *source_addr, uint8 *destination_addr, ERU_PIN_enum eru_pin, TRIGGER_enum trigger, uint16 dma_count); +uint8 eru_dma_init(IfxDma_ChannelId dma_ch, uint8 *source_addr, uint8 *destination_addr, ERU_PIN_enum eru_pin, TRIGGER_enum trigger, uint16 dma_count); void dma_stop(IfxDma_ChannelId dma_ch); void dma_start(IfxDma_ChannelId dma_ch); diff --git a/Example/8-EEPROM_Demo/Libraries/seekfree_libraries/zf_gpio.c b/Example/8-EEPROM_Demo/Libraries/seekfree_libraries/zf_gpio.c index 3c937cf..1d2466c 100644 --- a/Example/8-EEPROM_Demo/Libraries/seekfree_libraries/zf_gpio.c +++ b/Example/8-EEPROM_Demo/Libraries/seekfree_libraries/zf_gpio.c @@ -60,6 +60,7 @@ Ifx_P* get_port(PIN_enum pin) // @param pinmode 引脚配置(可设置参数由zf_gpio.h文件内GPIOMODE_enum枚举值确定) // @return void // Sample usage: gpio_init(P00_0, GPO, 1, PUSHPULL);//P00_0初始化为GPIO功能、输出模式、输出高电平、推挽输出 +// @note 需要特别注意P20_2是不能用于输出的,仅仅只有输入的功能 //------------------------------------------------------------------------------------------------------------------- void gpio_init(PIN_enum pin, GPIODIR_enum dir, uint8 dat, GPIOMODE_enum pinmode) { diff --git a/Example/8-EEPROM_Demo/Libraries/seekfree_libraries/zf_gpio.h b/Example/8-EEPROM_Demo/Libraries/seekfree_libraries/zf_gpio.h index cfbd666..e3d144f 100644 --- a/Example/8-EEPROM_Demo/Libraries/seekfree_libraries/zf_gpio.h +++ b/Example/8-EEPROM_Demo/Libraries/seekfree_libraries/zf_gpio.h @@ -38,6 +38,15 @@ typedef enum // 枚 #define GET_PORT_IN_ADDR(pin) (uint8 *)(&IfxPort_getAddress((IfxPort_Index)(pin/32))->IN + pin%32/8) + + +//需要特别注意P20_2是不能用于输出的,仅仅只有输入的功能 +//需要特别注意P20_2是不能用于输出的,仅仅只有输入的功能 +//需要特别注意P20_2是不能用于输出的,仅仅只有输入的功能 + + + + //------------------------------------------------------ //通用GPIO操作 void gpio_init(PIN_enum pin, GPIODIR_enum dir, uint8 dat, GPIOMODE_enum pinconf); diff --git a/Example/8-EEPROM_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.c b/Example/8-EEPROM_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.c new file mode 100644 index 0000000..806b8d9 --- /dev/null +++ b/Example/8-EEPROM_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.c @@ -0,0 +1,262 @@ +/********************************************************************************************************************* + * COPYRIGHT NOTICE + * Copyright (c) 2020,逐飞科技 + * All rights reserved. + * 技术讨论QQ群:三群:824575535 + * + * 以下所有内容版权均属逐飞科技所有,未经允许不得用于商业用途, + * 欢迎各位使用并传播本程序,修改内容时必须保留逐飞科技的版权声明。 + * + * @file main + * @company 成都逐飞科技有限公司 + * @author 逐飞科技(QQ3184284598) + * @version 查看doc内version文件 版本说明 + * @Software tasking v6.3r1 + * @Target core TC264D + * @Taobao https://seekfree.taobao.com/ + * @date 2020-3-23 + * @note + 接线定义: + ------------------------------------ + 模块管脚 单片机管脚 + SDA 查看SEEKFREE_IIC文件内的SEEKFREE_SDA宏定义 + SCL 查看SEEKFREE_IIC文件内的SEEKFREE_SCL宏定义 + 场中断(VSY) 查看SEEKFREE_OV7725.h文件中的OV7725_VSYNC_PIN宏定义 + 行中断(HREF) 未使用,因此不接 + 像素中断(PCLK) 查看SEEKFREE_OV7725.h文件中的OV7725_PCLK_PIN宏定义 + 数据口(D0-D7) 查看SEEKFREE_OV7725.h文件中的OV7725_DATA_PIN宏定义 + ------------------------------------ + + 默认分辨率是 160*120 + 默认FPS 50帧 + ********************************************************************************************************************/ + + +#include "IfxDma.h" +#include "IfxScuEru.h" +#include "zf_stm_systick.h" +#include "zf_gpio.h" +#include "zf_eru.h" +#include "zf_eru_dma.h" +#include "SEEKFREE_IIC.h" +#include "SEEKFREE_7725.h" + + + +IFX_ALIGN(4) uint8 image_bin[OV7725_H][OV7725_W/8]; //定义存储接收图像的数组 +uint8 image_dec[OV7725_H][OV7725_W]; + +uint8 ov7725_idcode = 0; + +//------------------------------------------------------------------------------------------------------------------- +// @brief 小钻风摄像头内部寄存器初始化(内部使用,用户无需调用) +// @param NULL +// @return uint8 返回0则出错,返回1则成功 +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +uint8 ov7725_reg_init(void) +{ + simiic_delay_set(500); + simiic_write_reg ( OV7725_DEV_ADD, OV7725_COM7, 0x80 ); //复位摄像头 + systick_delay_ms(STM0, 50); + ov7725_idcode = simiic_read_reg( OV7725_DEV_ADD, OV7725_VER ,SCCB); + if( ov7725_idcode != OV7725_ID ) return 0; //校验摄像头ID号 + + //ID号确认无误 然后配置寄存器 + simiic_write_reg(OV7725_DEV_ADD, OV7725_COM4 , 0xC1); + simiic_write_reg(OV7725_DEV_ADD, OV7725_CLKRC , 0x01); + simiic_write_reg(OV7725_DEV_ADD, OV7725_COM2 , 0x03); + simiic_write_reg(OV7725_DEV_ADD, OV7725_COM3 , 0xD0); + simiic_write_reg(OV7725_DEV_ADD, OV7725_COM7 , 0x40); + simiic_write_reg(OV7725_DEV_ADD, OV7725_COM8 , 0xCE); //0xCE:关闭自动曝光 0xCF:开启自动曝光 + simiic_write_reg(OV7725_DEV_ADD, OV7725_HSTART , 0x3F); + simiic_write_reg(OV7725_DEV_ADD, OV7725_HSIZE , 0x50); + simiic_write_reg(OV7725_DEV_ADD, OV7725_VSTRT , 0x03); + simiic_write_reg(OV7725_DEV_ADD, OV7725_VSIZE , 0x78); + simiic_write_reg(OV7725_DEV_ADD, OV7725_HREF , 0x00); + simiic_write_reg(OV7725_DEV_ADD, OV7725_SCAL0 , 0x0A); + simiic_write_reg(OV7725_DEV_ADD, OV7725_AWB_Ctrl0 , 0xE0); + simiic_write_reg(OV7725_DEV_ADD, OV7725_DSPAuto , 0xff); + simiic_write_reg(OV7725_DEV_ADD, OV7725_DSP_Ctrl2 , 0x0C); + simiic_write_reg(OV7725_DEV_ADD, OV7725_DSP_Ctrl3 , 0x00); + simiic_write_reg(OV7725_DEV_ADD, OV7725_DSP_Ctrl4 , 0x00); + + if(OV7725_W == 80) simiic_write_reg(OV7725_DEV_ADD, OV7725_HOutSize , 0x14); + else if(OV7725_W == 160) simiic_write_reg(OV7725_DEV_ADD, OV7725_HOutSize , 0x28); + else if(OV7725_W == 240) simiic_write_reg(OV7725_DEV_ADD, OV7725_HOutSize , 0x3c); + else if(OV7725_W == 320) simiic_write_reg(OV7725_DEV_ADD, OV7725_HOutSize , 0x50); + + if(OV7725_H == 60) simiic_write_reg(OV7725_DEV_ADD, OV7725_VOutSize , 0x1E); + else if(OV7725_H == 120) simiic_write_reg(OV7725_DEV_ADD, OV7725_VOutSize , 0x3c); + else if(OV7725_H == 180) simiic_write_reg(OV7725_DEV_ADD, OV7725_VOutSize , 0x5a); + else if(OV7725_H == 240) simiic_write_reg(OV7725_DEV_ADD, OV7725_VOutSize , 0x78); + + simiic_write_reg(OV7725_DEV_ADD, OV7725_REG28 , 0x01); + simiic_write_reg(OV7725_DEV_ADD, OV7725_EXHCH , 0x10); + simiic_write_reg(OV7725_DEV_ADD, OV7725_EXHCL , 0x1F); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM1 , 0x0c); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM2 , 0x16); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM3 , 0x2a); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM4 , 0x4e); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM5 , 0x61); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM6 , 0x6f); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM7 , 0x7b); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM8 , 0x86); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM9 , 0x8e); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM10 , 0x97); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM11 , 0xa4); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM12 , 0xaf); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM13 , 0xc5); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM14 , 0xd7); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM15 , 0xe8); + simiic_write_reg(OV7725_DEV_ADD, OV7725_SLOP , 0x20); + simiic_write_reg(OV7725_DEV_ADD, OV7725_LC_RADI , 0x00); + simiic_write_reg(OV7725_DEV_ADD, OV7725_LC_COEF , 0x13); + simiic_write_reg(OV7725_DEV_ADD, OV7725_LC_XC , 0x08); + simiic_write_reg(OV7725_DEV_ADD, OV7725_LC_COEFB , 0x14); + simiic_write_reg(OV7725_DEV_ADD, OV7725_LC_COEFR , 0x17); + simiic_write_reg(OV7725_DEV_ADD, OV7725_LC_CTR , 0x05); + simiic_write_reg(OV7725_DEV_ADD, OV7725_BDBase , 0x99); + simiic_write_reg(OV7725_DEV_ADD, OV7725_BDMStep , 0x03); + simiic_write_reg(OV7725_DEV_ADD, OV7725_SDE , 0x04); + simiic_write_reg(OV7725_DEV_ADD, OV7725_BRIGHT , 0x00); + simiic_write_reg(OV7725_DEV_ADD, OV7725_CNST , 0x40); + simiic_write_reg(OV7725_DEV_ADD, OV7725_SIGN , 0x06); + simiic_write_reg(OV7725_DEV_ADD, OV7725_UVADJ0 , 0x11); + simiic_write_reg(OV7725_DEV_ADD, OV7725_UVADJ1 , 0x02); + + + simiic_delay_set(SIMIIC_DELAY_TIME);//修改为默认的20 + return 1; + + +} + + + + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 小钻风摄像头采集程序初始化(内部使用,用户无需调用) +// @param NULL +// @return void +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +void ov7725_port_init(void) +{ + uint8 i; + camera_type = 3;//设置连接摄像头类型 + + //摄像头采集初始化 + //初始化 数据引脚 + for(i=0; i<8; i++) + { + gpio_init((PIN_enum)(OV7725_DATA_PIN+i), GPI, 0, PULLUP); + } + eru_dma_init(OV7725_DMA_CH, GET_PORT_IN_ADDR(OV7725_DATA_PIN), image_bin[0], OV7725_PCLK_PIN, FALLING, OV7725_DMA_NUM); + eru_init(OV7725_VSYNC_PIN, FALLING); //初始化场中断,并设置为下降沿触发中断 + +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 小钻风摄像头初始化(调用之后设置好相关中断函数即可采集图像) +// @param NULL +// @return 0 +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +uint8 ov7725_init(void) +{ + simiic_init(); + ov7725_reg_init(); //摄像头寄存器配置 + ov7725_port_init(); //摄像头中断引脚及DMA配置 + return 0; +} + + + + +uint8 ov7725_finish_flag = 0; +//------------------------------------------------------------------------------------------------------------------- +// @brief 小钻风摄像头场中断 +// @param NULL +// @return void +// @since v1.0 +// Sample usage: 此函数在isr.c中被eru(GPIO中断)中断调用 +//------------------------------------------------------------------------------------------------------------------- +void ov7725_vsync(void) +{ + CLEAR_GPIO_FLAG(OV7725_VSYNC_PIN); + + if(!ov7725_finish_flag)//查看图像数组是否使用完毕,如果未使用完毕则不开始采集,避免出现访问冲突 + { + DMA_SET_DESTINATION(OV7725_DMA_CH, image_bin[0]); + dma_start(OV7725_DMA_CH); + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 小钻风摄像头DMA完成中断 +// @param NULL +// @return void +// @since v1.0 +// Sample usage: 此函数在isr.c中被dma中断调用 +//------------------------------------------------------------------------------------------------------------------- +void ov7725_dma(void) +{ + CLEAR_DMA_FLAG(OV7725_DMA_CH); + ov7725_finish_flag = 1; + dma_stop(OV7725_DMA_CH); +} + + + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 小钻风摄像头数据解压函数 +// @param *data1 源地址 +// @param *data2 目的地址 +// @return void +// @since v1.0 +// Sample usage: Image_Decompression(da1,dat2[0]);//将一维数组dat1的内容解压到二维数组dat2里. +//------------------------------------------------------------------------------------------------------------------- +void image_decompression(uint8 *data1,uint8 *data2) +{ + uint8 temp[2] = {0,255}; + uint16 lenth = OV7725_SIZE; + uint8 i = 8; + + + while(lenth--) + { + i = 8; + while(i--) + { + *data2++ = temp[(*data1 >> i) & 0x01]; + } + data1++; + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 小钻风摄像头未解压图像发送至上位机查看图像 +// @param *imgaddr 压缩图像数据地址 +// @param *imgsize 图像大小(直接填写OV7725_SIZE) +// @return void +// @since v1.0 +// Sample usage: 调用该函数前请先初始化uart2 +//------------------------------------------------------------------------------------------------------------------- +void seekfree_sendimg_7725(UARTN_enum uartn) +{ + uart_putchar(uartn, 0x00);uart_putchar(uartn, 0xff);uart_putchar(uartn, 0x01);uart_putchar(uartn, 0x01);//发送四个字节命令 + uart_putbuff(uartn, image_bin[0], OV7725_SIZE); //再发送图像 +} + + + + diff --git a/Example/8-EEPROM_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.h b/Example/8-EEPROM_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.h new file mode 100644 index 0000000..e513250 --- /dev/null +++ b/Example/8-EEPROM_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.h @@ -0,0 +1,243 @@ +/********************************************************************************************************************* + * COPYRIGHT NOTICE + * Copyright (c) 2020,逐飞科技 + * All rights reserved. + * 技术讨论QQ群:三群:824575535 + * + * 以下所有内容版权均属逐飞科技所有,未经允许不得用于商业用途, + * 欢迎各位使用并传播本程序,修改内容时必须保留逐飞科技的版权声明。 + * + * @file main + * @company 成都逐飞科技有限公司 + * @author 逐飞科技(QQ3184284598) + * @version 查看doc内version文件 版本说明 + * @Software tasking v6.3r1 + * @Target core TC264D + * @Taobao https://seekfree.taobao.com/ + * @date 2020-3-23 + * @note + 接线定义: + ------------------------------------ + 模块管脚 单片机管脚 + SDA 查看SEEKFREE_IIC文件内的SEEKFREE_SDA宏定义 + SCL 查看SEEKFREE_IIC文件内的SEEKFREE_SCL宏定义 + 场中断(VSY) 查看SEEKFREE_OV7725.h文件中的OV7725_VSYNC_PIN宏定义 + 行中断(HREF) 未使用,因此不接 + 像素中断(PCLK) 查看SEEKFREE_OV7725.h文件中的OV7725_PCLK_PIN宏定义 + 数据口(D0-D7) 查看SEEKFREE_OV7725.h文件中的OV7725_DATA_PIN宏定义 + ------------------------------------ + + 默认分辨率是 160*120 + 默认FPS 50帧 + ********************************************************************************************************************/ + + + +#ifndef _SEEKFREE_7725_h +#define _SEEKFREE_7725_h + +#include "common.h" +#include "IfxDma_cfg.h" +#include "zf_uart.h" + + +//摄像头ID号 +#define OV7725_ID 0x21 + +//摄像头寄存器 +#define OV7725_GAIN 0x00 +#define OV7725_BLUE 0x01 +#define OV7725_RED 0x02 +#define OV7725_GREEN 0x03 +#define OV7725_BAVG 0x05 +#define OV7725_GAVG 0x06 +#define OV7725_RAVG 0x07 +#define OV7725_AECH 0x08 +#define OV7725_COM2 0x09 +#define OV7725_PID 0x0A +#define OV7725_VER 0x0B +#define OV7725_COM3 0x0C +#define OV7725_COM4 0x0D +#define OV7725_COM5 0x0E +#define OV7725_COM6 0x0F +#define OV7725_AEC 0x10 +#define OV7725_CLKRC 0x11 +#define OV7725_COM7 0x12 +#define OV7725_COM8 0x13 +#define OV7725_COM9 0x14 +#define OV7725_COM10 0x15 +#define OV7725_REG16 0x16 +#define OV7725_HSTART 0x17 +#define OV7725_HSIZE 0x18 +#define OV7725_VSTRT 0x19 +#define OV7725_VSIZE 0x1A +#define OV7725_PSHFT 0x1B +#define OV7725_MIDH 0x1C +#define OV7725_MIDL 0x1D +#define OV7725_LAEC 0x1F +#define OV7725_COM11 0x20 +#define OV7725_BDBase 0x22 +#define OV7725_BDMStep 0x23 +#define OV7725_AEW 0x24 +#define OV7725_AEB 0x25 +#define OV7725_VPT 0x26 +#define OV7725_REG28 0x28 +#define OV7725_HOutSize 0x29 +#define OV7725_EXHCH 0x2A +#define OV7725_EXHCL 0x2B +#define OV7725_VOutSize 0x2C +#define OV7725_ADVFL 0x2D +#define OV7725_ADVFH 0x2E +#define OV7725_YAVE 0x2F +#define OV7725_LumHTh 0x30 +#define OV7725_LumLTh 0x31 +#define OV7725_HREF 0x32 +#define OV7725_DM_LNL 0x33 +#define OV7725_DM_LNH 0x34 +#define OV7725_ADoff_B 0x35 +#define OV7725_ADoff_R 0x36 +#define OV7725_ADoff_Gb 0x37 +#define OV7725_ADoff_Gr 0x38 +#define OV7725_Off_B 0x39 +#define OV7725_Off_R 0x3A +#define OV7725_Off_Gb 0x3B +#define OV7725_Off_Gr 0x3C +#define OV7725_COM12 0x3D +#define OV7725_COM13 0x3E +#define OV7725_COM14 0x3F +#define OV7725_COM16 0x41 +#define OV7725_TGT_B 0x42 +#define OV7725_TGT_R 0x43 +#define OV7725_TGT_Gb 0x44 +#define OV7725_TGT_Gr 0x45 +#define OV7725_LC_CTR 0x46 +#define OV7725_LC_XC 0x47 +#define OV7725_LC_YC 0x48 +#define OV7725_LC_COEF 0x49 +#define OV7725_LC_RADI 0x4A +#define OV7725_LC_COEFB 0x4B +#define OV7725_LC_COEFR 0x4C +#define OV7725_FixGain 0x4D +#define OV7725_AREF1 0x4F +#define OV7725_AREF6 0x54 +#define OV7725_UFix 0x60 +#define OV7725_VFix 0x61 +#define OV7725_AWBb_blk 0x62 +#define OV7725_AWB_Ctrl0 0x63 +#define OV7725_DSP_Ctrl1 0x64 +#define OV7725_DSP_Ctrl2 0x65 +#define OV7725_DSP_Ctrl3 0x66 +#define OV7725_DSP_Ctrl4 0x67 +#define OV7725_AWB_bias 0x68 +#define OV7725_AWBCtrl1 0x69 +#define OV7725_AWBCtrl2 0x6A +#define OV7725_AWBCtrl3 0x6B +#define OV7725_AWBCtrl4 0x6C +#define OV7725_AWBCtrl5 0x6D +#define OV7725_AWBCtrl6 0x6E +#define OV7725_AWBCtrl7 0x6F +#define OV7725_AWBCtrl8 0x70 +#define OV7725_AWBCtrl9 0x71 +#define OV7725_AWBCtrl10 0x72 +#define OV7725_AWBCtrl11 0x73 +#define OV7725_AWBCtrl12 0x74 +#define OV7725_AWBCtrl13 0x75 +#define OV7725_AWBCtrl14 0x76 +#define OV7725_AWBCtrl15 0x77 +#define OV7725_AWBCtrl16 0x78 +#define OV7725_AWBCtrl17 0x79 +#define OV7725_AWBCtrl18 0x7A +#define OV7725_AWBCtrl19 0x7B +#define OV7725_AWBCtrl20 0x7C +#define OV7725_AWBCtrl21 0x7D +#define OV7725_GAM1 0x7E +#define OV7725_GAM2 0x7F +#define OV7725_GAM3 0x80 +#define OV7725_GAM4 0x81 +#define OV7725_GAM5 0x82 +#define OV7725_GAM6 0x83 +#define OV7725_GAM7 0x84 +#define OV7725_GAM8 0x85 +#define OV7725_GAM9 0x86 +#define OV7725_GAM10 0x87 +#define OV7725_GAM11 0x88 +#define OV7725_GAM12 0x89 +#define OV7725_GAM13 0x8A +#define OV7725_GAM14 0x8B +#define OV7725_GAM15 0x8C +#define OV7725_SLOP 0x8D +#define OV7725_DNSTh 0x8E +#define OV7725_EDGE0 0x8F +#define OV7725_EDGE1 0x90 +#define OV7725_DNSOff 0x91 +#define OV7725_EDGE2 0x92 +#define OV7725_EDGE3 0x93 +#define OV7725_MTX1 0x94 +#define OV7725_MTX2 0x95 +#define OV7725_MTX3 0x96 +#define OV7725_MTX4 0x97 +#define OV7725_MTX5 0x98 +#define OV7725_MTX6 0x99 +#define OV7725_MTX_Ctrl 0x9A +#define OV7725_BRIGHT 0x9B +#define OV7725_CNST 0x9C +#define OV7725_UVADJ0 0x9E +#define OV7725_UVADJ1 0x9F +#define OV7725_SCAL0 0xA0 +#define OV7725_SCAL1 0xA1 +#define OV7725_SCAL2 0xA2 +#define OV7725_SDE 0xA6 +#define OV7725_USAT 0xA7 +#define OV7725_VSAT 0xA8 +#define OV7725_HUECOS 0xA9 +#define OV7725_HUESIN 0xAA +#define OV7725_SIGN 0xAB +#define OV7725_DSPAuto 0xAC + + +#define OV7725_DEV_ADD 0x42>>1 + + +//配置摄像头参数 +#define OV7725_W 160 //定义摄像头图像宽度 可设置参数 80 160 240 320 +#define OV7725_H 120 //定义摄像头图像高度 可设置参数 60 120 180 240 +#define OV7725_SIZE (OV7725_W * OV7725_H/8 ) //图像占用空间大小 +#define OV7725_DMA_NUM (OV7725_SIZE) //一副图像DMA采集次数 + + +//-------------------------------------------------------------------------------------------------- +//引脚配置 +//-------------------------------------------------------------------------------------------------- +#define OV7725_VSYNC_PIN ERU_CH3_REQ6_P02_0 //场中断引脚 可选范围参考ERU_PIN_enum枚举 不可与像素引脚选择为同一个通道,或者是共用中断的通道 + //例如场中断选择ERU_CH3 那么像素引脚就不能选择ERU_CH7,因为3和7的中断是共用的。 + +#define OV7725_DATA_PIN P00_0 //定义D0数据引脚 假设D0定义为P00_0 那么D1所使用的引脚则为P00_1,依次类推 + //可设置参数P00_0、P02_0、P15_0,不能设置为其他参数 + +#define OV7725_PCLK_PIN ERU_CH2_REQ14_P02_1 //定义像素时钟引脚 可选范围参考ERU_PIN_enum枚举 不可与场中断引脚选择为同一个通道,或者是共用中断的通道 + //例如场中断选择ERU_CH3 那么像素引脚就不能选择ERU_CH7,因为3和7的中断是共用的。 + +#define OV7725_DMA_CH IfxDma_ChannelId_5 //定义使用的DMA通道 0-47可选 通道号越大优先级越低 + //修改此处之后,需要修改对应的ERU中断优先级,例如此处设置为IfxDma_ChannelId_5则对应的ERU中断优先级应该设置为5 + + + +extern uint8 image_bin[OV7725_H][OV7725_W/8]; //定义存储接收图像的数组 +extern uint8 image_dec[OV7725_H][OV7725_W]; //图像解压后的数组 + +extern uint8 ov7725_finish_flag; //图像采集完成标志位 + + +//函数声明 +uint8 ov7725_init(void); +void ov7725_vsync(void); +void ov7725_dma(void); +void image_decompression(uint8 *data1,uint8 *data2); +void seekfree_sendimg_7725(UARTN_enum uartn); + + + +#endif + + + diff --git a/Example/8-EEPROM_Demo/Libraries/seekfree_peripheral/SEEKFREE_ICM20602.c b/Example/8-EEPROM_Demo/Libraries/seekfree_peripheral/SEEKFREE_ICM20602.c index 095f9e3..5d167c9 100644 --- a/Example/8-EEPROM_Demo/Libraries/seekfree_peripheral/SEEKFREE_ICM20602.c +++ b/Example/8-EEPROM_Demo/Libraries/seekfree_peripheral/SEEKFREE_ICM20602.c @@ -68,6 +68,7 @@ void icm20602_self1_check(void) //------------------------------------------------------------------------------------------------------------------- void icm20602_init(void) { + simiic_init(); systick_delay_ms(STM0, 10); //上电延时 //检测 diff --git a/Example/8-EEPROM_Demo/Libraries/seekfree_peripheral/SEEKFREE_IIC.c b/Example/8-EEPROM_Demo/Libraries/seekfree_peripheral/SEEKFREE_IIC.c index 196fd57..f56a41a 100644 --- a/Example/8-EEPROM_Demo/Libraries/seekfree_peripheral/SEEKFREE_IIC.c +++ b/Example/8-EEPROM_Demo/Libraries/seekfree_peripheral/SEEKFREE_IIC.c @@ -50,7 +50,7 @@ uint8 IIC_num; // -static uint16 simiic_delay_time=100; //ICM等传感器应设置为100 +static uint16 simiic_delay_time = SIMIIC_DELAY_TIME; //ICM等传感器应设置为20 //------------------------------------------------------------------------------------------------------------------- diff --git a/Example/8-EEPROM_Demo/Libraries/seekfree_peripheral/SEEKFREE_IIC.h b/Example/8-EEPROM_Demo/Libraries/seekfree_peripheral/SEEKFREE_IIC.h index 293a02a..6a9c1e3 100644 --- a/Example/8-EEPROM_Demo/Libraries/seekfree_peripheral/SEEKFREE_IIC.h +++ b/Example/8-EEPROM_Demo/Libraries/seekfree_peripheral/SEEKFREE_IIC.h @@ -34,8 +34,12 @@ -#define SEEKFREE_SCL P13_0 //定义SCL引脚 可任意更改为其他IO -#define SEEKFREE_SDA P13_1 //定义SDA引脚 可任意更改为其他IO +#define SEEKFREE_SCL P02_3 //定义SCL引脚 可任意更改为其他IO +#define SEEKFREE_SDA P02_2 //定义SDA引脚 可任意更改为其他IO + + +#define SIMIIC_DELAY_TIME 20 + typedef enum IIC //DAC模块 { diff --git a/Example/8-EEPROM_Demo/Libraries/seekfree_peripheral/SEEKFREE_L3G4200D.c b/Example/8-EEPROM_Demo/Libraries/seekfree_peripheral/SEEKFREE_L3G4200D.c index 0f0c23a..5deb7d3 100644 --- a/Example/8-EEPROM_Demo/Libraries/seekfree_peripheral/SEEKFREE_L3G4200D.c +++ b/Example/8-EEPROM_Demo/Libraries/seekfree_peripheral/SEEKFREE_L3G4200D.c @@ -65,6 +65,7 @@ void l3g4200d_self_check(void) //------------------------------------------------------------------------------------------------------------------- void l3g4200d_init(void) { + simiic_init(); systick_delay_ms(STM0, 50); l3g4200d_self_check(); diff --git a/Example/8-EEPROM_Demo/Libraries/seekfree_peripheral/SEEKFREE_MMA8451.c b/Example/8-EEPROM_Demo/Libraries/seekfree_peripheral/SEEKFREE_MMA8451.c index c200427..8a5eec4 100644 --- a/Example/8-EEPROM_Demo/Libraries/seekfree_peripheral/SEEKFREE_MMA8451.c +++ b/Example/8-EEPROM_Demo/Libraries/seekfree_peripheral/SEEKFREE_MMA8451.c @@ -68,6 +68,7 @@ void mma8451_self_check(void) //------------------------------------------------------------------------------------------------------------------- uint8 mma845x_init(void) { + simiic_init(); systick_delay_ms(STM0, 50); mma8451_self_check(); diff --git a/Example/8-EEPROM_Demo/Libraries/seekfree_peripheral/SEEKFREE_MPU6050.c b/Example/8-EEPROM_Demo/Libraries/seekfree_peripheral/SEEKFREE_MPU6050.c index 0317aa0..686550d 100644 --- a/Example/8-EEPROM_Demo/Libraries/seekfree_peripheral/SEEKFREE_MPU6050.c +++ b/Example/8-EEPROM_Demo/Libraries/seekfree_peripheral/SEEKFREE_MPU6050.c @@ -71,6 +71,7 @@ void mpu6050_self1_check(void) //------------------------------------------------------------------------------------------------------------------- void mpu6050_init(void) { + simiic_init(); systick_delay_ms(STM0, 100); //上电延时 mpu6050_self1_check(); diff --git a/Example/8-EEPROM_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.c b/Example/8-EEPROM_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.c index 014b435..05f181f 100644 --- a/Example/8-EEPROM_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.c +++ b/Example/8-EEPROM_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.c @@ -38,7 +38,6 @@ #include "zf_gpio.h" #include "zf_eru.h" #include "zf_eru_dma.h" -#include "stdio.h" #include "SEEKFREE_MT9V03X.h" @@ -49,6 +48,8 @@ uint8 receive[3]; uint8 receive_num = 0; vuint8 uart_receive_flag; +uint8 link_list_num; + //需要配置到摄像头的数据 int16 MT9V03X_CFG[CONFIG_FINISH][2]= { @@ -305,7 +306,7 @@ void mt9v03x_init(void) gpio_init((PIN_enum)(MT9V03X_DATA_PIN+i), GPI, 0, PULLUP); } - eru_dma_init(MT9V03X_DMA_CH, GET_PORT_IN_ADDR(MT9V03X_DATA_PIN), mt9v03x_image[0], MT9V03X_PCLK_PIN, RISING, MT9V03X_W); + link_list_num = eru_dma_init(MT9V03X_DMA_CH, GET_PORT_IN_ADDR(MT9V03X_DATA_PIN), mt9v03x_image[0], MT9V03X_PCLK_PIN, RISING, MT9V03X_W*MT9V03X_H); eru_init(MT9V03X_VSYNC_PIN, FALLING); //初始化场中断,并设置为下降沿触发中断 restoreInterrupts(interrupt_state); @@ -313,7 +314,6 @@ void mt9v03x_init(void) uint8 mt9v03x_finish_flag = 0; //一场图像采集完成标志位 -uint8 now_col; //当前正在采集的行 //------------------------------------------------------------------------------------------------------------------- // @brief MT9V03X摄像头场中断 // @param NULL @@ -324,16 +324,15 @@ uint8 now_col; // void mt9v03x_vsync(void) { CLEAR_GPIO_FLAG(MT9V03X_VSYNC_PIN); - now_col = 0; + if(!mt9v03x_finish_flag)//查看图像数组是否使用完毕,如果未使用完毕则不开始采集,避免出现访问冲突 { - DMA_SET_DESTINATION(MT9V03X_DMA_CH, (void *)&mt9v03x_image[0]); dma_start(MT9V03X_DMA_CH); } } - +uint8 mt9v03x_dma_int_num; //当前DMA中断次数 //------------------------------------------------------------------------------------------------------------------- // @brief MT9V03X摄像头DMA完成中断 // @param NULL @@ -344,16 +343,15 @@ void mt9v03x_vsync(void) void mt9v03x_dma(void) { CLEAR_DMA_FLAG(MT9V03X_DMA_CH); + mt9v03x_dma_int_num++; - now_col++; - - if(MT9V03X_H > now_col) - { - dma_start(MT9V03X_DMA_CH); - } - else + if(mt9v03x_dma_int_num >= link_list_num) { + //采集完成 + mt9v03x_dma_int_num = 0; mt9v03x_finish_flag = 1;//一副图像从采集开始到采集结束耗时3.8MS左右(50FPS、188*120分辨率) + dma_stop(MT9V03X_DMA_CH); + } } diff --git a/Example/8-EEPROM_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.h b/Example/8-EEPROM_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.h index a29edd2..0c8a785 100644 --- a/Example/8-EEPROM_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.h +++ b/Example/8-EEPROM_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.h @@ -63,9 +63,7 @@ //例如场中断选择ERU_CH3 那么像素引脚就不能选择ERU_CH7,因为3和7的中断是共用的。 #define MT9V03X_DMA_CH IfxDma_ChannelId_5 //定义使用的DMA通道 0-47可选 通道号越大优先级越低 - //修改此处之后,需要修改对应的ERU中断优先级,例如此处设置为IfxDma_ChannelId_5则对应的ERU中断优先级应该设置为5 - - + //摄像头命令枚举 typedef enum { diff --git a/Example/8-EEPROM_Demo/USER/isr.c b/Example/8-EEPROM_Demo/USER/isr.c index 15666f2..c6376b0 100644 --- a/Example/8-EEPROM_Demo/USER/isr.c +++ b/Example/8-EEPROM_Demo/USER/isr.c @@ -98,7 +98,8 @@ IFX_INTERRUPT(eru_ch3_ch7_isr, ERU_CH3_CH7_INT_SERVICE, ERU_CH3_CH7_INT_PRIO) if(GET_GPIO_FLAG(ERU_CH3_REQ6_P02_0))//通道3中断 { CLEAR_GPIO_FLAG(ERU_CH3_REQ6_P02_0); - if(1 == camera_type)mt9v03x_vsync(); + if (1 == camera_type) mt9v03x_vsync(); + else if (3 == camera_type) ov7725_vsync(); } if(GET_GPIO_FLAG(ERU_CH7_REQ16_P15_1))//通道7中断 @@ -113,7 +114,8 @@ IFX_INTERRUPT(eru_ch3_ch7_isr, ERU_CH3_CH7_INT_SERVICE, ERU_CH3_CH7_INT_PRIO) IFX_INTERRUPT(dma_ch5_isr, ERU_DMA_INT_SERVICE, ERU_DMA_INT_PRIO) { - if(1 == camera_type) mt9v03x_dma(); + if (1 == camera_type) mt9v03x_dma(); + else if (3 == camera_type) ov7725_dma(); } diff --git a/Example/9-PWM_Demo/Libraries/doc/version.txt b/Example/9-PWM_Demo/Libraries/doc/version.txt index b85cd50..a42bc58 100644 --- a/Example/9-PWM_Demo/Libraries/doc/version.txt +++ b/Example/9-PWM_Demo/Libraries/doc/version.txt @@ -1,9 +1,17 @@ V1.0.0 - 初始版本 + 初始版本 V1.0.1 对总钻风摄像头的场中断进行修改,判断标志位为0才采集下一幅图像,避免出现访问冲突 修改SPI初始化中的错误,引用了固定的SPI2基地址 修复STM中无法使用STM1的问题 - 修复gtm pwm中最大占空比只有GTM_ATOM0_PWM_DUTY_MAX设置有效的问题 \ No newline at end of file + 修复gtm pwm中最大占空比只有GTM_ATOM0_PWM_DUTY_MAX设置有效的问题 + +V1.0.2 + 修改模拟IIC默认延时时间为20 + 添加 需要特别注意P20_2是不能用于输出的,仅仅只有输入的功能 注意事项 + 将摄像头采集DMA改为link传输,可以大大降低DMA中断次数 + 修改默认的软件IIC引脚定义 + 将6050等 需要用到软件IIC的模块,在初始化函数中默认调用模拟IIC初始化 + 添加小钻风驱动程序 \ No newline at end of file diff --git a/Example/9-PWM_Demo/Libraries/seekfree_libraries/common/common.c b/Example/9-PWM_Demo/Libraries/seekfree_libraries/common/common.c index 0460d15..ac42b19 100644 --- a/Example/9-PWM_Demo/Libraries/seekfree_libraries/common/common.c +++ b/Example/9-PWM_Demo/Libraries/seekfree_libraries/common/common.c @@ -22,7 +22,7 @@ #include "SysSe/Bsp/Bsp.h" #include "common.h" -uint8 camera_type; +uint8 camera_type; //摄像头型号 1:总钻风 2:凌瞳(暂未支持)3:小钻风 diff --git a/Example/9-PWM_Demo/Libraries/seekfree_libraries/common/common.h b/Example/9-PWM_Demo/Libraries/seekfree_libraries/common/common.h index fe7ec63..13d03cd 100644 --- a/Example/9-PWM_Demo/Libraries/seekfree_libraries/common/common.h +++ b/Example/9-PWM_Demo/Libraries/seekfree_libraries/common/common.h @@ -111,7 +111,7 @@ typedef enum //枚 #include -extern uint8 camera_type; +extern uint8 camera_type; //摄像头型号 1:总钻风 2:凌瞳(暂未支持)3:小钻风 void get_clk(void); diff --git a/Example/9-PWM_Demo/Libraries/seekfree_libraries/headfile.h b/Example/9-PWM_Demo/Libraries/seekfree_libraries/headfile.h index 0e8024f..e11bd83 100644 --- a/Example/9-PWM_Demo/Libraries/seekfree_libraries/headfile.h +++ b/Example/9-PWM_Demo/Libraries/seekfree_libraries/headfile.h @@ -62,6 +62,7 @@ #include "SEEKFREE_L3G4200D.h" #include "SEEKFREE_WIRELESS.h" #include "SEEKFREE_IPS200_PARALLEL8.h" +#include "SEEKFREE_7725.h" #endif diff --git a/Example/9-PWM_Demo/Libraries/seekfree_libraries/zf_eru_dma.c b/Example/9-PWM_Demo/Libraries/seekfree_libraries/zf_eru_dma.c index f7aab10..86c0158 100644 --- a/Example/9-PWM_Demo/Libraries/seekfree_libraries/zf_eru_dma.c +++ b/Example/9-PWM_Demo/Libraries/seekfree_libraries/zf_eru_dma.c @@ -21,9 +21,18 @@ #include "IfxDma_Dma.h" #include "IfxScuEru.h" #include "isr_config.h" +#include "zf_assert.h" #include "zf_eru_dma.h" +typedef struct +{ + Ifx_DMA_CH IFX_ALIGN(256) linked_list[8];//DMA链表 + IfxDma_Dma_Channel channel; //DMA通道句柄 +}DMA_LINK; + + +DMA_LINK dma_link_list; //------------------------------------------------------------------------------------------------------------------- // @brief eru触发dma初始化 @@ -36,7 +45,7 @@ // @return void // Sample usage: //------------------------------------------------------------------------------------------------------------------- -void eru_dma_init(IfxDma_ChannelId dma_ch, uint8 *source_addr, uint8 *destination_addr, ERU_PIN_enum eru_pin, TRIGGER_enum trigger, uint16 dma_count) +uint8 eru_dma_init(IfxDma_ChannelId dma_ch, uint8 *source_addr, uint8 *destination_addr, ERU_PIN_enum eru_pin, TRIGGER_enum trigger, uint16 dma_count) { IfxDma_Dma_Channel dmaChn; //eru触发DMA通道号 在eru文件中设置eru的优先级,即为触发的通道 @@ -51,27 +60,85 @@ void eru_dma_init(IfxDma_ChannelId dma_ch, uint8 *source_addr, uint8 *destinatio IfxDma_Dma_ChannelConfig cfg; IfxDma_Dma_initChannelConfig(&cfg, &dma); - cfg.transferCount = dma_count; + uint8 list_num, i; + uint16 single_channel_dma_count; + + ZF_ASSERT(!(dma_count%8));//传输次数必须为8的倍数 + + + list_num = 1; + single_channel_dma_count = dma_count / list_num; + if(16384 < single_channel_dma_count) + { + while(TRUE) + { + single_channel_dma_count = dma_count / list_num; + if((single_channel_dma_count <= 16384) && !(dma_count % list_num)) + { + break; + } + list_num++; + if(list_num > 8) ZF_ASSERT(FALSE); + } + } + + + if(1 == list_num) + { + cfg.shadowControl = IfxDma_ChannelShadow_none; + cfg.operationMode = IfxDma_ChannelOperationMode_single; + cfg.shadowAddress = 0; + } + else + { + cfg.shadowControl = IfxDma_ChannelShadow_linkedList; + cfg.operationMode = IfxDma_ChannelOperationMode_continuous; + cfg.shadowAddress = IFXCPU_GLB_ADDR_DSPR(IfxCpu_getCoreId(), (unsigned)&dma_link_list.linked_list[1]); + } + cfg.requestMode = IfxDma_ChannelRequestMode_oneTransferPerRequest; cfg.moveSize = IfxDma_ChannelMoveSize_8bit; + cfg.busPriority = IfxDma_ChannelBusPriority_high; - cfg.busPriority = IfxDma_ChannelBusPriority_high; - - cfg.sourceAddress = (unsigned)(source_addr); + cfg.sourceAddress = IFXCPU_GLB_ADDR_DSPR(IfxCpu_getCoreId(), source_addr); cfg.sourceAddressCircularRange = IfxDma_ChannelIncrementCircular_none; cfg.sourceCircularBufferEnabled = TRUE; - cfg.destinationAddress = IFXCPU_GLB_ADDR_DSPR(IfxCpu_getCoreId(), destination_addr); cfg.destinationAddressIncrementStep = IfxDma_ChannelIncrementStep_1; - cfg.operationMode = IfxDma_ChannelOperationMode_single; - cfg.channelId = (IfxDma_ChannelId)dma_ch; - cfg.hardwareRequestEnabled = TRUE; - cfg.channelInterruptEnabled = TRUE; + cfg.channelId = (IfxDma_ChannelId)dma_ch; + cfg.hardwareRequestEnabled = FALSE; + cfg.channelInterruptEnabled = TRUE; cfg.channelInterruptPriority = ERU_DMA_INT_PRIO; cfg.channelInterruptTypeOfService = (IfxSrc_Tos)ERU_DMA_INT_SERVICE; + + + cfg.destinationAddress = IFXCPU_GLB_ADDR_DSPR(IfxCpu_getCoreId(), destination_addr); + + cfg.transferCount = single_channel_dma_count; + IfxDma_Dma_initChannel(&dmaChn, &cfg); + + if(1 < list_num) + { + i = 0; + while(i < list_num) + { + cfg.destinationAddress = IFXCPU_GLB_ADDR_DSPR(IfxCpu_getCoreId(), destination_addr + single_channel_dma_count * i); + if(i == (list_num - 1)) cfg.shadowAddress = IFXCPU_GLB_ADDR_DSPR(IfxCpu_getCoreId(), (unsigned)&dma_link_list.linked_list[0]); + else cfg.shadowAddress = IFXCPU_GLB_ADDR_DSPR(IfxCpu_getCoreId(), (unsigned)&dma_link_list.linked_list[i+1]); + cfg.transferCount = single_channel_dma_count; + + IfxDma_Dma_initLinkedListEntry((void *)&dma_link_list.linked_list[i], &cfg); + i++; + } + } + + + IfxDma_Dma_getSrcPointer(&dma_link_list.channel)->B.CLRR = 1; + + return list_num; } diff --git a/Example/9-PWM_Demo/Libraries/seekfree_libraries/zf_eru_dma.h b/Example/9-PWM_Demo/Libraries/seekfree_libraries/zf_eru_dma.h index 50667ad..faef169 100644 --- a/Example/9-PWM_Demo/Libraries/seekfree_libraries/zf_eru_dma.h +++ b/Example/9-PWM_Demo/Libraries/seekfree_libraries/zf_eru_dma.h @@ -29,9 +29,9 @@ #define CLEAR_DMA_FLAG(dma_ch) IfxDma_clearChannelInterrupt(&MODULE_DMA, dma_ch); -#define DMA_SET_DESTINATION(dma_ch, destination_addr) IfxDma_setChannelDestinationAddress(&MODULE_DMA, dma_ch, (void *)destination_addr) +#define DMA_SET_DESTINATION(dma_ch, destination_addr) IfxDma_setChannelDestinationAddress(&MODULE_DMA, dma_ch, (void *)IFXCPU_GLB_ADDR_DSPR(IfxCpu_getCoreId(), destination_addr)) -void eru_dma_init(IfxDma_ChannelId dma_ch, uint8 *source_addr, uint8 *destination_addr, ERU_PIN_enum eru_pin, TRIGGER_enum trigger, uint16 dma_count); +uint8 eru_dma_init(IfxDma_ChannelId dma_ch, uint8 *source_addr, uint8 *destination_addr, ERU_PIN_enum eru_pin, TRIGGER_enum trigger, uint16 dma_count); void dma_stop(IfxDma_ChannelId dma_ch); void dma_start(IfxDma_ChannelId dma_ch); diff --git a/Example/9-PWM_Demo/Libraries/seekfree_libraries/zf_gpio.c b/Example/9-PWM_Demo/Libraries/seekfree_libraries/zf_gpio.c index 3c937cf..1d2466c 100644 --- a/Example/9-PWM_Demo/Libraries/seekfree_libraries/zf_gpio.c +++ b/Example/9-PWM_Demo/Libraries/seekfree_libraries/zf_gpio.c @@ -60,6 +60,7 @@ Ifx_P* get_port(PIN_enum pin) // @param pinmode 引脚配置(可设置参数由zf_gpio.h文件内GPIOMODE_enum枚举值确定) // @return void // Sample usage: gpio_init(P00_0, GPO, 1, PUSHPULL);//P00_0初始化为GPIO功能、输出模式、输出高电平、推挽输出 +// @note 需要特别注意P20_2是不能用于输出的,仅仅只有输入的功能 //------------------------------------------------------------------------------------------------------------------- void gpio_init(PIN_enum pin, GPIODIR_enum dir, uint8 dat, GPIOMODE_enum pinmode) { diff --git a/Example/9-PWM_Demo/Libraries/seekfree_libraries/zf_gpio.h b/Example/9-PWM_Demo/Libraries/seekfree_libraries/zf_gpio.h index cfbd666..e3d144f 100644 --- a/Example/9-PWM_Demo/Libraries/seekfree_libraries/zf_gpio.h +++ b/Example/9-PWM_Demo/Libraries/seekfree_libraries/zf_gpio.h @@ -38,6 +38,15 @@ typedef enum // 枚 #define GET_PORT_IN_ADDR(pin) (uint8 *)(&IfxPort_getAddress((IfxPort_Index)(pin/32))->IN + pin%32/8) + + +//需要特别注意P20_2是不能用于输出的,仅仅只有输入的功能 +//需要特别注意P20_2是不能用于输出的,仅仅只有输入的功能 +//需要特别注意P20_2是不能用于输出的,仅仅只有输入的功能 + + + + //------------------------------------------------------ //通用GPIO操作 void gpio_init(PIN_enum pin, GPIODIR_enum dir, uint8 dat, GPIOMODE_enum pinconf); diff --git a/Example/9-PWM_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.c b/Example/9-PWM_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.c new file mode 100644 index 0000000..806b8d9 --- /dev/null +++ b/Example/9-PWM_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.c @@ -0,0 +1,262 @@ +/********************************************************************************************************************* + * COPYRIGHT NOTICE + * Copyright (c) 2020,逐飞科技 + * All rights reserved. + * 技术讨论QQ群:三群:824575535 + * + * 以下所有内容版权均属逐飞科技所有,未经允许不得用于商业用途, + * 欢迎各位使用并传播本程序,修改内容时必须保留逐飞科技的版权声明。 + * + * @file main + * @company 成都逐飞科技有限公司 + * @author 逐飞科技(QQ3184284598) + * @version 查看doc内version文件 版本说明 + * @Software tasking v6.3r1 + * @Target core TC264D + * @Taobao https://seekfree.taobao.com/ + * @date 2020-3-23 + * @note + 接线定义: + ------------------------------------ + 模块管脚 单片机管脚 + SDA 查看SEEKFREE_IIC文件内的SEEKFREE_SDA宏定义 + SCL 查看SEEKFREE_IIC文件内的SEEKFREE_SCL宏定义 + 场中断(VSY) 查看SEEKFREE_OV7725.h文件中的OV7725_VSYNC_PIN宏定义 + 行中断(HREF) 未使用,因此不接 + 像素中断(PCLK) 查看SEEKFREE_OV7725.h文件中的OV7725_PCLK_PIN宏定义 + 数据口(D0-D7) 查看SEEKFREE_OV7725.h文件中的OV7725_DATA_PIN宏定义 + ------------------------------------ + + 默认分辨率是 160*120 + 默认FPS 50帧 + ********************************************************************************************************************/ + + +#include "IfxDma.h" +#include "IfxScuEru.h" +#include "zf_stm_systick.h" +#include "zf_gpio.h" +#include "zf_eru.h" +#include "zf_eru_dma.h" +#include "SEEKFREE_IIC.h" +#include "SEEKFREE_7725.h" + + + +IFX_ALIGN(4) uint8 image_bin[OV7725_H][OV7725_W/8]; //定义存储接收图像的数组 +uint8 image_dec[OV7725_H][OV7725_W]; + +uint8 ov7725_idcode = 0; + +//------------------------------------------------------------------------------------------------------------------- +// @brief 小钻风摄像头内部寄存器初始化(内部使用,用户无需调用) +// @param NULL +// @return uint8 返回0则出错,返回1则成功 +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +uint8 ov7725_reg_init(void) +{ + simiic_delay_set(500); + simiic_write_reg ( OV7725_DEV_ADD, OV7725_COM7, 0x80 ); //复位摄像头 + systick_delay_ms(STM0, 50); + ov7725_idcode = simiic_read_reg( OV7725_DEV_ADD, OV7725_VER ,SCCB); + if( ov7725_idcode != OV7725_ID ) return 0; //校验摄像头ID号 + + //ID号确认无误 然后配置寄存器 + simiic_write_reg(OV7725_DEV_ADD, OV7725_COM4 , 0xC1); + simiic_write_reg(OV7725_DEV_ADD, OV7725_CLKRC , 0x01); + simiic_write_reg(OV7725_DEV_ADD, OV7725_COM2 , 0x03); + simiic_write_reg(OV7725_DEV_ADD, OV7725_COM3 , 0xD0); + simiic_write_reg(OV7725_DEV_ADD, OV7725_COM7 , 0x40); + simiic_write_reg(OV7725_DEV_ADD, OV7725_COM8 , 0xCE); //0xCE:关闭自动曝光 0xCF:开启自动曝光 + simiic_write_reg(OV7725_DEV_ADD, OV7725_HSTART , 0x3F); + simiic_write_reg(OV7725_DEV_ADD, OV7725_HSIZE , 0x50); + simiic_write_reg(OV7725_DEV_ADD, OV7725_VSTRT , 0x03); + simiic_write_reg(OV7725_DEV_ADD, OV7725_VSIZE , 0x78); + simiic_write_reg(OV7725_DEV_ADD, OV7725_HREF , 0x00); + simiic_write_reg(OV7725_DEV_ADD, OV7725_SCAL0 , 0x0A); + simiic_write_reg(OV7725_DEV_ADD, OV7725_AWB_Ctrl0 , 0xE0); + simiic_write_reg(OV7725_DEV_ADD, OV7725_DSPAuto , 0xff); + simiic_write_reg(OV7725_DEV_ADD, OV7725_DSP_Ctrl2 , 0x0C); + simiic_write_reg(OV7725_DEV_ADD, OV7725_DSP_Ctrl3 , 0x00); + simiic_write_reg(OV7725_DEV_ADD, OV7725_DSP_Ctrl4 , 0x00); + + if(OV7725_W == 80) simiic_write_reg(OV7725_DEV_ADD, OV7725_HOutSize , 0x14); + else if(OV7725_W == 160) simiic_write_reg(OV7725_DEV_ADD, OV7725_HOutSize , 0x28); + else if(OV7725_W == 240) simiic_write_reg(OV7725_DEV_ADD, OV7725_HOutSize , 0x3c); + else if(OV7725_W == 320) simiic_write_reg(OV7725_DEV_ADD, OV7725_HOutSize , 0x50); + + if(OV7725_H == 60) simiic_write_reg(OV7725_DEV_ADD, OV7725_VOutSize , 0x1E); + else if(OV7725_H == 120) simiic_write_reg(OV7725_DEV_ADD, OV7725_VOutSize , 0x3c); + else if(OV7725_H == 180) simiic_write_reg(OV7725_DEV_ADD, OV7725_VOutSize , 0x5a); + else if(OV7725_H == 240) simiic_write_reg(OV7725_DEV_ADD, OV7725_VOutSize , 0x78); + + simiic_write_reg(OV7725_DEV_ADD, OV7725_REG28 , 0x01); + simiic_write_reg(OV7725_DEV_ADD, OV7725_EXHCH , 0x10); + simiic_write_reg(OV7725_DEV_ADD, OV7725_EXHCL , 0x1F); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM1 , 0x0c); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM2 , 0x16); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM3 , 0x2a); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM4 , 0x4e); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM5 , 0x61); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM6 , 0x6f); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM7 , 0x7b); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM8 , 0x86); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM9 , 0x8e); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM10 , 0x97); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM11 , 0xa4); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM12 , 0xaf); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM13 , 0xc5); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM14 , 0xd7); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM15 , 0xe8); + simiic_write_reg(OV7725_DEV_ADD, OV7725_SLOP , 0x20); + simiic_write_reg(OV7725_DEV_ADD, OV7725_LC_RADI , 0x00); + simiic_write_reg(OV7725_DEV_ADD, OV7725_LC_COEF , 0x13); + simiic_write_reg(OV7725_DEV_ADD, OV7725_LC_XC , 0x08); + simiic_write_reg(OV7725_DEV_ADD, OV7725_LC_COEFB , 0x14); + simiic_write_reg(OV7725_DEV_ADD, OV7725_LC_COEFR , 0x17); + simiic_write_reg(OV7725_DEV_ADD, OV7725_LC_CTR , 0x05); + simiic_write_reg(OV7725_DEV_ADD, OV7725_BDBase , 0x99); + simiic_write_reg(OV7725_DEV_ADD, OV7725_BDMStep , 0x03); + simiic_write_reg(OV7725_DEV_ADD, OV7725_SDE , 0x04); + simiic_write_reg(OV7725_DEV_ADD, OV7725_BRIGHT , 0x00); + simiic_write_reg(OV7725_DEV_ADD, OV7725_CNST , 0x40); + simiic_write_reg(OV7725_DEV_ADD, OV7725_SIGN , 0x06); + simiic_write_reg(OV7725_DEV_ADD, OV7725_UVADJ0 , 0x11); + simiic_write_reg(OV7725_DEV_ADD, OV7725_UVADJ1 , 0x02); + + + simiic_delay_set(SIMIIC_DELAY_TIME);//修改为默认的20 + return 1; + + +} + + + + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 小钻风摄像头采集程序初始化(内部使用,用户无需调用) +// @param NULL +// @return void +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +void ov7725_port_init(void) +{ + uint8 i; + camera_type = 3;//设置连接摄像头类型 + + //摄像头采集初始化 + //初始化 数据引脚 + for(i=0; i<8; i++) + { + gpio_init((PIN_enum)(OV7725_DATA_PIN+i), GPI, 0, PULLUP); + } + eru_dma_init(OV7725_DMA_CH, GET_PORT_IN_ADDR(OV7725_DATA_PIN), image_bin[0], OV7725_PCLK_PIN, FALLING, OV7725_DMA_NUM); + eru_init(OV7725_VSYNC_PIN, FALLING); //初始化场中断,并设置为下降沿触发中断 + +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 小钻风摄像头初始化(调用之后设置好相关中断函数即可采集图像) +// @param NULL +// @return 0 +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +uint8 ov7725_init(void) +{ + simiic_init(); + ov7725_reg_init(); //摄像头寄存器配置 + ov7725_port_init(); //摄像头中断引脚及DMA配置 + return 0; +} + + + + +uint8 ov7725_finish_flag = 0; +//------------------------------------------------------------------------------------------------------------------- +// @brief 小钻风摄像头场中断 +// @param NULL +// @return void +// @since v1.0 +// Sample usage: 此函数在isr.c中被eru(GPIO中断)中断调用 +//------------------------------------------------------------------------------------------------------------------- +void ov7725_vsync(void) +{ + CLEAR_GPIO_FLAG(OV7725_VSYNC_PIN); + + if(!ov7725_finish_flag)//查看图像数组是否使用完毕,如果未使用完毕则不开始采集,避免出现访问冲突 + { + DMA_SET_DESTINATION(OV7725_DMA_CH, image_bin[0]); + dma_start(OV7725_DMA_CH); + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 小钻风摄像头DMA完成中断 +// @param NULL +// @return void +// @since v1.0 +// Sample usage: 此函数在isr.c中被dma中断调用 +//------------------------------------------------------------------------------------------------------------------- +void ov7725_dma(void) +{ + CLEAR_DMA_FLAG(OV7725_DMA_CH); + ov7725_finish_flag = 1; + dma_stop(OV7725_DMA_CH); +} + + + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 小钻风摄像头数据解压函数 +// @param *data1 源地址 +// @param *data2 目的地址 +// @return void +// @since v1.0 +// Sample usage: Image_Decompression(da1,dat2[0]);//将一维数组dat1的内容解压到二维数组dat2里. +//------------------------------------------------------------------------------------------------------------------- +void image_decompression(uint8 *data1,uint8 *data2) +{ + uint8 temp[2] = {0,255}; + uint16 lenth = OV7725_SIZE; + uint8 i = 8; + + + while(lenth--) + { + i = 8; + while(i--) + { + *data2++ = temp[(*data1 >> i) & 0x01]; + } + data1++; + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 小钻风摄像头未解压图像发送至上位机查看图像 +// @param *imgaddr 压缩图像数据地址 +// @param *imgsize 图像大小(直接填写OV7725_SIZE) +// @return void +// @since v1.0 +// Sample usage: 调用该函数前请先初始化uart2 +//------------------------------------------------------------------------------------------------------------------- +void seekfree_sendimg_7725(UARTN_enum uartn) +{ + uart_putchar(uartn, 0x00);uart_putchar(uartn, 0xff);uart_putchar(uartn, 0x01);uart_putchar(uartn, 0x01);//发送四个字节命令 + uart_putbuff(uartn, image_bin[0], OV7725_SIZE); //再发送图像 +} + + + + diff --git a/Example/9-PWM_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.h b/Example/9-PWM_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.h new file mode 100644 index 0000000..e513250 --- /dev/null +++ b/Example/9-PWM_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.h @@ -0,0 +1,243 @@ +/********************************************************************************************************************* + * COPYRIGHT NOTICE + * Copyright (c) 2020,逐飞科技 + * All rights reserved. + * 技术讨论QQ群:三群:824575535 + * + * 以下所有内容版权均属逐飞科技所有,未经允许不得用于商业用途, + * 欢迎各位使用并传播本程序,修改内容时必须保留逐飞科技的版权声明。 + * + * @file main + * @company 成都逐飞科技有限公司 + * @author 逐飞科技(QQ3184284598) + * @version 查看doc内version文件 版本说明 + * @Software tasking v6.3r1 + * @Target core TC264D + * @Taobao https://seekfree.taobao.com/ + * @date 2020-3-23 + * @note + 接线定义: + ------------------------------------ + 模块管脚 单片机管脚 + SDA 查看SEEKFREE_IIC文件内的SEEKFREE_SDA宏定义 + SCL 查看SEEKFREE_IIC文件内的SEEKFREE_SCL宏定义 + 场中断(VSY) 查看SEEKFREE_OV7725.h文件中的OV7725_VSYNC_PIN宏定义 + 行中断(HREF) 未使用,因此不接 + 像素中断(PCLK) 查看SEEKFREE_OV7725.h文件中的OV7725_PCLK_PIN宏定义 + 数据口(D0-D7) 查看SEEKFREE_OV7725.h文件中的OV7725_DATA_PIN宏定义 + ------------------------------------ + + 默认分辨率是 160*120 + 默认FPS 50帧 + ********************************************************************************************************************/ + + + +#ifndef _SEEKFREE_7725_h +#define _SEEKFREE_7725_h + +#include "common.h" +#include "IfxDma_cfg.h" +#include "zf_uart.h" + + +//摄像头ID号 +#define OV7725_ID 0x21 + +//摄像头寄存器 +#define OV7725_GAIN 0x00 +#define OV7725_BLUE 0x01 +#define OV7725_RED 0x02 +#define OV7725_GREEN 0x03 +#define OV7725_BAVG 0x05 +#define OV7725_GAVG 0x06 +#define OV7725_RAVG 0x07 +#define OV7725_AECH 0x08 +#define OV7725_COM2 0x09 +#define OV7725_PID 0x0A +#define OV7725_VER 0x0B +#define OV7725_COM3 0x0C +#define OV7725_COM4 0x0D +#define OV7725_COM5 0x0E +#define OV7725_COM6 0x0F +#define OV7725_AEC 0x10 +#define OV7725_CLKRC 0x11 +#define OV7725_COM7 0x12 +#define OV7725_COM8 0x13 +#define OV7725_COM9 0x14 +#define OV7725_COM10 0x15 +#define OV7725_REG16 0x16 +#define OV7725_HSTART 0x17 +#define OV7725_HSIZE 0x18 +#define OV7725_VSTRT 0x19 +#define OV7725_VSIZE 0x1A +#define OV7725_PSHFT 0x1B +#define OV7725_MIDH 0x1C +#define OV7725_MIDL 0x1D +#define OV7725_LAEC 0x1F +#define OV7725_COM11 0x20 +#define OV7725_BDBase 0x22 +#define OV7725_BDMStep 0x23 +#define OV7725_AEW 0x24 +#define OV7725_AEB 0x25 +#define OV7725_VPT 0x26 +#define OV7725_REG28 0x28 +#define OV7725_HOutSize 0x29 +#define OV7725_EXHCH 0x2A +#define OV7725_EXHCL 0x2B +#define OV7725_VOutSize 0x2C +#define OV7725_ADVFL 0x2D +#define OV7725_ADVFH 0x2E +#define OV7725_YAVE 0x2F +#define OV7725_LumHTh 0x30 +#define OV7725_LumLTh 0x31 +#define OV7725_HREF 0x32 +#define OV7725_DM_LNL 0x33 +#define OV7725_DM_LNH 0x34 +#define OV7725_ADoff_B 0x35 +#define OV7725_ADoff_R 0x36 +#define OV7725_ADoff_Gb 0x37 +#define OV7725_ADoff_Gr 0x38 +#define OV7725_Off_B 0x39 +#define OV7725_Off_R 0x3A +#define OV7725_Off_Gb 0x3B +#define OV7725_Off_Gr 0x3C +#define OV7725_COM12 0x3D +#define OV7725_COM13 0x3E +#define OV7725_COM14 0x3F +#define OV7725_COM16 0x41 +#define OV7725_TGT_B 0x42 +#define OV7725_TGT_R 0x43 +#define OV7725_TGT_Gb 0x44 +#define OV7725_TGT_Gr 0x45 +#define OV7725_LC_CTR 0x46 +#define OV7725_LC_XC 0x47 +#define OV7725_LC_YC 0x48 +#define OV7725_LC_COEF 0x49 +#define OV7725_LC_RADI 0x4A +#define OV7725_LC_COEFB 0x4B +#define OV7725_LC_COEFR 0x4C +#define OV7725_FixGain 0x4D +#define OV7725_AREF1 0x4F +#define OV7725_AREF6 0x54 +#define OV7725_UFix 0x60 +#define OV7725_VFix 0x61 +#define OV7725_AWBb_blk 0x62 +#define OV7725_AWB_Ctrl0 0x63 +#define OV7725_DSP_Ctrl1 0x64 +#define OV7725_DSP_Ctrl2 0x65 +#define OV7725_DSP_Ctrl3 0x66 +#define OV7725_DSP_Ctrl4 0x67 +#define OV7725_AWB_bias 0x68 +#define OV7725_AWBCtrl1 0x69 +#define OV7725_AWBCtrl2 0x6A +#define OV7725_AWBCtrl3 0x6B +#define OV7725_AWBCtrl4 0x6C +#define OV7725_AWBCtrl5 0x6D +#define OV7725_AWBCtrl6 0x6E +#define OV7725_AWBCtrl7 0x6F +#define OV7725_AWBCtrl8 0x70 +#define OV7725_AWBCtrl9 0x71 +#define OV7725_AWBCtrl10 0x72 +#define OV7725_AWBCtrl11 0x73 +#define OV7725_AWBCtrl12 0x74 +#define OV7725_AWBCtrl13 0x75 +#define OV7725_AWBCtrl14 0x76 +#define OV7725_AWBCtrl15 0x77 +#define OV7725_AWBCtrl16 0x78 +#define OV7725_AWBCtrl17 0x79 +#define OV7725_AWBCtrl18 0x7A +#define OV7725_AWBCtrl19 0x7B +#define OV7725_AWBCtrl20 0x7C +#define OV7725_AWBCtrl21 0x7D +#define OV7725_GAM1 0x7E +#define OV7725_GAM2 0x7F +#define OV7725_GAM3 0x80 +#define OV7725_GAM4 0x81 +#define OV7725_GAM5 0x82 +#define OV7725_GAM6 0x83 +#define OV7725_GAM7 0x84 +#define OV7725_GAM8 0x85 +#define OV7725_GAM9 0x86 +#define OV7725_GAM10 0x87 +#define OV7725_GAM11 0x88 +#define OV7725_GAM12 0x89 +#define OV7725_GAM13 0x8A +#define OV7725_GAM14 0x8B +#define OV7725_GAM15 0x8C +#define OV7725_SLOP 0x8D +#define OV7725_DNSTh 0x8E +#define OV7725_EDGE0 0x8F +#define OV7725_EDGE1 0x90 +#define OV7725_DNSOff 0x91 +#define OV7725_EDGE2 0x92 +#define OV7725_EDGE3 0x93 +#define OV7725_MTX1 0x94 +#define OV7725_MTX2 0x95 +#define OV7725_MTX3 0x96 +#define OV7725_MTX4 0x97 +#define OV7725_MTX5 0x98 +#define OV7725_MTX6 0x99 +#define OV7725_MTX_Ctrl 0x9A +#define OV7725_BRIGHT 0x9B +#define OV7725_CNST 0x9C +#define OV7725_UVADJ0 0x9E +#define OV7725_UVADJ1 0x9F +#define OV7725_SCAL0 0xA0 +#define OV7725_SCAL1 0xA1 +#define OV7725_SCAL2 0xA2 +#define OV7725_SDE 0xA6 +#define OV7725_USAT 0xA7 +#define OV7725_VSAT 0xA8 +#define OV7725_HUECOS 0xA9 +#define OV7725_HUESIN 0xAA +#define OV7725_SIGN 0xAB +#define OV7725_DSPAuto 0xAC + + +#define OV7725_DEV_ADD 0x42>>1 + + +//配置摄像头参数 +#define OV7725_W 160 //定义摄像头图像宽度 可设置参数 80 160 240 320 +#define OV7725_H 120 //定义摄像头图像高度 可设置参数 60 120 180 240 +#define OV7725_SIZE (OV7725_W * OV7725_H/8 ) //图像占用空间大小 +#define OV7725_DMA_NUM (OV7725_SIZE) //一副图像DMA采集次数 + + +//-------------------------------------------------------------------------------------------------- +//引脚配置 +//-------------------------------------------------------------------------------------------------- +#define OV7725_VSYNC_PIN ERU_CH3_REQ6_P02_0 //场中断引脚 可选范围参考ERU_PIN_enum枚举 不可与像素引脚选择为同一个通道,或者是共用中断的通道 + //例如场中断选择ERU_CH3 那么像素引脚就不能选择ERU_CH7,因为3和7的中断是共用的。 + +#define OV7725_DATA_PIN P00_0 //定义D0数据引脚 假设D0定义为P00_0 那么D1所使用的引脚则为P00_1,依次类推 + //可设置参数P00_0、P02_0、P15_0,不能设置为其他参数 + +#define OV7725_PCLK_PIN ERU_CH2_REQ14_P02_1 //定义像素时钟引脚 可选范围参考ERU_PIN_enum枚举 不可与场中断引脚选择为同一个通道,或者是共用中断的通道 + //例如场中断选择ERU_CH3 那么像素引脚就不能选择ERU_CH7,因为3和7的中断是共用的。 + +#define OV7725_DMA_CH IfxDma_ChannelId_5 //定义使用的DMA通道 0-47可选 通道号越大优先级越低 + //修改此处之后,需要修改对应的ERU中断优先级,例如此处设置为IfxDma_ChannelId_5则对应的ERU中断优先级应该设置为5 + + + +extern uint8 image_bin[OV7725_H][OV7725_W/8]; //定义存储接收图像的数组 +extern uint8 image_dec[OV7725_H][OV7725_W]; //图像解压后的数组 + +extern uint8 ov7725_finish_flag; //图像采集完成标志位 + + +//函数声明 +uint8 ov7725_init(void); +void ov7725_vsync(void); +void ov7725_dma(void); +void image_decompression(uint8 *data1,uint8 *data2); +void seekfree_sendimg_7725(UARTN_enum uartn); + + + +#endif + + + diff --git a/Example/9-PWM_Demo/Libraries/seekfree_peripheral/SEEKFREE_ICM20602.c b/Example/9-PWM_Demo/Libraries/seekfree_peripheral/SEEKFREE_ICM20602.c index 095f9e3..5d167c9 100644 --- a/Example/9-PWM_Demo/Libraries/seekfree_peripheral/SEEKFREE_ICM20602.c +++ b/Example/9-PWM_Demo/Libraries/seekfree_peripheral/SEEKFREE_ICM20602.c @@ -68,6 +68,7 @@ void icm20602_self1_check(void) //------------------------------------------------------------------------------------------------------------------- void icm20602_init(void) { + simiic_init(); systick_delay_ms(STM0, 10); //上电延时 //检测 diff --git a/Example/9-PWM_Demo/Libraries/seekfree_peripheral/SEEKFREE_IIC.c b/Example/9-PWM_Demo/Libraries/seekfree_peripheral/SEEKFREE_IIC.c index 196fd57..f56a41a 100644 --- a/Example/9-PWM_Demo/Libraries/seekfree_peripheral/SEEKFREE_IIC.c +++ b/Example/9-PWM_Demo/Libraries/seekfree_peripheral/SEEKFREE_IIC.c @@ -50,7 +50,7 @@ uint8 IIC_num; // -static uint16 simiic_delay_time=100; //ICM等传感器应设置为100 +static uint16 simiic_delay_time = SIMIIC_DELAY_TIME; //ICM等传感器应设置为20 //------------------------------------------------------------------------------------------------------------------- diff --git a/Example/9-PWM_Demo/Libraries/seekfree_peripheral/SEEKFREE_IIC.h b/Example/9-PWM_Demo/Libraries/seekfree_peripheral/SEEKFREE_IIC.h index 293a02a..6a9c1e3 100644 --- a/Example/9-PWM_Demo/Libraries/seekfree_peripheral/SEEKFREE_IIC.h +++ b/Example/9-PWM_Demo/Libraries/seekfree_peripheral/SEEKFREE_IIC.h @@ -34,8 +34,12 @@ -#define SEEKFREE_SCL P13_0 //定义SCL引脚 可任意更改为其他IO -#define SEEKFREE_SDA P13_1 //定义SDA引脚 可任意更改为其他IO +#define SEEKFREE_SCL P02_3 //定义SCL引脚 可任意更改为其他IO +#define SEEKFREE_SDA P02_2 //定义SDA引脚 可任意更改为其他IO + + +#define SIMIIC_DELAY_TIME 20 + typedef enum IIC //DAC模块 { diff --git a/Example/9-PWM_Demo/Libraries/seekfree_peripheral/SEEKFREE_L3G4200D.c b/Example/9-PWM_Demo/Libraries/seekfree_peripheral/SEEKFREE_L3G4200D.c index 0f0c23a..5deb7d3 100644 --- a/Example/9-PWM_Demo/Libraries/seekfree_peripheral/SEEKFREE_L3G4200D.c +++ b/Example/9-PWM_Demo/Libraries/seekfree_peripheral/SEEKFREE_L3G4200D.c @@ -65,6 +65,7 @@ void l3g4200d_self_check(void) //------------------------------------------------------------------------------------------------------------------- void l3g4200d_init(void) { + simiic_init(); systick_delay_ms(STM0, 50); l3g4200d_self_check(); diff --git a/Example/9-PWM_Demo/Libraries/seekfree_peripheral/SEEKFREE_MMA8451.c b/Example/9-PWM_Demo/Libraries/seekfree_peripheral/SEEKFREE_MMA8451.c index c200427..8a5eec4 100644 --- a/Example/9-PWM_Demo/Libraries/seekfree_peripheral/SEEKFREE_MMA8451.c +++ b/Example/9-PWM_Demo/Libraries/seekfree_peripheral/SEEKFREE_MMA8451.c @@ -68,6 +68,7 @@ void mma8451_self_check(void) //------------------------------------------------------------------------------------------------------------------- uint8 mma845x_init(void) { + simiic_init(); systick_delay_ms(STM0, 50); mma8451_self_check(); diff --git a/Example/9-PWM_Demo/Libraries/seekfree_peripheral/SEEKFREE_MPU6050.c b/Example/9-PWM_Demo/Libraries/seekfree_peripheral/SEEKFREE_MPU6050.c index 0317aa0..686550d 100644 --- a/Example/9-PWM_Demo/Libraries/seekfree_peripheral/SEEKFREE_MPU6050.c +++ b/Example/9-PWM_Demo/Libraries/seekfree_peripheral/SEEKFREE_MPU6050.c @@ -71,6 +71,7 @@ void mpu6050_self1_check(void) //------------------------------------------------------------------------------------------------------------------- void mpu6050_init(void) { + simiic_init(); systick_delay_ms(STM0, 100); //上电延时 mpu6050_self1_check(); diff --git a/Example/9-PWM_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.c b/Example/9-PWM_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.c index 014b435..05f181f 100644 --- a/Example/9-PWM_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.c +++ b/Example/9-PWM_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.c @@ -38,7 +38,6 @@ #include "zf_gpio.h" #include "zf_eru.h" #include "zf_eru_dma.h" -#include "stdio.h" #include "SEEKFREE_MT9V03X.h" @@ -49,6 +48,8 @@ uint8 receive[3]; uint8 receive_num = 0; vuint8 uart_receive_flag; +uint8 link_list_num; + //需要配置到摄像头的数据 int16 MT9V03X_CFG[CONFIG_FINISH][2]= { @@ -305,7 +306,7 @@ void mt9v03x_init(void) gpio_init((PIN_enum)(MT9V03X_DATA_PIN+i), GPI, 0, PULLUP); } - eru_dma_init(MT9V03X_DMA_CH, GET_PORT_IN_ADDR(MT9V03X_DATA_PIN), mt9v03x_image[0], MT9V03X_PCLK_PIN, RISING, MT9V03X_W); + link_list_num = eru_dma_init(MT9V03X_DMA_CH, GET_PORT_IN_ADDR(MT9V03X_DATA_PIN), mt9v03x_image[0], MT9V03X_PCLK_PIN, RISING, MT9V03X_W*MT9V03X_H); eru_init(MT9V03X_VSYNC_PIN, FALLING); //初始化场中断,并设置为下降沿触发中断 restoreInterrupts(interrupt_state); @@ -313,7 +314,6 @@ void mt9v03x_init(void) uint8 mt9v03x_finish_flag = 0; //一场图像采集完成标志位 -uint8 now_col; //当前正在采集的行 //------------------------------------------------------------------------------------------------------------------- // @brief MT9V03X摄像头场中断 // @param NULL @@ -324,16 +324,15 @@ uint8 now_col; // void mt9v03x_vsync(void) { CLEAR_GPIO_FLAG(MT9V03X_VSYNC_PIN); - now_col = 0; + if(!mt9v03x_finish_flag)//查看图像数组是否使用完毕,如果未使用完毕则不开始采集,避免出现访问冲突 { - DMA_SET_DESTINATION(MT9V03X_DMA_CH, (void *)&mt9v03x_image[0]); dma_start(MT9V03X_DMA_CH); } } - +uint8 mt9v03x_dma_int_num; //当前DMA中断次数 //------------------------------------------------------------------------------------------------------------------- // @brief MT9V03X摄像头DMA完成中断 // @param NULL @@ -344,16 +343,15 @@ void mt9v03x_vsync(void) void mt9v03x_dma(void) { CLEAR_DMA_FLAG(MT9V03X_DMA_CH); + mt9v03x_dma_int_num++; - now_col++; - - if(MT9V03X_H > now_col) - { - dma_start(MT9V03X_DMA_CH); - } - else + if(mt9v03x_dma_int_num >= link_list_num) { + //采集完成 + mt9v03x_dma_int_num = 0; mt9v03x_finish_flag = 1;//一副图像从采集开始到采集结束耗时3.8MS左右(50FPS、188*120分辨率) + dma_stop(MT9V03X_DMA_CH); + } } diff --git a/Example/9-PWM_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.h b/Example/9-PWM_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.h index a29edd2..0c8a785 100644 --- a/Example/9-PWM_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.h +++ b/Example/9-PWM_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.h @@ -63,9 +63,7 @@ //例如场中断选择ERU_CH3 那么像素引脚就不能选择ERU_CH7,因为3和7的中断是共用的。 #define MT9V03X_DMA_CH IfxDma_ChannelId_5 //定义使用的DMA通道 0-47可选 通道号越大优先级越低 - //修改此处之后,需要修改对应的ERU中断优先级,例如此处设置为IfxDma_ChannelId_5则对应的ERU中断优先级应该设置为5 - - + //摄像头命令枚举 typedef enum { diff --git a/Example/9-PWM_Demo/USER/isr.c b/Example/9-PWM_Demo/USER/isr.c index 15666f2..c6376b0 100644 --- a/Example/9-PWM_Demo/USER/isr.c +++ b/Example/9-PWM_Demo/USER/isr.c @@ -98,7 +98,8 @@ IFX_INTERRUPT(eru_ch3_ch7_isr, ERU_CH3_CH7_INT_SERVICE, ERU_CH3_CH7_INT_PRIO) if(GET_GPIO_FLAG(ERU_CH3_REQ6_P02_0))//通道3中断 { CLEAR_GPIO_FLAG(ERU_CH3_REQ6_P02_0); - if(1 == camera_type)mt9v03x_vsync(); + if (1 == camera_type) mt9v03x_vsync(); + else if (3 == camera_type) ov7725_vsync(); } if(GET_GPIO_FLAG(ERU_CH7_REQ16_P15_1))//通道7中断 @@ -113,7 +114,8 @@ IFX_INTERRUPT(eru_ch3_ch7_isr, ERU_CH3_CH7_INT_SERVICE, ERU_CH3_CH7_INT_PRIO) IFX_INTERRUPT(dma_ch5_isr, ERU_DMA_INT_SERVICE, ERU_DMA_INT_PRIO) { - if(1 == camera_type) mt9v03x_dma(); + if (1 == camera_type) mt9v03x_dma(); + else if (3 == camera_type) ov7725_dma(); } diff --git a/Seekfree_TC264_Opensource_Library/Libraries/doc/version.txt b/Seekfree_TC264_Opensource_Library/Libraries/doc/version.txt index b85cd50..a42bc58 100644 --- a/Seekfree_TC264_Opensource_Library/Libraries/doc/version.txt +++ b/Seekfree_TC264_Opensource_Library/Libraries/doc/version.txt @@ -1,9 +1,17 @@ V1.0.0 - 初始版本 + 初始版本 V1.0.1 对总钻风摄像头的场中断进行修改,判断标志位为0才采集下一幅图像,避免出现访问冲突 修改SPI初始化中的错误,引用了固定的SPI2基地址 修复STM中无法使用STM1的问题 - 修复gtm pwm中最大占空比只有GTM_ATOM0_PWM_DUTY_MAX设置有效的问题 \ No newline at end of file + 修复gtm pwm中最大占空比只有GTM_ATOM0_PWM_DUTY_MAX设置有效的问题 + +V1.0.2 + 修改模拟IIC默认延时时间为20 + 添加 需要特别注意P20_2是不能用于输出的,仅仅只有输入的功能 注意事项 + 将摄像头采集DMA改为link传输,可以大大降低DMA中断次数 + 修改默认的软件IIC引脚定义 + 将6050等 需要用到软件IIC的模块,在初始化函数中默认调用模拟IIC初始化 + 添加小钻风驱动程序 \ No newline at end of file diff --git a/Seekfree_TC264_Opensource_Library/Libraries/seekfree_libraries/common/common.c b/Seekfree_TC264_Opensource_Library/Libraries/seekfree_libraries/common/common.c index 0460d15..ac42b19 100644 --- a/Seekfree_TC264_Opensource_Library/Libraries/seekfree_libraries/common/common.c +++ b/Seekfree_TC264_Opensource_Library/Libraries/seekfree_libraries/common/common.c @@ -22,7 +22,7 @@ #include "SysSe/Bsp/Bsp.h" #include "common.h" -uint8 camera_type; +uint8 camera_type; //摄像头型号 1:总钻风 2:凌瞳(暂未支持)3:小钻风 diff --git a/Seekfree_TC264_Opensource_Library/Libraries/seekfree_libraries/common/common.h b/Seekfree_TC264_Opensource_Library/Libraries/seekfree_libraries/common/common.h index fe7ec63..13d03cd 100644 --- a/Seekfree_TC264_Opensource_Library/Libraries/seekfree_libraries/common/common.h +++ b/Seekfree_TC264_Opensource_Library/Libraries/seekfree_libraries/common/common.h @@ -111,7 +111,7 @@ typedef enum //枚 #include -extern uint8 camera_type; +extern uint8 camera_type; //摄像头型号 1:总钻风 2:凌瞳(暂未支持)3:小钻风 void get_clk(void); diff --git a/Seekfree_TC264_Opensource_Library/Libraries/seekfree_libraries/headfile.h b/Seekfree_TC264_Opensource_Library/Libraries/seekfree_libraries/headfile.h index 0e8024f..e11bd83 100644 --- a/Seekfree_TC264_Opensource_Library/Libraries/seekfree_libraries/headfile.h +++ b/Seekfree_TC264_Opensource_Library/Libraries/seekfree_libraries/headfile.h @@ -62,6 +62,7 @@ #include "SEEKFREE_L3G4200D.h" #include "SEEKFREE_WIRELESS.h" #include "SEEKFREE_IPS200_PARALLEL8.h" +#include "SEEKFREE_7725.h" #endif diff --git a/Seekfree_TC264_Opensource_Library/Libraries/seekfree_libraries/zf_eru_dma.c b/Seekfree_TC264_Opensource_Library/Libraries/seekfree_libraries/zf_eru_dma.c index f7aab10..86c0158 100644 --- a/Seekfree_TC264_Opensource_Library/Libraries/seekfree_libraries/zf_eru_dma.c +++ b/Seekfree_TC264_Opensource_Library/Libraries/seekfree_libraries/zf_eru_dma.c @@ -21,9 +21,18 @@ #include "IfxDma_Dma.h" #include "IfxScuEru.h" #include "isr_config.h" +#include "zf_assert.h" #include "zf_eru_dma.h" +typedef struct +{ + Ifx_DMA_CH IFX_ALIGN(256) linked_list[8];//DMA链表 + IfxDma_Dma_Channel channel; //DMA通道句柄 +}DMA_LINK; + + +DMA_LINK dma_link_list; //------------------------------------------------------------------------------------------------------------------- // @brief eru触发dma初始化 @@ -36,7 +45,7 @@ // @return void // Sample usage: //------------------------------------------------------------------------------------------------------------------- -void eru_dma_init(IfxDma_ChannelId dma_ch, uint8 *source_addr, uint8 *destination_addr, ERU_PIN_enum eru_pin, TRIGGER_enum trigger, uint16 dma_count) +uint8 eru_dma_init(IfxDma_ChannelId dma_ch, uint8 *source_addr, uint8 *destination_addr, ERU_PIN_enum eru_pin, TRIGGER_enum trigger, uint16 dma_count) { IfxDma_Dma_Channel dmaChn; //eru触发DMA通道号 在eru文件中设置eru的优先级,即为触发的通道 @@ -51,27 +60,85 @@ void eru_dma_init(IfxDma_ChannelId dma_ch, uint8 *source_addr, uint8 *destinatio IfxDma_Dma_ChannelConfig cfg; IfxDma_Dma_initChannelConfig(&cfg, &dma); - cfg.transferCount = dma_count; + uint8 list_num, i; + uint16 single_channel_dma_count; + + ZF_ASSERT(!(dma_count%8));//传输次数必须为8的倍数 + + + list_num = 1; + single_channel_dma_count = dma_count / list_num; + if(16384 < single_channel_dma_count) + { + while(TRUE) + { + single_channel_dma_count = dma_count / list_num; + if((single_channel_dma_count <= 16384) && !(dma_count % list_num)) + { + break; + } + list_num++; + if(list_num > 8) ZF_ASSERT(FALSE); + } + } + + + if(1 == list_num) + { + cfg.shadowControl = IfxDma_ChannelShadow_none; + cfg.operationMode = IfxDma_ChannelOperationMode_single; + cfg.shadowAddress = 0; + } + else + { + cfg.shadowControl = IfxDma_ChannelShadow_linkedList; + cfg.operationMode = IfxDma_ChannelOperationMode_continuous; + cfg.shadowAddress = IFXCPU_GLB_ADDR_DSPR(IfxCpu_getCoreId(), (unsigned)&dma_link_list.linked_list[1]); + } + cfg.requestMode = IfxDma_ChannelRequestMode_oneTransferPerRequest; cfg.moveSize = IfxDma_ChannelMoveSize_8bit; + cfg.busPriority = IfxDma_ChannelBusPriority_high; - cfg.busPriority = IfxDma_ChannelBusPriority_high; - - cfg.sourceAddress = (unsigned)(source_addr); + cfg.sourceAddress = IFXCPU_GLB_ADDR_DSPR(IfxCpu_getCoreId(), source_addr); cfg.sourceAddressCircularRange = IfxDma_ChannelIncrementCircular_none; cfg.sourceCircularBufferEnabled = TRUE; - cfg.destinationAddress = IFXCPU_GLB_ADDR_DSPR(IfxCpu_getCoreId(), destination_addr); cfg.destinationAddressIncrementStep = IfxDma_ChannelIncrementStep_1; - cfg.operationMode = IfxDma_ChannelOperationMode_single; - cfg.channelId = (IfxDma_ChannelId)dma_ch; - cfg.hardwareRequestEnabled = TRUE; - cfg.channelInterruptEnabled = TRUE; + cfg.channelId = (IfxDma_ChannelId)dma_ch; + cfg.hardwareRequestEnabled = FALSE; + cfg.channelInterruptEnabled = TRUE; cfg.channelInterruptPriority = ERU_DMA_INT_PRIO; cfg.channelInterruptTypeOfService = (IfxSrc_Tos)ERU_DMA_INT_SERVICE; + + + cfg.destinationAddress = IFXCPU_GLB_ADDR_DSPR(IfxCpu_getCoreId(), destination_addr); + + cfg.transferCount = single_channel_dma_count; + IfxDma_Dma_initChannel(&dmaChn, &cfg); + + if(1 < list_num) + { + i = 0; + while(i < list_num) + { + cfg.destinationAddress = IFXCPU_GLB_ADDR_DSPR(IfxCpu_getCoreId(), destination_addr + single_channel_dma_count * i); + if(i == (list_num - 1)) cfg.shadowAddress = IFXCPU_GLB_ADDR_DSPR(IfxCpu_getCoreId(), (unsigned)&dma_link_list.linked_list[0]); + else cfg.shadowAddress = IFXCPU_GLB_ADDR_DSPR(IfxCpu_getCoreId(), (unsigned)&dma_link_list.linked_list[i+1]); + cfg.transferCount = single_channel_dma_count; + + IfxDma_Dma_initLinkedListEntry((void *)&dma_link_list.linked_list[i], &cfg); + i++; + } + } + + + IfxDma_Dma_getSrcPointer(&dma_link_list.channel)->B.CLRR = 1; + + return list_num; } diff --git a/Seekfree_TC264_Opensource_Library/Libraries/seekfree_libraries/zf_eru_dma.h b/Seekfree_TC264_Opensource_Library/Libraries/seekfree_libraries/zf_eru_dma.h index 50667ad..faef169 100644 --- a/Seekfree_TC264_Opensource_Library/Libraries/seekfree_libraries/zf_eru_dma.h +++ b/Seekfree_TC264_Opensource_Library/Libraries/seekfree_libraries/zf_eru_dma.h @@ -29,9 +29,9 @@ #define CLEAR_DMA_FLAG(dma_ch) IfxDma_clearChannelInterrupt(&MODULE_DMA, dma_ch); -#define DMA_SET_DESTINATION(dma_ch, destination_addr) IfxDma_setChannelDestinationAddress(&MODULE_DMA, dma_ch, (void *)destination_addr) +#define DMA_SET_DESTINATION(dma_ch, destination_addr) IfxDma_setChannelDestinationAddress(&MODULE_DMA, dma_ch, (void *)IFXCPU_GLB_ADDR_DSPR(IfxCpu_getCoreId(), destination_addr)) -void eru_dma_init(IfxDma_ChannelId dma_ch, uint8 *source_addr, uint8 *destination_addr, ERU_PIN_enum eru_pin, TRIGGER_enum trigger, uint16 dma_count); +uint8 eru_dma_init(IfxDma_ChannelId dma_ch, uint8 *source_addr, uint8 *destination_addr, ERU_PIN_enum eru_pin, TRIGGER_enum trigger, uint16 dma_count); void dma_stop(IfxDma_ChannelId dma_ch); void dma_start(IfxDma_ChannelId dma_ch); diff --git a/Seekfree_TC264_Opensource_Library/Libraries/seekfree_libraries/zf_gpio.c b/Seekfree_TC264_Opensource_Library/Libraries/seekfree_libraries/zf_gpio.c index 3c937cf..1d2466c 100644 --- a/Seekfree_TC264_Opensource_Library/Libraries/seekfree_libraries/zf_gpio.c +++ b/Seekfree_TC264_Opensource_Library/Libraries/seekfree_libraries/zf_gpio.c @@ -60,6 +60,7 @@ Ifx_P* get_port(PIN_enum pin) // @param pinmode 引脚配置(可设置参数由zf_gpio.h文件内GPIOMODE_enum枚举值确定) // @return void // Sample usage: gpio_init(P00_0, GPO, 1, PUSHPULL);//P00_0初始化为GPIO功能、输出模式、输出高电平、推挽输出 +// @note 需要特别注意P20_2是不能用于输出的,仅仅只有输入的功能 //------------------------------------------------------------------------------------------------------------------- void gpio_init(PIN_enum pin, GPIODIR_enum dir, uint8 dat, GPIOMODE_enum pinmode) { diff --git a/Seekfree_TC264_Opensource_Library/Libraries/seekfree_libraries/zf_gpio.h b/Seekfree_TC264_Opensource_Library/Libraries/seekfree_libraries/zf_gpio.h index cfbd666..e3d144f 100644 --- a/Seekfree_TC264_Opensource_Library/Libraries/seekfree_libraries/zf_gpio.h +++ b/Seekfree_TC264_Opensource_Library/Libraries/seekfree_libraries/zf_gpio.h @@ -38,6 +38,15 @@ typedef enum // 枚 #define GET_PORT_IN_ADDR(pin) (uint8 *)(&IfxPort_getAddress((IfxPort_Index)(pin/32))->IN + pin%32/8) + + +//需要特别注意P20_2是不能用于输出的,仅仅只有输入的功能 +//需要特别注意P20_2是不能用于输出的,仅仅只有输入的功能 +//需要特别注意P20_2是不能用于输出的,仅仅只有输入的功能 + + + + //------------------------------------------------------ //通用GPIO操作 void gpio_init(PIN_enum pin, GPIODIR_enum dir, uint8 dat, GPIOMODE_enum pinconf); diff --git a/Seekfree_TC264_Opensource_Library/Libraries/seekfree_peripheral/SEEKFREE_7725.c b/Seekfree_TC264_Opensource_Library/Libraries/seekfree_peripheral/SEEKFREE_7725.c new file mode 100644 index 0000000..806b8d9 --- /dev/null +++ b/Seekfree_TC264_Opensource_Library/Libraries/seekfree_peripheral/SEEKFREE_7725.c @@ -0,0 +1,262 @@ +/********************************************************************************************************************* + * COPYRIGHT NOTICE + * Copyright (c) 2020,逐飞科技 + * All rights reserved. + * 技术讨论QQ群:三群:824575535 + * + * 以下所有内容版权均属逐飞科技所有,未经允许不得用于商业用途, + * 欢迎各位使用并传播本程序,修改内容时必须保留逐飞科技的版权声明。 + * + * @file main + * @company 成都逐飞科技有限公司 + * @author 逐飞科技(QQ3184284598) + * @version 查看doc内version文件 版本说明 + * @Software tasking v6.3r1 + * @Target core TC264D + * @Taobao https://seekfree.taobao.com/ + * @date 2020-3-23 + * @note + 接线定义: + ------------------------------------ + 模块管脚 单片机管脚 + SDA 查看SEEKFREE_IIC文件内的SEEKFREE_SDA宏定义 + SCL 查看SEEKFREE_IIC文件内的SEEKFREE_SCL宏定义 + 场中断(VSY) 查看SEEKFREE_OV7725.h文件中的OV7725_VSYNC_PIN宏定义 + 行中断(HREF) 未使用,因此不接 + 像素中断(PCLK) 查看SEEKFREE_OV7725.h文件中的OV7725_PCLK_PIN宏定义 + 数据口(D0-D7) 查看SEEKFREE_OV7725.h文件中的OV7725_DATA_PIN宏定义 + ------------------------------------ + + 默认分辨率是 160*120 + 默认FPS 50帧 + ********************************************************************************************************************/ + + +#include "IfxDma.h" +#include "IfxScuEru.h" +#include "zf_stm_systick.h" +#include "zf_gpio.h" +#include "zf_eru.h" +#include "zf_eru_dma.h" +#include "SEEKFREE_IIC.h" +#include "SEEKFREE_7725.h" + + + +IFX_ALIGN(4) uint8 image_bin[OV7725_H][OV7725_W/8]; //定义存储接收图像的数组 +uint8 image_dec[OV7725_H][OV7725_W]; + +uint8 ov7725_idcode = 0; + +//------------------------------------------------------------------------------------------------------------------- +// @brief 小钻风摄像头内部寄存器初始化(内部使用,用户无需调用) +// @param NULL +// @return uint8 返回0则出错,返回1则成功 +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +uint8 ov7725_reg_init(void) +{ + simiic_delay_set(500); + simiic_write_reg ( OV7725_DEV_ADD, OV7725_COM7, 0x80 ); //复位摄像头 + systick_delay_ms(STM0, 50); + ov7725_idcode = simiic_read_reg( OV7725_DEV_ADD, OV7725_VER ,SCCB); + if( ov7725_idcode != OV7725_ID ) return 0; //校验摄像头ID号 + + //ID号确认无误 然后配置寄存器 + simiic_write_reg(OV7725_DEV_ADD, OV7725_COM4 , 0xC1); + simiic_write_reg(OV7725_DEV_ADD, OV7725_CLKRC , 0x01); + simiic_write_reg(OV7725_DEV_ADD, OV7725_COM2 , 0x03); + simiic_write_reg(OV7725_DEV_ADD, OV7725_COM3 , 0xD0); + simiic_write_reg(OV7725_DEV_ADD, OV7725_COM7 , 0x40); + simiic_write_reg(OV7725_DEV_ADD, OV7725_COM8 , 0xCE); //0xCE:关闭自动曝光 0xCF:开启自动曝光 + simiic_write_reg(OV7725_DEV_ADD, OV7725_HSTART , 0x3F); + simiic_write_reg(OV7725_DEV_ADD, OV7725_HSIZE , 0x50); + simiic_write_reg(OV7725_DEV_ADD, OV7725_VSTRT , 0x03); + simiic_write_reg(OV7725_DEV_ADD, OV7725_VSIZE , 0x78); + simiic_write_reg(OV7725_DEV_ADD, OV7725_HREF , 0x00); + simiic_write_reg(OV7725_DEV_ADD, OV7725_SCAL0 , 0x0A); + simiic_write_reg(OV7725_DEV_ADD, OV7725_AWB_Ctrl0 , 0xE0); + simiic_write_reg(OV7725_DEV_ADD, OV7725_DSPAuto , 0xff); + simiic_write_reg(OV7725_DEV_ADD, OV7725_DSP_Ctrl2 , 0x0C); + simiic_write_reg(OV7725_DEV_ADD, OV7725_DSP_Ctrl3 , 0x00); + simiic_write_reg(OV7725_DEV_ADD, OV7725_DSP_Ctrl4 , 0x00); + + if(OV7725_W == 80) simiic_write_reg(OV7725_DEV_ADD, OV7725_HOutSize , 0x14); + else if(OV7725_W == 160) simiic_write_reg(OV7725_DEV_ADD, OV7725_HOutSize , 0x28); + else if(OV7725_W == 240) simiic_write_reg(OV7725_DEV_ADD, OV7725_HOutSize , 0x3c); + else if(OV7725_W == 320) simiic_write_reg(OV7725_DEV_ADD, OV7725_HOutSize , 0x50); + + if(OV7725_H == 60) simiic_write_reg(OV7725_DEV_ADD, OV7725_VOutSize , 0x1E); + else if(OV7725_H == 120) simiic_write_reg(OV7725_DEV_ADD, OV7725_VOutSize , 0x3c); + else if(OV7725_H == 180) simiic_write_reg(OV7725_DEV_ADD, OV7725_VOutSize , 0x5a); + else if(OV7725_H == 240) simiic_write_reg(OV7725_DEV_ADD, OV7725_VOutSize , 0x78); + + simiic_write_reg(OV7725_DEV_ADD, OV7725_REG28 , 0x01); + simiic_write_reg(OV7725_DEV_ADD, OV7725_EXHCH , 0x10); + simiic_write_reg(OV7725_DEV_ADD, OV7725_EXHCL , 0x1F); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM1 , 0x0c); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM2 , 0x16); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM3 , 0x2a); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM4 , 0x4e); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM5 , 0x61); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM6 , 0x6f); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM7 , 0x7b); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM8 , 0x86); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM9 , 0x8e); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM10 , 0x97); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM11 , 0xa4); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM12 , 0xaf); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM13 , 0xc5); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM14 , 0xd7); + simiic_write_reg(OV7725_DEV_ADD, OV7725_GAM15 , 0xe8); + simiic_write_reg(OV7725_DEV_ADD, OV7725_SLOP , 0x20); + simiic_write_reg(OV7725_DEV_ADD, OV7725_LC_RADI , 0x00); + simiic_write_reg(OV7725_DEV_ADD, OV7725_LC_COEF , 0x13); + simiic_write_reg(OV7725_DEV_ADD, OV7725_LC_XC , 0x08); + simiic_write_reg(OV7725_DEV_ADD, OV7725_LC_COEFB , 0x14); + simiic_write_reg(OV7725_DEV_ADD, OV7725_LC_COEFR , 0x17); + simiic_write_reg(OV7725_DEV_ADD, OV7725_LC_CTR , 0x05); + simiic_write_reg(OV7725_DEV_ADD, OV7725_BDBase , 0x99); + simiic_write_reg(OV7725_DEV_ADD, OV7725_BDMStep , 0x03); + simiic_write_reg(OV7725_DEV_ADD, OV7725_SDE , 0x04); + simiic_write_reg(OV7725_DEV_ADD, OV7725_BRIGHT , 0x00); + simiic_write_reg(OV7725_DEV_ADD, OV7725_CNST , 0x40); + simiic_write_reg(OV7725_DEV_ADD, OV7725_SIGN , 0x06); + simiic_write_reg(OV7725_DEV_ADD, OV7725_UVADJ0 , 0x11); + simiic_write_reg(OV7725_DEV_ADD, OV7725_UVADJ1 , 0x02); + + + simiic_delay_set(SIMIIC_DELAY_TIME);//修改为默认的20 + return 1; + + +} + + + + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 小钻风摄像头采集程序初始化(内部使用,用户无需调用) +// @param NULL +// @return void +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +void ov7725_port_init(void) +{ + uint8 i; + camera_type = 3;//设置连接摄像头类型 + + //摄像头采集初始化 + //初始化 数据引脚 + for(i=0; i<8; i++) + { + gpio_init((PIN_enum)(OV7725_DATA_PIN+i), GPI, 0, PULLUP); + } + eru_dma_init(OV7725_DMA_CH, GET_PORT_IN_ADDR(OV7725_DATA_PIN), image_bin[0], OV7725_PCLK_PIN, FALLING, OV7725_DMA_NUM); + eru_init(OV7725_VSYNC_PIN, FALLING); //初始化场中断,并设置为下降沿触发中断 + +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 小钻风摄像头初始化(调用之后设置好相关中断函数即可采集图像) +// @param NULL +// @return 0 +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +uint8 ov7725_init(void) +{ + simiic_init(); + ov7725_reg_init(); //摄像头寄存器配置 + ov7725_port_init(); //摄像头中断引脚及DMA配置 + return 0; +} + + + + +uint8 ov7725_finish_flag = 0; +//------------------------------------------------------------------------------------------------------------------- +// @brief 小钻风摄像头场中断 +// @param NULL +// @return void +// @since v1.0 +// Sample usage: 此函数在isr.c中被eru(GPIO中断)中断调用 +//------------------------------------------------------------------------------------------------------------------- +void ov7725_vsync(void) +{ + CLEAR_GPIO_FLAG(OV7725_VSYNC_PIN); + + if(!ov7725_finish_flag)//查看图像数组是否使用完毕,如果未使用完毕则不开始采集,避免出现访问冲突 + { + DMA_SET_DESTINATION(OV7725_DMA_CH, image_bin[0]); + dma_start(OV7725_DMA_CH); + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 小钻风摄像头DMA完成中断 +// @param NULL +// @return void +// @since v1.0 +// Sample usage: 此函数在isr.c中被dma中断调用 +//------------------------------------------------------------------------------------------------------------------- +void ov7725_dma(void) +{ + CLEAR_DMA_FLAG(OV7725_DMA_CH); + ov7725_finish_flag = 1; + dma_stop(OV7725_DMA_CH); +} + + + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 小钻风摄像头数据解压函数 +// @param *data1 源地址 +// @param *data2 目的地址 +// @return void +// @since v1.0 +// Sample usage: Image_Decompression(da1,dat2[0]);//将一维数组dat1的内容解压到二维数组dat2里. +//------------------------------------------------------------------------------------------------------------------- +void image_decompression(uint8 *data1,uint8 *data2) +{ + uint8 temp[2] = {0,255}; + uint16 lenth = OV7725_SIZE; + uint8 i = 8; + + + while(lenth--) + { + i = 8; + while(i--) + { + *data2++ = temp[(*data1 >> i) & 0x01]; + } + data1++; + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 小钻风摄像头未解压图像发送至上位机查看图像 +// @param *imgaddr 压缩图像数据地址 +// @param *imgsize 图像大小(直接填写OV7725_SIZE) +// @return void +// @since v1.0 +// Sample usage: 调用该函数前请先初始化uart2 +//------------------------------------------------------------------------------------------------------------------- +void seekfree_sendimg_7725(UARTN_enum uartn) +{ + uart_putchar(uartn, 0x00);uart_putchar(uartn, 0xff);uart_putchar(uartn, 0x01);uart_putchar(uartn, 0x01);//发送四个字节命令 + uart_putbuff(uartn, image_bin[0], OV7725_SIZE); //再发送图像 +} + + + + diff --git a/Seekfree_TC264_Opensource_Library/Libraries/seekfree_peripheral/SEEKFREE_7725.h b/Seekfree_TC264_Opensource_Library/Libraries/seekfree_peripheral/SEEKFREE_7725.h new file mode 100644 index 0000000..e513250 --- /dev/null +++ b/Seekfree_TC264_Opensource_Library/Libraries/seekfree_peripheral/SEEKFREE_7725.h @@ -0,0 +1,243 @@ +/********************************************************************************************************************* + * COPYRIGHT NOTICE + * Copyright (c) 2020,逐飞科技 + * All rights reserved. + * 技术讨论QQ群:三群:824575535 + * + * 以下所有内容版权均属逐飞科技所有,未经允许不得用于商业用途, + * 欢迎各位使用并传播本程序,修改内容时必须保留逐飞科技的版权声明。 + * + * @file main + * @company 成都逐飞科技有限公司 + * @author 逐飞科技(QQ3184284598) + * @version 查看doc内version文件 版本说明 + * @Software tasking v6.3r1 + * @Target core TC264D + * @Taobao https://seekfree.taobao.com/ + * @date 2020-3-23 + * @note + 接线定义: + ------------------------------------ + 模块管脚 单片机管脚 + SDA 查看SEEKFREE_IIC文件内的SEEKFREE_SDA宏定义 + SCL 查看SEEKFREE_IIC文件内的SEEKFREE_SCL宏定义 + 场中断(VSY) 查看SEEKFREE_OV7725.h文件中的OV7725_VSYNC_PIN宏定义 + 行中断(HREF) 未使用,因此不接 + 像素中断(PCLK) 查看SEEKFREE_OV7725.h文件中的OV7725_PCLK_PIN宏定义 + 数据口(D0-D7) 查看SEEKFREE_OV7725.h文件中的OV7725_DATA_PIN宏定义 + ------------------------------------ + + 默认分辨率是 160*120 + 默认FPS 50帧 + ********************************************************************************************************************/ + + + +#ifndef _SEEKFREE_7725_h +#define _SEEKFREE_7725_h + +#include "common.h" +#include "IfxDma_cfg.h" +#include "zf_uart.h" + + +//摄像头ID号 +#define OV7725_ID 0x21 + +//摄像头寄存器 +#define OV7725_GAIN 0x00 +#define OV7725_BLUE 0x01 +#define OV7725_RED 0x02 +#define OV7725_GREEN 0x03 +#define OV7725_BAVG 0x05 +#define OV7725_GAVG 0x06 +#define OV7725_RAVG 0x07 +#define OV7725_AECH 0x08 +#define OV7725_COM2 0x09 +#define OV7725_PID 0x0A +#define OV7725_VER 0x0B +#define OV7725_COM3 0x0C +#define OV7725_COM4 0x0D +#define OV7725_COM5 0x0E +#define OV7725_COM6 0x0F +#define OV7725_AEC 0x10 +#define OV7725_CLKRC 0x11 +#define OV7725_COM7 0x12 +#define OV7725_COM8 0x13 +#define OV7725_COM9 0x14 +#define OV7725_COM10 0x15 +#define OV7725_REG16 0x16 +#define OV7725_HSTART 0x17 +#define OV7725_HSIZE 0x18 +#define OV7725_VSTRT 0x19 +#define OV7725_VSIZE 0x1A +#define OV7725_PSHFT 0x1B +#define OV7725_MIDH 0x1C +#define OV7725_MIDL 0x1D +#define OV7725_LAEC 0x1F +#define OV7725_COM11 0x20 +#define OV7725_BDBase 0x22 +#define OV7725_BDMStep 0x23 +#define OV7725_AEW 0x24 +#define OV7725_AEB 0x25 +#define OV7725_VPT 0x26 +#define OV7725_REG28 0x28 +#define OV7725_HOutSize 0x29 +#define OV7725_EXHCH 0x2A +#define OV7725_EXHCL 0x2B +#define OV7725_VOutSize 0x2C +#define OV7725_ADVFL 0x2D +#define OV7725_ADVFH 0x2E +#define OV7725_YAVE 0x2F +#define OV7725_LumHTh 0x30 +#define OV7725_LumLTh 0x31 +#define OV7725_HREF 0x32 +#define OV7725_DM_LNL 0x33 +#define OV7725_DM_LNH 0x34 +#define OV7725_ADoff_B 0x35 +#define OV7725_ADoff_R 0x36 +#define OV7725_ADoff_Gb 0x37 +#define OV7725_ADoff_Gr 0x38 +#define OV7725_Off_B 0x39 +#define OV7725_Off_R 0x3A +#define OV7725_Off_Gb 0x3B +#define OV7725_Off_Gr 0x3C +#define OV7725_COM12 0x3D +#define OV7725_COM13 0x3E +#define OV7725_COM14 0x3F +#define OV7725_COM16 0x41 +#define OV7725_TGT_B 0x42 +#define OV7725_TGT_R 0x43 +#define OV7725_TGT_Gb 0x44 +#define OV7725_TGT_Gr 0x45 +#define OV7725_LC_CTR 0x46 +#define OV7725_LC_XC 0x47 +#define OV7725_LC_YC 0x48 +#define OV7725_LC_COEF 0x49 +#define OV7725_LC_RADI 0x4A +#define OV7725_LC_COEFB 0x4B +#define OV7725_LC_COEFR 0x4C +#define OV7725_FixGain 0x4D +#define OV7725_AREF1 0x4F +#define OV7725_AREF6 0x54 +#define OV7725_UFix 0x60 +#define OV7725_VFix 0x61 +#define OV7725_AWBb_blk 0x62 +#define OV7725_AWB_Ctrl0 0x63 +#define OV7725_DSP_Ctrl1 0x64 +#define OV7725_DSP_Ctrl2 0x65 +#define OV7725_DSP_Ctrl3 0x66 +#define OV7725_DSP_Ctrl4 0x67 +#define OV7725_AWB_bias 0x68 +#define OV7725_AWBCtrl1 0x69 +#define OV7725_AWBCtrl2 0x6A +#define OV7725_AWBCtrl3 0x6B +#define OV7725_AWBCtrl4 0x6C +#define OV7725_AWBCtrl5 0x6D +#define OV7725_AWBCtrl6 0x6E +#define OV7725_AWBCtrl7 0x6F +#define OV7725_AWBCtrl8 0x70 +#define OV7725_AWBCtrl9 0x71 +#define OV7725_AWBCtrl10 0x72 +#define OV7725_AWBCtrl11 0x73 +#define OV7725_AWBCtrl12 0x74 +#define OV7725_AWBCtrl13 0x75 +#define OV7725_AWBCtrl14 0x76 +#define OV7725_AWBCtrl15 0x77 +#define OV7725_AWBCtrl16 0x78 +#define OV7725_AWBCtrl17 0x79 +#define OV7725_AWBCtrl18 0x7A +#define OV7725_AWBCtrl19 0x7B +#define OV7725_AWBCtrl20 0x7C +#define OV7725_AWBCtrl21 0x7D +#define OV7725_GAM1 0x7E +#define OV7725_GAM2 0x7F +#define OV7725_GAM3 0x80 +#define OV7725_GAM4 0x81 +#define OV7725_GAM5 0x82 +#define OV7725_GAM6 0x83 +#define OV7725_GAM7 0x84 +#define OV7725_GAM8 0x85 +#define OV7725_GAM9 0x86 +#define OV7725_GAM10 0x87 +#define OV7725_GAM11 0x88 +#define OV7725_GAM12 0x89 +#define OV7725_GAM13 0x8A +#define OV7725_GAM14 0x8B +#define OV7725_GAM15 0x8C +#define OV7725_SLOP 0x8D +#define OV7725_DNSTh 0x8E +#define OV7725_EDGE0 0x8F +#define OV7725_EDGE1 0x90 +#define OV7725_DNSOff 0x91 +#define OV7725_EDGE2 0x92 +#define OV7725_EDGE3 0x93 +#define OV7725_MTX1 0x94 +#define OV7725_MTX2 0x95 +#define OV7725_MTX3 0x96 +#define OV7725_MTX4 0x97 +#define OV7725_MTX5 0x98 +#define OV7725_MTX6 0x99 +#define OV7725_MTX_Ctrl 0x9A +#define OV7725_BRIGHT 0x9B +#define OV7725_CNST 0x9C +#define OV7725_UVADJ0 0x9E +#define OV7725_UVADJ1 0x9F +#define OV7725_SCAL0 0xA0 +#define OV7725_SCAL1 0xA1 +#define OV7725_SCAL2 0xA2 +#define OV7725_SDE 0xA6 +#define OV7725_USAT 0xA7 +#define OV7725_VSAT 0xA8 +#define OV7725_HUECOS 0xA9 +#define OV7725_HUESIN 0xAA +#define OV7725_SIGN 0xAB +#define OV7725_DSPAuto 0xAC + + +#define OV7725_DEV_ADD 0x42>>1 + + +//配置摄像头参数 +#define OV7725_W 160 //定义摄像头图像宽度 可设置参数 80 160 240 320 +#define OV7725_H 120 //定义摄像头图像高度 可设置参数 60 120 180 240 +#define OV7725_SIZE (OV7725_W * OV7725_H/8 ) //图像占用空间大小 +#define OV7725_DMA_NUM (OV7725_SIZE) //一副图像DMA采集次数 + + +//-------------------------------------------------------------------------------------------------- +//引脚配置 +//-------------------------------------------------------------------------------------------------- +#define OV7725_VSYNC_PIN ERU_CH3_REQ6_P02_0 //场中断引脚 可选范围参考ERU_PIN_enum枚举 不可与像素引脚选择为同一个通道,或者是共用中断的通道 + //例如场中断选择ERU_CH3 那么像素引脚就不能选择ERU_CH7,因为3和7的中断是共用的。 + +#define OV7725_DATA_PIN P00_0 //定义D0数据引脚 假设D0定义为P00_0 那么D1所使用的引脚则为P00_1,依次类推 + //可设置参数P00_0、P02_0、P15_0,不能设置为其他参数 + +#define OV7725_PCLK_PIN ERU_CH2_REQ14_P02_1 //定义像素时钟引脚 可选范围参考ERU_PIN_enum枚举 不可与场中断引脚选择为同一个通道,或者是共用中断的通道 + //例如场中断选择ERU_CH3 那么像素引脚就不能选择ERU_CH7,因为3和7的中断是共用的。 + +#define OV7725_DMA_CH IfxDma_ChannelId_5 //定义使用的DMA通道 0-47可选 通道号越大优先级越低 + //修改此处之后,需要修改对应的ERU中断优先级,例如此处设置为IfxDma_ChannelId_5则对应的ERU中断优先级应该设置为5 + + + +extern uint8 image_bin[OV7725_H][OV7725_W/8]; //定义存储接收图像的数组 +extern uint8 image_dec[OV7725_H][OV7725_W]; //图像解压后的数组 + +extern uint8 ov7725_finish_flag; //图像采集完成标志位 + + +//函数声明 +uint8 ov7725_init(void); +void ov7725_vsync(void); +void ov7725_dma(void); +void image_decompression(uint8 *data1,uint8 *data2); +void seekfree_sendimg_7725(UARTN_enum uartn); + + + +#endif + + + diff --git a/Seekfree_TC264_Opensource_Library/Libraries/seekfree_peripheral/SEEKFREE_ICM20602.c b/Seekfree_TC264_Opensource_Library/Libraries/seekfree_peripheral/SEEKFREE_ICM20602.c index 095f9e3..5d167c9 100644 --- a/Seekfree_TC264_Opensource_Library/Libraries/seekfree_peripheral/SEEKFREE_ICM20602.c +++ b/Seekfree_TC264_Opensource_Library/Libraries/seekfree_peripheral/SEEKFREE_ICM20602.c @@ -68,6 +68,7 @@ void icm20602_self1_check(void) //------------------------------------------------------------------------------------------------------------------- void icm20602_init(void) { + simiic_init(); systick_delay_ms(STM0, 10); //上电延时 //检测 diff --git a/Seekfree_TC264_Opensource_Library/Libraries/seekfree_peripheral/SEEKFREE_IIC.c b/Seekfree_TC264_Opensource_Library/Libraries/seekfree_peripheral/SEEKFREE_IIC.c index 196fd57..f56a41a 100644 --- a/Seekfree_TC264_Opensource_Library/Libraries/seekfree_peripheral/SEEKFREE_IIC.c +++ b/Seekfree_TC264_Opensource_Library/Libraries/seekfree_peripheral/SEEKFREE_IIC.c @@ -50,7 +50,7 @@ uint8 IIC_num; // -static uint16 simiic_delay_time=100; //ICM等传感器应设置为100 +static uint16 simiic_delay_time = SIMIIC_DELAY_TIME; //ICM等传感器应设置为20 //------------------------------------------------------------------------------------------------------------------- diff --git a/Seekfree_TC264_Opensource_Library/Libraries/seekfree_peripheral/SEEKFREE_IIC.h b/Seekfree_TC264_Opensource_Library/Libraries/seekfree_peripheral/SEEKFREE_IIC.h index 293a02a..6a9c1e3 100644 --- a/Seekfree_TC264_Opensource_Library/Libraries/seekfree_peripheral/SEEKFREE_IIC.h +++ b/Seekfree_TC264_Opensource_Library/Libraries/seekfree_peripheral/SEEKFREE_IIC.h @@ -34,8 +34,12 @@ -#define SEEKFREE_SCL P13_0 //定义SCL引脚 可任意更改为其他IO -#define SEEKFREE_SDA P13_1 //定义SDA引脚 可任意更改为其他IO +#define SEEKFREE_SCL P02_3 //定义SCL引脚 可任意更改为其他IO +#define SEEKFREE_SDA P02_2 //定义SDA引脚 可任意更改为其他IO + + +#define SIMIIC_DELAY_TIME 20 + typedef enum IIC //DAC模块 { diff --git a/Seekfree_TC264_Opensource_Library/Libraries/seekfree_peripheral/SEEKFREE_L3G4200D.c b/Seekfree_TC264_Opensource_Library/Libraries/seekfree_peripheral/SEEKFREE_L3G4200D.c index 0f0c23a..5deb7d3 100644 --- a/Seekfree_TC264_Opensource_Library/Libraries/seekfree_peripheral/SEEKFREE_L3G4200D.c +++ b/Seekfree_TC264_Opensource_Library/Libraries/seekfree_peripheral/SEEKFREE_L3G4200D.c @@ -65,6 +65,7 @@ void l3g4200d_self_check(void) //------------------------------------------------------------------------------------------------------------------- void l3g4200d_init(void) { + simiic_init(); systick_delay_ms(STM0, 50); l3g4200d_self_check(); diff --git a/Seekfree_TC264_Opensource_Library/Libraries/seekfree_peripheral/SEEKFREE_MMA8451.c b/Seekfree_TC264_Opensource_Library/Libraries/seekfree_peripheral/SEEKFREE_MMA8451.c index c200427..8a5eec4 100644 --- a/Seekfree_TC264_Opensource_Library/Libraries/seekfree_peripheral/SEEKFREE_MMA8451.c +++ b/Seekfree_TC264_Opensource_Library/Libraries/seekfree_peripheral/SEEKFREE_MMA8451.c @@ -68,6 +68,7 @@ void mma8451_self_check(void) //------------------------------------------------------------------------------------------------------------------- uint8 mma845x_init(void) { + simiic_init(); systick_delay_ms(STM0, 50); mma8451_self_check(); diff --git a/Seekfree_TC264_Opensource_Library/Libraries/seekfree_peripheral/SEEKFREE_MPU6050.c b/Seekfree_TC264_Opensource_Library/Libraries/seekfree_peripheral/SEEKFREE_MPU6050.c index 0317aa0..686550d 100644 --- a/Seekfree_TC264_Opensource_Library/Libraries/seekfree_peripheral/SEEKFREE_MPU6050.c +++ b/Seekfree_TC264_Opensource_Library/Libraries/seekfree_peripheral/SEEKFREE_MPU6050.c @@ -71,6 +71,7 @@ void mpu6050_self1_check(void) //------------------------------------------------------------------------------------------------------------------- void mpu6050_init(void) { + simiic_init(); systick_delay_ms(STM0, 100); //上电延时 mpu6050_self1_check(); diff --git a/Seekfree_TC264_Opensource_Library/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.c b/Seekfree_TC264_Opensource_Library/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.c index 014b435..05f181f 100644 --- a/Seekfree_TC264_Opensource_Library/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.c +++ b/Seekfree_TC264_Opensource_Library/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.c @@ -38,7 +38,6 @@ #include "zf_gpio.h" #include "zf_eru.h" #include "zf_eru_dma.h" -#include "stdio.h" #include "SEEKFREE_MT9V03X.h" @@ -49,6 +48,8 @@ uint8 receive[3]; uint8 receive_num = 0; vuint8 uart_receive_flag; +uint8 link_list_num; + //需要配置到摄像头的数据 int16 MT9V03X_CFG[CONFIG_FINISH][2]= { @@ -305,7 +306,7 @@ void mt9v03x_init(void) gpio_init((PIN_enum)(MT9V03X_DATA_PIN+i), GPI, 0, PULLUP); } - eru_dma_init(MT9V03X_DMA_CH, GET_PORT_IN_ADDR(MT9V03X_DATA_PIN), mt9v03x_image[0], MT9V03X_PCLK_PIN, RISING, MT9V03X_W); + link_list_num = eru_dma_init(MT9V03X_DMA_CH, GET_PORT_IN_ADDR(MT9V03X_DATA_PIN), mt9v03x_image[0], MT9V03X_PCLK_PIN, RISING, MT9V03X_W*MT9V03X_H); eru_init(MT9V03X_VSYNC_PIN, FALLING); //初始化场中断,并设置为下降沿触发中断 restoreInterrupts(interrupt_state); @@ -313,7 +314,6 @@ void mt9v03x_init(void) uint8 mt9v03x_finish_flag = 0; //一场图像采集完成标志位 -uint8 now_col; //当前正在采集的行 //------------------------------------------------------------------------------------------------------------------- // @brief MT9V03X摄像头场中断 // @param NULL @@ -324,16 +324,15 @@ uint8 now_col; // void mt9v03x_vsync(void) { CLEAR_GPIO_FLAG(MT9V03X_VSYNC_PIN); - now_col = 0; + if(!mt9v03x_finish_flag)//查看图像数组是否使用完毕,如果未使用完毕则不开始采集,避免出现访问冲突 { - DMA_SET_DESTINATION(MT9V03X_DMA_CH, (void *)&mt9v03x_image[0]); dma_start(MT9V03X_DMA_CH); } } - +uint8 mt9v03x_dma_int_num; //当前DMA中断次数 //------------------------------------------------------------------------------------------------------------------- // @brief MT9V03X摄像头DMA完成中断 // @param NULL @@ -344,16 +343,15 @@ void mt9v03x_vsync(void) void mt9v03x_dma(void) { CLEAR_DMA_FLAG(MT9V03X_DMA_CH); + mt9v03x_dma_int_num++; - now_col++; - - if(MT9V03X_H > now_col) - { - dma_start(MT9V03X_DMA_CH); - } - else + if(mt9v03x_dma_int_num >= link_list_num) { + //采集完成 + mt9v03x_dma_int_num = 0; mt9v03x_finish_flag = 1;//一副图像从采集开始到采集结束耗时3.8MS左右(50FPS、188*120分辨率) + dma_stop(MT9V03X_DMA_CH); + } } diff --git a/Seekfree_TC264_Opensource_Library/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.h b/Seekfree_TC264_Opensource_Library/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.h index a29edd2..0c8a785 100644 --- a/Seekfree_TC264_Opensource_Library/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.h +++ b/Seekfree_TC264_Opensource_Library/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.h @@ -63,9 +63,7 @@ //例如场中断选择ERU_CH3 那么像素引脚就不能选择ERU_CH7,因为3和7的中断是共用的。 #define MT9V03X_DMA_CH IfxDma_ChannelId_5 //定义使用的DMA通道 0-47可选 通道号越大优先级越低 - //修改此处之后,需要修改对应的ERU中断优先级,例如此处设置为IfxDma_ChannelId_5则对应的ERU中断优先级应该设置为5 - - + //摄像头命令枚举 typedef enum { diff --git a/Seekfree_TC264_Opensource_Library/USER/Cpu0_Main.c b/Seekfree_TC264_Opensource_Library/USER/Cpu0_Main.c index 486ec0e..ba8554a 100644 --- a/Seekfree_TC264_Opensource_Library/USER/Cpu0_Main.c +++ b/Seekfree_TC264_Opensource_Library/USER/Cpu0_Main.c @@ -26,7 +26,6 @@ int core0_main(void) get_clk();//获取时钟频率 务必保留 //用户在此处调用各种初始化函数等 - enableInterrupts(); while (TRUE) diff --git a/Seekfree_TC264_Opensource_Library/USER/isr.c b/Seekfree_TC264_Opensource_Library/USER/isr.c index 15666f2..c6376b0 100644 --- a/Seekfree_TC264_Opensource_Library/USER/isr.c +++ b/Seekfree_TC264_Opensource_Library/USER/isr.c @@ -98,7 +98,8 @@ IFX_INTERRUPT(eru_ch3_ch7_isr, ERU_CH3_CH7_INT_SERVICE, ERU_CH3_CH7_INT_PRIO) if(GET_GPIO_FLAG(ERU_CH3_REQ6_P02_0))//通道3中断 { CLEAR_GPIO_FLAG(ERU_CH3_REQ6_P02_0); - if(1 == camera_type)mt9v03x_vsync(); + if (1 == camera_type) mt9v03x_vsync(); + else if (3 == camera_type) ov7725_vsync(); } if(GET_GPIO_FLAG(ERU_CH7_REQ16_P15_1))//通道7中断 @@ -113,7 +114,8 @@ IFX_INTERRUPT(eru_ch3_ch7_isr, ERU_CH3_CH7_INT_SERVICE, ERU_CH3_CH7_INT_PRIO) IFX_INTERRUPT(dma_ch5_isr, ERU_DMA_INT_SERVICE, ERU_DMA_INT_PRIO) { - if(1 == camera_type) mt9v03x_dma(); + if (1 == camera_type) mt9v03x_dma(); + else if (3 == camera_type) ov7725_dma(); } diff --git a/銆愭枃妗c慣ASKING浣跨敤鏁欑▼ 鑺墖鎵嬪唽绛/閫愰绉戞妧 TASKING浣跨敤璇存槑涔 V1.0.pdf b/銆愭枃妗c慣ASKING浣跨敤鏁欑▼ 鑺墖鎵嬪唽绛/閫愰绉戞妧 TASKING浣跨敤璇存槑涔 V1.0.pdf deleted file mode 100644 index dc27b3c..0000000 Binary files a/銆愭枃妗c慣ASKING浣跨敤鏁欑▼ 鑺墖鎵嬪唽绛/閫愰绉戞妧 TASKING浣跨敤璇存槑涔 V1.0.pdf and /dev/null differ diff --git a/銆愭枃妗c慣ASKING浣跨敤鏁欑▼ 鑺墖鎵嬪唽绛/閫愰绉戞妧 TASKING浣跨敤璇存槑涔.pdf b/銆愭枃妗c慣ASKING浣跨敤鏁欑▼ 鑺墖鎵嬪唽绛/閫愰绉戞妧 TASKING浣跨敤璇存槑涔.pdf new file mode 100644 index 0000000..503101a Binary files /dev/null and b/銆愭枃妗c慣ASKING浣跨敤鏁欑▼ 鑺墖鎵嬪唽绛/閫愰绉戞妧 TASKING浣跨敤璇存槑涔.pdf differ