STM32 DCMI OV9655 直接在LCD显示

article/2025/9/20 14:44:42
  1. CUBEMX配置DCMI如下:
    在这里插入图片描述在这里插入图片描述
    在这里插入图片描述
    生成代码。
  2. DCMI初始化代码如下:
void HAL_DCMI_MspInit(DCMI_HandleTypeDef* hdcmi)
{GPIO_InitTypeDef GPIO_InitStruct = {0};if(hdcmi->Instance==DCMI){/* USER CODE BEGIN DCMI_MspInit 0 *//* USER CODE END DCMI_MspInit 0 *//* Peripheral clock enable */__HAL_RCC_DCMI_CLK_ENABLE();__HAL_RCC_GPIOA_CLK_ENABLE();__HAL_RCC_GPIOH_CLK_ENABLE();__HAL_RCC_GPIOI_CLK_ENABLE();/**DCMI GPIO ConfigurationPA6     ------> DCMI_PIXCLKPH8     ------> DCMI_HSYNCPH9     ------> DCMI_D0PH10     ------> DCMI_D1PH11     ------> DCMI_D2PH12     ------> DCMI_D3PH14     ------> DCMI_D4PI4     ------> DCMI_D5PI5     ------> DCMI_VSYNCPI6     ------> DCMI_D6PI7     ------> DCMI_D7*/GPIO_InitStruct.Pin = GPIO_PIN_6;GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;GPIO_InitStruct.Alternate = GPIO_AF13_DCMI;HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_14;GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;GPIO_InitStruct.Alternate = GPIO_AF13_DCMI;HAL_GPIO_Init(GPIOH, &GPIO_InitStruct);GPIO_InitStruct.Pin = GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7;GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;GPIO_InitStruct.Alternate = GPIO_AF13_DCMI;HAL_GPIO_Init(GPIOI, &GPIO_InitStruct);void HAL_DCMI_MspInit(DCMI_HandleTypeDef* hdcmi)
{GPIO_InitTypeDef GPIO_InitStruct = {0};if(hdcmi->Instance==DCMI){/* USER CODE BEGIN DCMI_MspInit 0 *//* USER CODE END DCMI_MspInit 0 *//* Peripheral clock enable */__HAL_RCC_DCMI_CLK_ENABLE();__HAL_RCC_GPIOA_CLK_ENABLE();__HAL_RCC_GPIOH_CLK_ENABLE();__HAL_RCC_GPIOI_CLK_ENABLE();/**DCMI GPIO ConfigurationPA6     ------> DCMI_PIXCLKPH8     ------> DCMI_HSYNCPH9     ------> DCMI_D0PH10     ------> DCMI_D1PH11     ------> DCMI_D2PH12     ------> DCMI_D3PH14     ------> DCMI_D4PI4     ------> DCMI_D5PI5     ------> DCMI_VSYNCPI6     ------> DCMI_D6PI7     ------> DCMI_D7*/GPIO_InitStruct.Pin = GPIO_PIN_6;GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;GPIO_InitStruct.Alternate = GPIO_AF13_DCMI;HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_14;GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;GPIO_InitStruct.Alternate = GPIO_AF13_DCMI;HAL_GPIO_Init(GPIOH, &GPIO_InitStruct);GPIO_InitStruct.Pin = GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7;GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;GPIO_InitStruct.Alternate = GPIO_AF13_DCMI;HAL_GPIO_Init(GPIOI, &GPIO_InitStruct);/* DCMI DMA Init *//* DCMI Init */hdma_dcmi.Instance = DMA2_Stream1;					//DMA2数据流1    hdma_dcmi.Init.Channel = DMA_CHANNEL_1;				//通道1hdma_dcmi.Init.Direction = DMA_PERIPH_TO_MEMORY;		//外设到存储器hdma_dcmi.Init.PeriphInc = DMA_PINC_DISABLE;			//外设非增量模式hdma_dcmi.Init.MemInc = DMA_MINC_DISABLE;           //存储器增量模式hdma_dcmi.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;  		//外设数据长度:32位hdma_dcmi.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;    	//存储器数据长度:8/16/32位hdma_dcmi.Init.Mode = DMA_CIRCULAR;					//使用循环模式 hdma_dcmi.Init.Priority = DMA_PRIORITY_HIGH;			//高优先级hdma_dcmi.Init.FIFOMode = DMA_FIFOMODE_ENABLE;  		//使能FIFOhdma_dcmi.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_HALFFULL;//使用1/2的FIFO hdma_dcmi.Init.MemBurst = DMA_MBURST_SINGLE;   		//存储器突发传输hdma_dcmi.Init.PeriphBurst = DMA_PBURST_SINGLE;  	//外设突发单次传输 if (HAL_DMA_Init(&hdma_dcmi) != HAL_OK){Error_Handler();}__HAL_LINKDMA(hdcmi,DMA_Handle,hdma_dcmi); //将DMA与DCMI联系起来/* USER CODE BEGIN DCMI_MspInit 1 */#define FSMC_LCD_ADDRESS      0x6C000002#define DCMI_DR_ADDRESS       0x50050028
//	DCMI_DMA_Init((u32)&LCD->LCD_RAM,0,1,DMA_MDATAALIGN_HALFWORD,DMA_MINC_DISABLE);//HAL_DMA_Start(&hdma_dcmi,DCMI_DR_ADDRESS,FSMC_LCD_ADDRESS,1);HAL_DMA_Start(&hdma_dcmi,(uint32_t)&DCMI->DR,FSMC_LCD_ADDRESS,1);/* USER CODE END DCMI_MspInit 1 */}}/* USER CODE BEGIN DCMI_MspInit 1 */#define FSMC_LCD_ADDRESS      0x6C000002#define DCMI_DR_ADDRESS       0x50050028
//	DCMI_DMA_Init((u32)&LCD->LCD_RAM,0,1,DMA_MDATAALIGN_HALFWORD,DMA_MINC_DISABLE);//HAL_DMA_Start(&hdma_dcmi,DCMI_DR_ADDRESS,FSMC_LCD_ADDRESS,1);HAL_DMA_Start(&hdma_dcmi,(uint32_t)&DCMI->DR,FSMC_LCD_ADDRESS,1);/* USER CODE END DCMI_MspInit 1 */}}

需要注意:数据地址为LCD->RAM,即0x6C000002地址。外设增量和寄存器增量禁用,LCD的数据长度为16为,所以设置为DMA_MDATAALIGN_HALFWORD,DMA_FIFO_THRESHOLD_HALFFULL。
HAL_DMA_Start(&hdma_dcmi,(uint32_t)&DCMI->DR,FSMC_LCD_ADDRESS,1); 设置源地址和目标地址,长度为1。

  1. OV9655配置如下:

/* QVGA 360x240 */
uint8_t OV9655_QVGA[][2]=
{0x00, 0x00,0x01, 0x80,0x02, 0x80,0x03, 0x02,0x04, 0x03,0x09, 0x01,0x0b, 0x57,0x0e, 0x61,0x0f, 0x40,0x11, 0x01,0x12, 0x62,0x13, 0xc7,0x14, 0x3a,0x16, 0x24,0x17, 0x18,0x18, 0x04,0x19, 0x01,0x1a, 0x81,0x1e, 0x00,0x24, 0x3c,0x25, 0x36,0x26, 0x72,0x27, 0x08,0x28, 0x08,0x29, 0x15,0x2a, 0x00,0x2b, 0x00,0x2c, 0x08,0x32, 0x12,0x33, 0x00,0x34, 0x3f,0x35, 0x00,0x36, 0x3a,0x38, 0x72,0x39, 0x57,0x3a, 0xcc,0x3b, 0x04,0x3d, 0x99,0x3e, 0x02,0x3f, 0xc1,0x40, 0xc0,0x41, 0x41,0x42, 0xc0,0x43, 0x0a,0x44, 0xf0,0x45, 0x46,0x46, 0x62,0x47, 0x2a,0x48, 0x3c,0x4a, 0xfc,0x4b, 0xfc,0x4c, 0x7f,0x4d, 0x7f,0x4e, 0x7f,0x4f, 0x98,0x50, 0x98,0x51, 0x00,0x52, 0x28,0x53, 0x70,0x54, 0x98,0x58, 0x1a,0x59, 0x85,0x5a, 0xa9,0x5b, 0x64,0x5c, 0x84,0x5d, 0x53,0x5e, 0x0e,0x5f, 0xf0,0x60, 0xf0,0x61, 0xf0,0x62, 0x00,0x63, 0x00,0x64, 0x02,0x65, 0x20,0x66, 0x00,0x69, 0x0a,0x6b, 0x5a,0x6c, 0x04,0x6d, 0x55,0x6e, 0x00,0x6f, 0x9d,0x70, 0x21,0x71, 0x78,0x72, 0x11,0x73, 0x01,0x74, 0x10,0x75, 0x10,0x76, 0x01,0x77, 0x02,0x7A, 0x12,0x7B, 0x08,0x7C, 0x16,0x7D, 0x30,0x7E, 0x5e,0x7F, 0x72,0x80, 0x82,0x81, 0x8e,0x82, 0x9a,0x83, 0xa4,0x84, 0xac,0x85, 0xb8,0x86, 0xc3,0x87, 0xd6,0x88, 0xe6,0x89, 0xf2,0x8a, 0x24,0x8c, 0x80,0x90, 0x7d,0x91, 0x7b,0x9d, 0x02,0x9e, 0x02,0x9f, 0x7a,0xa0, 0x79,0xa1, 0x40,0xa4, 0x50,0xa5, 0x68,0xa6, 0x4a,0xa8, 0xc1,0xa9, 0xef,0xaa, 0x92,0xab, 0x04,0xac, 0x80,0xad, 0x80,0xae, 0x80,0xaf, 0x80,0xb2, 0xf2,0xb3, 0x20,0xb4, 0x20,0xb5, 0x00,0xb6, 0xaf,0xb6, 0xaf,0xbb, 0xae,0xbc, 0x7f,0xbd, 0x7f,0xbe, 0x7f,0xbf, 0x7f,0xbf, 0x7f,0xc0, 0xaa,0xc1, 0xc0,0xc2, 0x01,0xc3, 0x4e,0xc6, 0x05,0xc7, 0x81,0xc9, 0xe0,0xca, 0xe8,0xcb, 0xf0,0xcc, 0xd8,0xcd, 0x93,0x12, 0x63,0x40, 0x10,0x15, 0x08,
};
uint8_t i2c_buffer[100]={0};
void OV9655_QVGAConfig(void)
{uint32_t i;// OV9655_WriteReg(OV9655_COM7, 0x80);// OV9655_Reset();
//  Delay(200);uint8_t temp_d=0x80;uint16_t temp_addr;HAL_I2C_Mem_Write(&hi2c2, 0x60, 0x12, I2C_MEMADD_SIZE_8BIT, &temp_d,1, 1000);HAL_Delay(20);/* Initialize OV9655 */for(i=0; i<(sizeof(OV9655_QVGA)/2); i++){temp_addr=OV9655_QVGA[i][0];HAL_I2C_Mem_Write(&hi2c2, 0x60, temp_addr, I2C_MEMADD_SIZE_8BIT, &OV9655_QVGA[i][1],1, 1000);// OV9655_WriteReg(OV9655_QQVGA[i][0], OV9655_QQVGA[i][1]);HAL_Delay(2);}temp_addr=0x55;temp_d=130;HAL_I2C_Mem_Write(&hi2c2, 0x60, temp_addr, I2C_MEMADD_SIZE_8BIT, &temp_d,1, 1000);
}
void DCMI_Start(void)  //开启DCMI使能,
{__HAL_DCMI_ENABLE(&hdcmi);DCMI->CR|=DCMI_CR_CAPTURE;          //DCMI捕获使能	
}
  1. 主程序如下
int main(void)
{/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_DMA_Init();MX_FMC_Init();MX_CRC_Init();MX_SDIO_SD_Init();MX_FATFS_Init();MX_DCMI_Init();MX_I2C2_Init();/* USER CODE BEGIN 2 */STM324xG_LCD_Init();  HAL_I2C_Mem_Read(&hi2c2, 0X61, 0x1C, I2C_MEMADD_SIZE_8BIT,i2c_buffer,2, 1000);HAL_I2C_Mem_Read(&hi2c2, 0X61, 0x0a, I2C_MEMADD_SIZE_8BIT,&i2c_buffer[3],1, 1000);OV9655_QVGAConfig();		LCD_SetCursor(0,0);  
//	  __HAL_DMA_ENABLE(&hdma_dcmi); //ê1?üDMA	
//	  __HAL_DCMI_ENABLE(&hdma_dcmi);
//	DCMI->CR |= 0x000040c0;	
//	    LCD_SetDisplayWindow(239, 319, 240, 320);
//    LCD_WriteReg(LCD_REG_3, 0x1038);LCD_WriteRAM_Prepare();		DCMI_Start();/// HAL_Delay(20);//DCMI_Start();//	STM_I2C_Init(I2C_2);/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */
}

http://chatgpt.dhexx.cn/article/9tcddT95.shtml

相关文章

基于STM32F429的DCMI实现OV7725-NF无缓存摄像头的图像采集HAL库

基于STM32F429的OV7725-NF无缓存摄像头的DCMI图像采集 和LTDC显示 0. 首先说明一下时钟配置1. DCMI配置1.1 首先点击DCMI进入配置页面后&#xff0c;要选择Mode1.2 然后要进行GPIO settings1.3 然后是Parameter settings参数设置1.4 DMA settings1.5 需要使用的HAL库函数 3. OV…

stm32-DCMI—OV2640摄像头

第45章 DCMI—OV2640摄像头 全套200集视频教程和1000页PDF教程请到秉火论坛下载&#xff1a;www.firebbs.cn 野火视频教程优酷观看网址&#xff1a;http://i.youku.com/firege 本章参考资料&#xff1a;《STM32F4xx参考手册》、《STM32F4xx规格书》、库帮助文档《stm32f…

stm32f407的高速并口12位ad——dcmi方式

stm32f407的高速并口12位ad——dcmi方式 关于dcmi 我们可以利用这个摄像头接口&#xff0c;进行一个54M以下的并口ad的数据处理。 这个是dcmi的时序图&#xff0c;时钟使用mco1输出系统时钟四分频也就是42m&#xff0c;我的是ad9926&#xff0c;上升沿触发&#xff0c;那么ad…

STM32H7B0 HAL库中关于DMA的注意事项以及DCMI调试遇到的问题及解决方法

先总结总结问题 问题1&#xff1a;MX_DCMI_Init();放到 MX_DMA_Init();后 问题2&#xff1a;DMA缓存缓存要放到SRAM中__align(32) uint32_t buffer[65535] __attribute((at(0X24040000))); 问题3&#xff1a;IO复用问题&#xff0c;DCMI数据口可以复用到其他IO口&#xff0…

STM32——DCMI接口与OV2640原理与配置

一、OV2640简介 1、什么是OV2640&#xff1f; OV2640是OmniVision公司生产的一颗1/4寸的CMOS UXGA&#xff08;1632*1232&#xff09;图像传感器。该传感器体积小、工作电压低&#xff0c;提供单片UXGA摄像头和影像处理器的所有功能。通过SCCB总线控制&#xff0c;可以输出整…

DCMI接口之OV2640摄像头

一、OV2640简介 OV2640是OmniVision公司生产的一颗1/4寸的CMOS UXGA&#xff08;1632 * 1232&#xff09;图像传感器。该传感器体积小、工作电压低&#xff0c;提供单片UXGA摄像头和影像处理器的所有功能。通过SCCB 总线控制&#xff0c;可以输出整帧、子采样、缩放和取窗口等…

OV2640 DCMI

OV2640 简介&#xff1a; 1/4寸CMOSUXGA (1632 * 1232)图像传感器。体积小、工作电压低,提供单片UXGA摄像头和影像处理器的所有功能。通过SCCB总线控制&#xff0c;可以输出整帧、子采样、缩放和取窗口等方式的各种分辨率8/10位影像数据。&#xff08;此处一般选8位&#xff0…

STM32F429之DCMI 数字相机接口

嵌入式系列文章 参考&#xff1a;《STM32F429_DM00031020_ENV19.pdf》 本文目的&#xff1a;翻译STM32F429的PRM&#xff0c;深入理解DCMI接口的工作原理&#xff0c;最后将DCMI工作原理转换成驱动代码。 DCMI&#xff1a;Digital camera interface&#xff0c;数字摄像头接口 …

DCMI接口

目录 DCMI数字摄像头接口 DCMI引脚 摄像头引脚 操作过程与通信方式 硬件连接图 写操作 读操作 图像输出 数据格式 rawRGB YUV RGB JPEG 代码实现过程简述 学习过程的问题 YUV是亮度和色度的格式&#xff0c;为什么UV中取Cb蓝和Cr红作为色度&#xff1f; 提问MIPI、DVP、DCMI是什…

stm32f4的数字摄像头接口(DCMI)使用

DCMI简介 STM32F4的DCMI接口包括如下信号 1&#xff0c;数据据输入&#xff08;D[0:13]&#xff09;&#xff0c;接摄像头的数据输出。 2&#xff0c;水平同步&#xff08;行同步&#xff09;输入&#xff08;HSYNC&#xff09;&#xff0c;接摄像头的HSYNC/HREF信号&#xff…

Java开发技术

1、基础技术 数据结构与算法 逻辑结构&#xff1a;数据对象中的数据元素之间的逻辑关系 1.集合结构&#xff1a;集合结构中的数据元素除了同属一个集合外&#xff0c;没有其他关系。 2.线性结构&#xff1a;线性结构中的数据元素之间是一对一的关系。 3.树形结构&#xff1a;树…

JAVA 中的代码生成包 CGLIB (Code Generation Library)

JAVA 中的代码生成包 CGLIB &#xff08;Code Generation Library&#xff09; CGLIB 是一个功能强大&#xff0c;高性能的代码生成包。它为没有实现接口的类提供代理&#xff0c;为 JDK 的动态代理提供了很好的补充。通常可以使用Java的动态代理创建代理&#xff0c;但当要代…

Java开发实战讲解!java开发CPU最低要求

前言 本人是底层 211 本科,刚毕业,⽆科研经历,但是有些项⽬经历。 在国内监控行业某头部企业做过一段时间的实习。 想着投下字节,可以积累⼀下⾯试经验和为金九银十面招做准备。投了简历之后,过了一段时 间,HR 就打电话跟我约时间, 说明一下&#xff0c;我投的是北京 office。…

Java面试题技术类一

前端技术导航大全 1、面向对象编程的三大特性是什么? 2、String 和StringBuffer的区别 3、说出ArrayList,Vector, LinkedList的存储性能和特性 4、Collection 和 Collections的区别 5、HashMap和Hashtable的区别 6、final, finally, finalize的区别 7、Overload和Overri…

Java专项练习(三)

JAVA选择题 401、下列类定义代码&#xff0c;当用来声明对象car&#xff0c;并用Car carnew Car();实例化后&#xff0c;可以通过car对象直接赋值的字段是&#xff08;&#xff09;402、以下哪个不是Collection的子接口&#xff1f;403、下列说法正确的是( )404、下面的程序将来…

Java学习汇总

6/28日已更新&#xff0c;错误已修改~~~有错误的地方&#xff0c;欢迎大家留言&#xff01; 目录 一、Java基础篇 1.接口和抽象类的区别 2.重载和重写的区别 3.和equals的区别 4.异常处理机制 5.HashMap原理 6.想要线程安全的HashMap怎么办&#xff1f; 7.ConcurrentHa…

java面经整理

面试问题 一、Java基础1.jdk1.7到jdk1.8HashMap发生了什么变化&#xff08;底层&#xff09;&#xff1f;2.jdk1.7到jdk1.8虚拟机发生了什么变化3.String、StringBuilder、StringBuffer4.ArrayList和LinkedList有什么区别&#xff1f;5.ConcurrentHashMap的扩容机制6.接口和抽象…

获得阿里Java开发P7岗“农村穷苦”小伙就得安于现状?

前言 相信大家看到这个标题其实就已经可以联想到我大概是个什么样的情况了&#xff0c;很多人都在生活中或者是网络上甚至是家庭中都大致听过这样的话&#xff0c;“你这样的出生&#xff0c;达到现在这样的生活已经很不错了&#xff0c;还是别为了不切实际的梦想去冒险了&…

Java基础 常见数据结构与算法 项目总结

Java基础 1 Java基础必知必会 1.1 Java语言有哪些特点&#xff1f; 面向对象&#xff08;封装&#xff0c;继承&#xff0c;多态&#xff09;&#xff1b;平台无关性&#xff0c;平台无关性的具体表现在于&#xff0c;Java 是“一次编写&#xff0c;到处运行&#xff08;Wri…

Java面试知识点概览(持续更新)

Java 基础 说说自定义注解的场景及实现 利用自定义注解,结合SpringAOP可以完成权限控制、日志记录、统一异常处理、数字签名、数据加解密等功能。 实现场景&#xff08;API接口数据加解密&#xff09; 1&#xff09;自定义一个注解&#xff0c;在需要加解密的方法上添加该注…