建设银行内部网站6,有哪些可以做外链的网站,百度搜索关键词排行榜,网站建设费用核算STM32存储左右互搏 I2C总线FATS读写EEPROM ZD24C1MA
在较低容量存储领域#xff0c;EEPROM是常用的存储介质#xff0c;可以通过直接或者文件操作方式进行读写。不同容量的EEPROM的地址对应位数不同#xff0c;在发送字节的格式上有所区别。EEPROM是非快速访问存储#xf…STM32存储左右互搏 I2C总线FATS读写EEPROM ZD24C1MA
在较低容量存储领域EEPROM是常用的存储介质可以通过直接或者文件操作方式进行读写。不同容量的EEPROM的地址对应位数不同在发送字节的格式上有所区别。EEPROM是非快速访问存储因为EEPROM按页进行组织在连续操作模式当跨页时访问地址不是跳到下一页到开始而是跳到当前页的首地址因此跨页时要重新指定起始地址。而在控制端发送写操作I2C数据后还需要有等待EEPROM内部操作完成的时间才能进行下一次操作。ZD24C1MA是1M bit / 128K Byte容量的EEPROM,ZD24C1MA的管脚定义为 这里介绍STM32 通过文件系统FATS访问EEPROM ZD24C1MA的例程。采用STM32CUBEIDE开发平台以STM32F401CCU6芯片为例通过STM32 I2C硬件电路实现读写操作通过UART串口进行控制。
STM32工程配置
首先建立基本工程并设置时钟 配置硬件I2C接口 配置UART1作为通讯串口 对FATS文件系统进行配置: 保存并生成初始工程代码
STM32工程代码
代码里用到的微秒延时函数参考 STM32 HAL us delay微秒延时的指令延时实现方式及优化
ZD24C1MA的设备默认访问地址为0xA0 ZD24C1MA的存储单元地址访问略为特殊17位地址分为两部分最高位的1位放置于I2C设备默认访问地址的第1位I2C设备默认访问地址第0位仍然为读写控制位由于采用硬件I2C控制库函数自行通过识别调用的是发送还是接收函数对第0位进行发送前设置因此不管是调用库函数的I2C写操作还是读操作提供的地址相同。17位地址的低16位通过在发送设备地址后的作为跟随的第一二个字节发送。
建立ZD24C1MA.h库头文件
#ifndef INC_ZD24C1MA_H_
#define INC_ZD24C1MA_H_#include main.hvoid PY_Delay_us_t(uint32_t Delay);
void ZD24C1MA_Read(uint32_t addr, uint8_t * data, uint32_t len);
void ZD24C1MA_Write(uint32_t addr, uint8_t * data, uint32_t len);#endif
建立ZD24C1MA.c库源文件 #include string.h
#include ZD24C1MA.h#define Page_Size 256
#define Delay_Param 5
extern I2C_HandleTypeDef hi2c1;
extern uint8_t ZD24C1MA_Default_I2C_Addr ;void ZD24C1MA_Read(uint32_t addr, uint8_t * data, uint32_t len)
{uint8_t ZD24C1MA_I2C_Addr;ZD24C1MA_I2C_Addr ZD24C1MA_Default_I2C_Addr | ((addr16)1); //highest 1-bit access address placed into I2C addressuint8_t RA[2];RA[0] (addr 0xFF00)8; //high 8-bit access address placed into I2C first dataRA[1] addr 0x00FF; //low 8-bit access address placed into I2C first dataHAL_I2C_Master_Transmit(hi2c1, ZD24C1MA_I2C_Addr, RA[0], 2, 2700); //Write address for readHAL_I2C_Master_Receive(hi2c1, ZD24C1MA_I2C_Addr, data, len, 2700); //Read data}void ZD24C1MA_Write(uint32_t addr, uint8_t * data, uint32_t len)
{uint8_t ZD24C1MA_I2C_Addr;uint32_t addr_page addr/Page_Size;uint32_t addr_index addr%Page_Size;uint32_t TLEN;uint8_t TAD[Page_Size2];uint32_t i0;if(len(Page_Size-addr_index)){TAD[0] (addr 0xFF00) 8;TAD[1] addr 0x00FF ;memcpy(TAD2, data, len);ZD24C1MA_I2C_Addr ZD24C1MA_Default_I2C_Addr | ((addr16)1); //highest 1-bit access address placed into I2C addressHAL_I2C_Master_Transmit(hi2c1, ZD24C1MA_I2C_Addr, TAD, len2, 2700); //Write dataPY_Delay_us_t(Delay_Param*1000);}else{TAD[0] (addr 0xFF00) 8;TAD[1] addr 0x00FF ;memcpy(TAD2, data, (Page_Size-addr_index));ZD24C1MA_I2C_Addr ZD24C1MA_Default_I2C_Addr | ((addr16)1); //highest 1-bit access address placed into I2C addressHAL_I2C_Master_Transmit(hi2c1, ZD24C1MA_I2C_Addr, TAD, (Page_Size-addr_index)2, 2700); //Write dataPY_Delay_us_t(Delay_Param*1000);TLEN (len-(Page_Size-addr_index));while( TLEN Page_Size ){addr_page 1;TAD[0] ((addr_page*Page_Size) 0xFF00 ) 8;TAD[1] (addr_page*Page_Size) 0x00FF ;memcpy(TAD2, data (Page_Size-addr_index) i*Page_Size, Page_Size);ZD24C1MA_I2C_Addr ZD24C1MA_Default_I2C_Addr | (((addr_page*Page_Size)16)1); //highest 1-bit access address placed into I2C addressHAL_I2C_Master_Transmit(hi2c1, ZD24C1MA_I2C_Addr, TAD, Page_Size2, 2700); //Write dataHAL_Delay(Delay_Param);i;TLEN - Page_Size;PY_Delay_us_t(Delay_Param*1000);}if(TLEN0){addr_page 1;TAD[0] ((addr_page*Page_Size) 0xFF00 ) 8;TAD[1] (addr_page*Page_Size) 0x00FF ;memcpy(TAD2, data (Page_Size-addr_index) i*Page_Size, TLEN);ZD24C1MA_I2C_Addr ZD24C1MA_Default_I2C_Addr | (((addr_page*Page_Size)16)1); //highest 1-bit access address placed into I2C addressHAL_I2C_Master_Transmit(hi2c1, ZD24C1MA_I2C_Addr, TAD, TLEN2, 2700); //Write dataPY_Delay_us_t(Delay_Param*1000);}}}
对ffconf.h添加包含信息
#include main.h
#include stm32f4xx_hal.h
#include ZD24C1MA.h修改user_diskio.c对文件操作函数与底层I2C读写提供连接
/* USER CODE BEGIN Header */
/********************************************************************************* file user_diskio.c* brief This file includes a diskio driver skeleton to be completed by the user.******************************************************************************* attention** Copyright (c) 2023 STMicroelectronics.* All rights reserved.** This software is licensed under terms that can be found in the LICENSE file* in the root directory of this software component.* If no LICENSE file comes with this software, it is provided AS-IS.********************************************************************************//* USER CODE END Header */#ifdef USE_OBSOLETE_USER_CODE_SECTION_0
/** Warning: the user section 0 is no more in use (starting from CubeMx version 4.16.0)* To be suppressed in the future.* Kept to ensure backward compatibility with previous CubeMx versions when* migrating projects.* User code previously added there should be copied in the new user sections before* the section contents can be deleted.*/
/* USER CODE BEGIN 0 */
/* USER CODE END 0 */
#endif/* USER CODE BEGIN DECL *//* Includes ------------------------------------------------------------------*/
#include string.h
#include ff_gen_drv.h/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*//* Private variables ---------------------------------------------------------*/
/* Disk status */
static volatile DSTATUS Stat STA_NOINIT;/* USER CODE END DECL *//* Private function prototypes -----------------------------------------------*/
DSTATUS USER_initialize (BYTE pdrv);
DSTATUS USER_status (BYTE pdrv);
DRESULT USER_read (BYTE pdrv, BYTE *buff, DWORD sector, UINT count);
#if _USE_WRITE 1DRESULT USER_write (BYTE pdrv, const BYTE *buff, DWORD sector, UINT count);
#endif /* _USE_WRITE 1 */
#if _USE_IOCTL 1DRESULT USER_ioctl (BYTE pdrv, BYTE cmd, void *buff);
#endif /* _USE_IOCTL 1 */Diskio_drvTypeDef USER_Driver
{USER_initialize,USER_status,USER_read,
#if _USE_WRITEUSER_write,
#endif /* _USE_WRITE 1 */
#if _USE_IOCTL 1USER_ioctl,
#endif /* _USE_IOCTL 1 */
};/* Private functions ---------------------------------------------------------*//*** brief Initializes a Drive* param pdrv: Physical drive number (0..)* retval DSTATUS: Operation status*/
DSTATUS USER_initialize (BYTE pdrv /* Physical drive nmuber to identify the drive */
)
{/* USER CODE BEGIN INIT *//**************************SELF DEFINITION PART************/extern uint8_t ZD24C1MA_Default_I2C_Addr ;ZD24C1MA_Default_I2C_Addr 0xA0; //Pin A2A10return RES_OK;/**********************************************************//*Stat STA_NOINIT;return Stat;*//* USER CODE END INIT */
}/*** brief Gets Disk Status* param pdrv: Physical drive number (0..)* retval DSTATUS: Operation status*/
DSTATUS USER_status (BYTE pdrv /* Physical drive number to identify the drive */
)
{/* USER CODE BEGIN STATUS *//**************************SELF DEFINITION PART************/switch (pdrv){case 0 :return RES_OK;case 1 :return RES_OK;case 2 :return RES_OK;default:return STA_NOINIT;}/**********************************************************//*Stat STA_NOINIT;return Stat;*//* USER CODE END STATUS */
}/*** brief Reads Sector(s)* param pdrv: Physical drive number (0..)* param *buff: Data buffer to store read data* param sector: Sector address (LBA)* param count: Number of sectors to read (1..128)* retval DRESULT: Operation result*/
DRESULT USER_read (BYTE pdrv, /* Physical drive nmuber to identify the drive */BYTE *buff, /* Data buffer to store read data */DWORD sector, /* Sector address in LBA */UINT count /* Number of sectors to read */
)
{/* USER CODE BEGIN READ *//**************************SELF DEFINITION PART************/uint16_t len;if( !count ){return RES_PARERR; /*count status*/}switch (pdrv){case 0:sector 9; //Convert sector number to byte addresslen count*512;ZD24C1MA_Read(sector, buff, len);return RES_OK;default:return RES_ERROR;}/**********************************************************//*return RES_OK;*//* USER CODE END READ */
}/*** brief Writes Sector(s)* param pdrv: Physical drive number (0..)* param *buff: Data to be written* param sector: Sector address (LBA)* param count: Number of sectors to write (1..128)* retval DRESULT: Operation result*/
#if _USE_WRITE 1
DRESULT USER_write (BYTE pdrv, /* Physical drive nmuber to identify the drive */const BYTE *buff, /* Data to be written */DWORD sector, /* Sector address in LBA */UINT count /* Number of sectors to write */
)
{/* USER CODE BEGIN WRITE *//* USER CODE HERE *//**************************SELF DEFINITION PART************/uint16_t len;if( !count ){return RES_PARERR; /*count status*/}switch (pdrv){case 0:sector 9; //Convert sector number to byte addresslen count*512;ZD24C1MA_Write(sector, (uint8_t *)buff,len);return RES_OK;default:return RES_ERROR;}/*********************************************************//*return RES_OK;*//* USER CODE END WRITE */
}
#endif /* _USE_WRITE 1 *//*** brief I/O control operation* param pdrv: Physical drive number (0..)* param cmd: Control code* param *buff: Buffer to send/receive control data* retval DRESULT: Operation result*/
#if _USE_IOCTL 1
DRESULT USER_ioctl (BYTE pdrv, /* Physical drive nmuber (0..) */BYTE cmd, /* Control code */void *buff /* Buffer to send/receive control data */
)
{/* USER CODE BEGIN IOCTL *//**************************SELF DEFINITION PART************/#define user_sector_byte_size 512DRESULT res;switch(cmd){case CTRL_SYNC:resRES_OK;break;case GET_SECTOR_SIZE:*(WORD*)buff user_sector_byte_size;res RES_OK;break;case GET_BLOCK_SIZE:*(WORD*)buff 4096/user_sector_byte_size;res RES_OK;break;case GET_SECTOR_COUNT:*(DWORD*)buff (128*1024/512);res RES_OK;break;default:res RES_PARERR;break;}return res;/**********************************************************//*DRESULT res RES_ERROR;return res;*//* USER CODE END IOCTL */
}
#endif /* _USE_IOCTL 1 */然后在main.c里根据串口输入命令16进制单字节实现如下功能 0x01. 读取EEPROM ID 0x02. 装载FATS文件系统 0x03: 创建/打开文件并从头位置写入数据 0x04: 打开文件并从头位置读入数据 0x05: 创建/打开文件并从特定位置写入数据 0x06: 打开文件并从特定位置读入数据 完整的代码实现如下
/* USER CODE BEGIN Header */
/********************************************************************************* file : main.c* brief : Main program body******************************************************************************* attention** Copyright (c) 2023 STMicroelectronics.* All rights reserved.** This software is licensed under terms that can be found in the LICENSE file* in the root directory of this software component.* If no LICENSE file comes with this software, it is provided AS-IS.********************************************************************************/
//Written by Pegasus Yu in 2023
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include main.h
#include fatfs.h/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include usart.h
#include string.h
#include ZD24C1MA.h
/* USER CODE END Includes *//* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD *//* USER CODE END PTD *//* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
__IO float usDelayBase;
void PY_usDelayTest(void)
{__IO uint32_t firstms, secondms;__IO uint32_t counter 0;firstms HAL_GetTick()1;secondms firstms1;while(uwTick!firstms) ;while(uwTick!secondms) counter;usDelayBase ((float)counter)/1000;
}void PY_Delay_us_t(uint32_t Delay)
{__IO uint32_t delayReg;__IO uint32_t usNum (uint32_t)(Delay*usDelayBase);delayReg 0;while(delayReg!usNum) delayReg;
}void PY_usDelayOptimize(void)
{__IO uint32_t firstms, secondms;__IO float coe 1.0;firstms HAL_GetTick();PY_Delay_us_t(1000000) ;secondms HAL_GetTick();coe ((float)1000)/(secondms-firstms);usDelayBase coe*usDelayBase;
}void PY_Delay_us(uint32_t Delay)
{__IO uint32_t delayReg;__IO uint32_t msNum Delay/1000;__IO uint32_t usNum (uint32_t)((Delay%1000)*usDelayBase);if(msNum0) HAL_Delay(msNum);delayReg 0;while(delayReg!usNum) delayReg;
}
/* USER CODE END PD *//* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM *//* USER CODE END PM *//* Private variables ---------------------------------------------------------*/
I2C_HandleTypeDef hi2c1;
DMA_HandleTypeDef hdma_i2c1_tx;UART_HandleTypeDef huart1;/* USER CODE BEGIN PV *//* USER CODE END PV *//* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_DMA_Init(void);
static void MX_I2C1_Init(void);
static void MX_USART1_UART_Init(void);
/* USER CODE BEGIN PFP *//* USER CODE END PFP *//* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
uint8_t cmd0; //for status control
uint8_t URX;uint8_t ZD24C1MA_Default_I2C_Addr 0xA0; //Pin A2A10
uint32_t ZD24C1MA_Access_Addr 0; //EEPROM ZD24C1MA access address (17-bit)uint8_t EEPROM_mount_status 0; //EEPROM fats mount status indication (0: unmount; 1: mount)
uint8_t FATS_Buff[_MAX_SS]; //Buffer for f_mkfs() operationFRESULT retEEPROM;
FIL file;
FATFS *fs;UINT bytesread;
UINT byteswritten;
uint8_t rBuffer[20]; //Buffer for read
uint8_t WBuffer[20] {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20}; //Buffer for write#define user_sector_byte_size 512
uint8_t eeprombuffer[user_sector_byte_size];extern char USERPath[4];char * console;
/* USER CODE END 0 *//*** brief The application entry point.* retval int*/
int main(void)
{/* USER CODE BEGIN 1 */EEPROM_mount_status 0;uint32_t EEPROM_Read_Size;extern char USERPath[4];char * dpath 0:; //Disk Pathfor(uint8_t i0; i4; i){USERPath[i] *(dpathi);}const TCHAR* filepath 0:test.txt;char cchar[256];console cchar;/* 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_I2C1_Init();MX_USART1_UART_Init();MX_FATFS_Init();/* USER CODE BEGIN 2 */PY_usDelayTest();PY_usDelayOptimize();HAL_UART_Receive_IT(huart1, URX, 1);/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){if(cmd1) //Read ID{cmd 0;printf(EEPROM IDZD24C1MAT\r\n\r\n);}else if(cmd2) //EEPROM File System Mount{cmd 0;retEEPROMf_mount(USERFatFS, (TCHAR const*)USERPath, 1);if (retEEPROM ! FR_OK){printf(File system mount failure: %d\r\n, retEEPROM);if(retEEPROMFR_NO_FILESYSTEM){printf(No file system. Now to format......\r\n);retEEPROM f_mkfs((TCHAR const*)USERPath, FM_FAT, 1024, FATS_Buff, sizeof(FATS_Buff)); //EEPROM formattingif(retEEPROM FR_OK){printf(EEPROM formatting success!\r\n);}else{printf(EEPROM formatting failure!\r\n);}}}else{EEPROM_mount_status 1;printf(File system mount success\r\n);}}else if(cmd3) //File creation and write{cmd 0;if(EEPROM_mount_status0){printf( \r\nEEPROM File system not mounted: %d\r\n,retEEPROM);}else{retEEPROM f_open( file, filepath, FA_CREATE_ALWAYS | FA_WRITE ); //Open or create fileif(retEEPROM FR_OK){printf( \r\nFile open or creation successful\r\n);retEEPROM f_write( file, (const void *)WBuffer, sizeof(WBuffer), byteswritten); //Write dataif(retEEPROM FR_OK){printf(\r\nFile write successful\r\n);}else{printf(\r\nFile write error: %d\r\n,retEEPROM);}f_close(file); //Close file}else{printf(\r\nFile open or creation error %d\r\n,retEEPROM);}}}else if(cmd4) //File read{cmd 0;if(EEPROM_mount_status0){printf(\r\nEEPROM File system not mounted: %d\r\n,retEEPROM);}else{retEEPROM f_open( file, filepath, FA_OPEN_EXISTING | FA_READ); //Open fileif(retEEPROM FR_OK){printf(\r\nFile open successful\r\n);retEEPROM f_read( file, (void *)rBuffer, sizeof(rBuffer), bytesread); //Read dataif(retEEPROM FR_OK){printf(\r\nFile read successful\r\n);PY_Delay_us_t(200000);EEPROM_Read_Size sizeof(rBuffer);for(uint16_t i 0;i EEPROM_Read_Size;i){printf(%d , rBuffer[i]);}printf(\r\n);}else{printf(\r\nFile read error: %d\r\n, retEEPROM);}f_close(file); //Close file}else{printf(\r\nFile open error: %d\r\n, retEEPROM);}}}else if(cmd5) //File locating write{cmd 0;if(EEPROM_mount_status0){printf(\r\nEEPROM File system not mounted: %d\r\n,retEEPROM);}else{retEEPROM f_open( file, filepath, FA_CREATE_ALWAYS | FA_WRITE); //Open or create fileif(retEEPROM FR_OK){printf(\r\nFile open or creation successful\r\n);retEEPROMf_lseek( file, f_tell(file) sizeof(WBuffer) ); //move file operation pointer, f_tell(file) gets file head locatingif(retEEPROM FR_OK){retEEPROM f_write( file, (const void *)WBuffer, sizeof(WBuffer), byteswritten);if(retEEPROM FR_OK){printf(\r\nFile locating write successful\r\n);}else{printf(\r\nFile locating write error: %d\r\n, retEEPROM);}}else{printf(\r\nFile pointer error: %d\r\n,retEEPROM);}f_close(file); //Close file}else{printf(\r\nFile open or creation error %d\r\n,retEEPROM);}}}else if(cmd6) //File locating read{cmd 0;if(EEPROM_mount_status0){printf(\r\nEEPROM File system not mounted: %d\r\n,retEEPROM);}else{retEEPROM f_open(file, filepath, FA_OPEN_EXISTING | FA_READ); //Open fileif(retEEPROM FR_OK){printf(\r\nFile open successful\r\n);retEEPROM f_lseek(file,f_tell(file) sizeof(WBuffer)/2); //move file operation pointer, f_tell(file) gets file head locatingif(retEEPROM FR_OK){retEEPROM f_read( file, (void *)rBuffer, sizeof(rBuffer), bytesread);if(retEEPROM FR_OK){printf(\r\nFile locating read successful\r\n);PY_Delay_us_t(200000);EEPROM_Read_Size sizeof(rBuffer);for(uint16_t i 0;i EEPROM_Read_Size;i){printf(%d ,rBuffer[i]);}printf(\r\n);}else{printf(\r\nFile locating read error: %d\r\n,retEEPROM);}}else{printf(\r\nFile pointer error: %d\r\n,retEEPROM);}f_close(file);}else{printf(\r\nFile open error: %d\r\n,retEEPROM);}}}PY_Delay_us_t(100);/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */
}/*** brief System Clock Configuration* retval None*/
void SystemClock_Config(void)
{RCC_OscInitTypeDef RCC_OscInitStruct {0};RCC_ClkInitTypeDef RCC_ClkInitStruct {0};/** Configure the main internal regulator output voltage*/__HAL_RCC_PWR_CLK_ENABLE();__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE2);/** Initializes the RCC Oscillators according to the specified parameters* in the RCC_OscInitTypeDef structure.*/RCC_OscInitStruct.OscillatorType RCC_OSCILLATORTYPE_HSE;RCC_OscInitStruct.HSEState RCC_HSE_ON;RCC_OscInitStruct.PLL.PLLState RCC_PLL_ON;RCC_OscInitStruct.PLL.PLLSource RCC_PLLSOURCE_HSE;RCC_OscInitStruct.PLL.PLLM 25;RCC_OscInitStruct.PLL.PLLN 336;RCC_OscInitStruct.PLL.PLLP RCC_PLLP_DIV4;RCC_OscInitStruct.PLL.PLLQ 7;if (HAL_RCC_OscConfig(RCC_OscInitStruct) ! HAL_OK){Error_Handler();}/** Initializes the CPU, AHB and APB buses clocks*/RCC_ClkInitStruct.ClockType RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;RCC_ClkInitStruct.SYSCLKSource RCC_SYSCLKSOURCE_PLLCLK;RCC_ClkInitStruct.AHBCLKDivider RCC_SYSCLK_DIV1;RCC_ClkInitStruct.APB1CLKDivider RCC_HCLK_DIV2;RCC_ClkInitStruct.APB2CLKDivider RCC_HCLK_DIV1;if (HAL_RCC_ClockConfig(RCC_ClkInitStruct, FLASH_LATENCY_2) ! HAL_OK){Error_Handler();}
}/*** brief I2C1 Initialization Function* param None* retval None*/
static void MX_I2C1_Init(void)
{/* USER CODE BEGIN I2C1_Init 0 *//* USER CODE END I2C1_Init 0 *//* USER CODE BEGIN I2C1_Init 1 *//* USER CODE END I2C1_Init 1 */hi2c1.Instance I2C1;hi2c1.Init.ClockSpeed 400000;hi2c1.Init.DutyCycle I2C_DUTYCYCLE_2;hi2c1.Init.OwnAddress1 0;hi2c1.Init.AddressingMode I2C_ADDRESSINGMODE_7BIT;hi2c1.Init.DualAddressMode I2C_DUALADDRESS_DISABLE;hi2c1.Init.OwnAddress2 0;hi2c1.Init.GeneralCallMode I2C_GENERALCALL_DISABLE;hi2c1.Init.NoStretchMode I2C_NOSTRETCH_DISABLE;if (HAL_I2C_Init(hi2c1) ! HAL_OK){Error_Handler();}/* USER CODE BEGIN I2C1_Init 2 *//* USER CODE END I2C1_Init 2 */}/*** brief USART1 Initialization Function* param None* retval None*/
static void MX_USART1_UART_Init(void)
{/* USER CODE BEGIN USART1_Init 0 *//* USER CODE END USART1_Init 0 *//* USER CODE BEGIN USART1_Init 1 *//* USER CODE END USART1_Init 1 */huart1.Instance USART1;huart1.Init.BaudRate 115200;huart1.Init.WordLength UART_WORDLENGTH_8B;huart1.Init.StopBits UART_STOPBITS_1;huart1.Init.Parity UART_PARITY_NONE;huart1.Init.Mode UART_MODE_TX_RX;huart1.Init.HwFlowCtl UART_HWCONTROL_NONE;huart1.Init.OverSampling UART_OVERSAMPLING_16;if (HAL_UART_Init(huart1) ! HAL_OK){Error_Handler();}/* USER CODE BEGIN USART1_Init 2 *//* USER CODE END USART1_Init 2 */}/*** Enable DMA controller clock*/
static void MX_DMA_Init(void)
{/* DMA controller clock enable */__HAL_RCC_DMA1_CLK_ENABLE();/* DMA interrupt init *//* DMA1_Stream6_IRQn interrupt configuration */HAL_NVIC_SetPriority(DMA1_Stream6_IRQn, 0, 0);HAL_NVIC_EnableIRQ(DMA1_Stream6_IRQn);}/*** brief GPIO Initialization Function* param None* retval None*/
static void MX_GPIO_Init(void)
{
/* USER CODE BEGIN MX_GPIO_Init_1 */
/* USER CODE END MX_GPIO_Init_1 *//* GPIO Ports Clock Enable */__HAL_RCC_GPIOH_CLK_ENABLE();__HAL_RCC_GPIOA_CLK_ENABLE();__HAL_RCC_GPIOB_CLK_ENABLE();/* USER CODE BEGIN MX_GPIO_Init_2 */
/* USER CODE END MX_GPIO_Init_2 */
}/* USER CODE BEGIN 4 */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{if(huarthuart1){cmd URX;HAL_UART_Receive_IT(huart1, URX, 1);}}
/* USER CODE END 4 *//*** brief This function is executed in case of error occurrence.* retval None*/
void Error_Handler(void)
{/* USER CODE BEGIN Error_Handler_Debug *//* User can add his own implementation to report the HAL error return state */__disable_irq();while (1){}/* USER CODE END Error_Handler_Debug */
}#ifdef USE_FULL_ASSERT
/*** brief Reports the name of the source file and the source line number* where the assert_param error has occurred.* param file: pointer to the source file name* param line: assert_param error line source number* retval None*/
void assert_failed(uint8_t *file, uint32_t line)
{/* USER CODE BEGIN 6 *//* User can add his own implementation to report the file name and line number,ex: printf(Wrong parameters value: file %s on line %d\r\n, file, line) *//* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */#endif /* USE_FULL_ASSERT */
STM32例程测试
串口指令0x01测试效果如下 串口指令0x02测试效果如下 串口指令0x03测试效果如下 串口指令0x04测试效果如下 串口指令0x05测试效果如下 串口指令0x06测试效果如下
STM32例程下载
STM32F401CCU6 I2C总线FATS读写EEPROM ZD24C1MA例程下载
–End–