新手上路
- 积分
- 43
- 金钱
- 43
- 注册时间
- 2015-8-4
- 在线时间
- 1 小时
|
5金钱
我是用的最新版的库,所以一部分代码照着原子哥的改,一部分看的官方样例,一部分自己写的。运行时卡在了DCMI_IRQHandler,单帧获取模式无法得到任何数据。不过I2C倒是调通了,可以读写寄存器,部分代码:
uint32_t data;
int main()
{
TIM3_PWM_Init();
TIM_Init();
usart_init();
I2C_Init();
dcmi_dma_init();
__HAL_DCMI_ENABLE(&dcmi);
ov7670_init();
HAL_DCMI_Start_DMA(&dcmi,DCMI_MODE_SNAPSHOT,data,0x9600);
while(1)
{
}
}
void dcmi_dma_init()
// Data: PC6,7,8,9,11 PB6,8,9
// PCLK: PA6
// HSYNC A4
// VSYNC B7
{
//DCMI对应GPIO配置
GPIO_InitTypeDef dcmi_gpio;
__DCMI_CLK_ENABLE();
__GPIOA_CLK_ENABLE();
__GPIOB_CLK_ENABLE();
__GPIOC_CLK_ENABLE();
dcmi_gpio.Alternate=GPIO_AF13_DCMI;
dcmi_gpio.Mode=GPIO_MODE_AF_PP;
dcmi_gpio.Pin=GPIO_PIN_4 | GPIO_PIN_6;
dcmi_gpio.Pull=GPIO_PULLUP;
dcmi_gpio.Speed=GPIO_SPEED_HIGH;
HAL_GPIO_Init(GPIOA,&dcmi_gpio);
dcmi_gpio.Pin=GPIO_PIN_6 | GPIO_PIN_7 | GPIO_PIN_8 | GPIO_PIN_9;
HAL_GPIO_Init(GPIOB,&dcmi_gpio);
dcmi_gpio.Pin=GPIO_PIN_6 | GPIO_PIN_7 | GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_11;
HAL_GPIO_Init(GPIOC,&dcmi_gpio);
//DCMI配置
dcmi.Instance=DCMI;
dcmi.Init.CaptureRate=DCMI_CR_ALL_FRAME;
dcmi.Init.HSPolarity=DCMI_HSPOLARITY_HIGH;
dcmi.Init.PCKPolarity=DCMI_PCKPOLARITY_RISING;
dcmi.Init.SynchroMode=DCMI_SYNCHRO_HARDWARE;
dcmi.Init.ExtendedDataMode=DCMI_EXTEND_DATA_8B;
dcmi.Init.VSPolarity=DCMI_VSPOLARITY_LOW;
//DMA配置
DMA_Hand.Init.Channel = DMA_CHANNEL_1;
DMA_Hand.Init.Direction = DMA_MEMORY_TO_PERIPH;
DMA_Hand.Init.PeriphInc = DMA_PINC_DISABLE;
DMA_Hand.Init.MemInc = DMA_MINC_ENABLE;
DMA_Hand.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;
DMA_Hand.Init.MemDataAlignment = DMA_MDATAALIGN_WORD;
DMA_Hand.Init.Mode = DMA_CIRCULAR;
DMA_Hand.Init.Priority = DMA_PRIORITY_HIGH;
DMA_Hand.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
DMA_Hand.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL;
DMA_Hand.Init.MemBurst = DMA_MBURST_SINGLE;
DMA_Hand.Init.PeriphBurst = DMA_PBURST_SINGLE;
DMA_Hand.Instance = DMA2_Stream1;
//其他配置
__HAL_LINKDMA(&dcmi, DMA_Handle, DMA_Hand);
HAL_NVIC_SetPriority(DCMI_IRQn, 5, 0);
HAL_NVIC_EnableIRQ(DCMI_IRQn);
HAL_NVIC_SetPriority(DMA2_Stream1_IRQn, 5, 0);
HAL_NVIC_EnableIRQ(DMA2_Stream1_IRQn);
//启动
HAL_DMA_Init(dcmi.DMA_Handle);
HAL_DCMI_Init(&dcmi);
}
void ov7670_init()
{
uint8_t Write=0x0a;
uint8_t Read=0;
uint8_t reset[2]={0x12,0x80};
uint16_t i;
//软件复位摄像头,延时600ms
HAL_I2C_Master_Transmit(&I2cHandle,0x42,reset,2,0xf);
delay(600);
//读摄像头ID
HAL_I2C_Master_Transmit(&I2cHandle,0x42,&Write,1,0xf);
HAL_I2C_Master_Receive(&I2cHandle,0x43,&Read,1,0xf);
//初始化寄存器
if(Read==0x76)
{
for(i=0;i<176;i++)
HAL_I2C_Master_Transmit(&I2cHandle,0x42,OV7670_RGB_reg,2,0xf);
}
//延时1s,等待摄像头稳定
delay(1000);
}
void DCMI_IRQHandler ()
{
HAL_DCMI_IRQHandler(&dcmi);
}
void DMA2_Stream1_IRQHandler()
{
HAL_DMA_IRQHandler(dcmi.DMA_Handle);
printf("DMA2\n");
}
|
|