基于STM32H723的硬件IIC+DMA,实现对EEPROM的写入及读取操作,建议配合数据手册区查看代码帮助理解,使用DMA时,注意把DMA设置的缓存地址设置在0x24000000以后的区域,DMA才能够访问。
/**************************************************************************
*EEPROM的IIC驱动初始化,带DMA
*PF0----------------------IIC2_SDA_EEPROM
*PF1----------------------IIC2_SCL_EEPROM
*PF2----------------------WP_EEPROM
*
*
**************************************************************************/
uint8_t IIC_And_DMA_Driver_With_EEPROM_Init(void)
{
DMA_InitTypeDef DMA_InitStruct;
RCC->AHB4ENR |= 1 << 5; //使能GPIOF时钟
RCC->APB1LENR |= 1 << 22; //使能I2C2外设时钟
/*GPIO配置*/
GPIO_Set(GPIOF,1 << 0,GPIO_MODE_AF,GPIO_OTYPE_OD,GPIO_SPEED_LOW,GPIO_PUPD_PU); //PF0
GPIO_Set(GPIOF,1 << 1,GPIO_MODE_AF,GPIO_OTYPE_OD,GPIO_SPEED_LOW,GPIO_PUPD_PU); //PF1
GPIO_Set(GPIOF,1 << 2,GPIO_MODE_OUT,GPIO_OTYPE_PP,GPIO_SPEED_LOW,GPIO_PUPD_PU);//PF2
GPIO_AF_Set(GPIOF,0,4);
GPIO_AF_Set(GPIOF,1,4);
GPIO_Pin_Set(GPIOF,PIN2,0);
//I2C 时钟来源默认100M 来自PCLK1
RCC->APB1LRSTR |= 1 << 22;
RCC->APB1LRSTR &= ~(1 << 22);
I2C2->CR1 |= 0 << 0;
I2C2->TIMINGR = 0x20601138 & 0xF0FFFFFF;
//此处将IIC的时钟频率设置为400K,如果要设置为100K,则推荐0x20601138,具体配置方法可查数据手册
I2C2->CR2 |= ((0xA0 >> 1) & 0x7F) << 1;//这里设置的IIC从机的地址
I2C2->CR2 |= 1 << 10;
I2C2->OAR1 = ((0 << 15) | (0)); //失能自身地址1 自身地址设为0
I2C2->CR2 |= (1 << 15); //使能NACK,当作为从机时,需要失能NACK
I2C2->CR2 &= ~(1 << 25); //失能AUTOEN
I2C2->OAR2 = ((0 << 15) | (0) | (0 << 8));//失能自身地址2 自身地址设为0 无屏蔽位
I2C2->CR1 = ((0 << 19) | (0 << 17)); //失能广播呼叫功能,时钟延长
I2C2->CR1 |= 1 << 15; //使能DMA接收请求
I2C2->CR1 |= 1 << 14; //使能DMA发送请求
I2C2->CR1 |= 1 << 0;
/*以上是IIC的寄存器配置,400K,以下则是DMA的配置,这里我用了自己仿ST标准库实现DMA配置*/
DMA_InitStruct.u32DMA_NumberData = 0;
DMA_InitStruct.u32DMA_Memory1BaseAddr=(uint32_t)u8IIC_DMA_Transmit_For_EEPROM_Buffer;
//DMA存储器地址
DMA_Init