HAL库 EEPROM字符串读写

配置I2C 和串口
串口的配置就不做详细介绍

 

 1 #include "stm32f1xx_hal.h"
 2 #include "Eeprom.h"
 3 #include "string.h"
 4 extern I2C_HandleTypeDef hi2c1;
 5 /*------д×Ö·û´®µ½EEPROMÖÐ*/
 6 void I2C_eepWritePage(uint8_t address,char * str){
 7     int len     = 0;//ÓÃÀ´¼ÆËãд½øµÄ×Ö·û´®³¤¶È
 8     int status ;    //ÓÃÀ´´æ·Åд½øÈ¥µÄ״̬
 9     int page = 0;   //ÓÃÀ´±£´æÒ³Êý
10     int k =       0;//ÓÃÀ´ÓÃ×öforÑ­»· ҳд
11     len = strlen(str)+1;//¼Ó1 °Ñ½áÊø·ûÒ²°üÀ¨½øÈ¥
12     if(len <= 7){       //Èç¹û×Ö½Ú³¤¶ÈСÓÚ8¸ö×Ö½Ú ÄÇô¾Í¿ÉÒÔÖ±½Ó´æ·ÅÎÞÐè·ÖÒ³
13         status = HAL_I2C_Mem_Write(&hi2c1,0xA0,address,I2C_MEMADD_SIZE_8BIT,str,len,200);//0xa0дÃüÁî
14         if(status == HAL_OK){
15             printf("дÈë³É¹¦£¡ \nдÈëµÄÊý¾Ý³¤¶ÈΪ:%d\nдÈëµÄÊý¾ÝÄÚÈÝΪ:%s",len,str);
16         }
17     }else{//Èç¹ûдÈëµÄ×Ö½Ú´óÓÚ8¸ö×Ö½ÚÔò·ÖÒ³±£´æ
18         page = len%8 > 0 ? (len/8+1): (len/8);//ÓÃÀ´¼ÆËãÓжàÉÙÒ³Êý¾Ý ÈýÔªÔËËã 
19         for(k = 0; k<page; k++){
20             while(HAL_I2C_IsDeviceReady(&hi2c1,0xA0,3,500));//²â溯Êý ÅжÏeepromÊÇ·ñ´¦ÔÚæµ״̬
21             status = HAL_I2C_Mem_Write(&hi2c1,0xA0,address+k*8,
22             I2C_MEMADD_SIZE_8BIT,str+8*k,(len-8*k>=8)?8:(len-8*k),200);
23             HAL_Delay(10);
24             if(status == HAL_OK){
25                 printf("±£´æµÚ:%dÒ³µÄµØÖ·:%d\n",k+1,address+8*k);//address+8*k
26             }
27             /*---->Ò»¸öÒ»¸ö×Ö½Úд*/
28             while(HAL_I2C_IsDeviceReady(&hi2c1,0xA0,3,500)){
29                 HAL_I2C_Mem_Write(&hi2c1,0xA0,address+k,I2C_MEMADD_SIZE_8BIT,str+k,1,200);
30                 HAL_Delay(10);    
31             }
32         }        
33     }
34 }
35 uint8_t* I2c_eep_Read(uint8_t address, uint8_t * data){
36     uint8_t d = 0;                    //ÓÃ×÷forÑ­»·±äÁ¿´æ·Å±äÁ¿
37     uint8_t Read_status = 0;//ÓÃÀ´´æ·Å¶ÁÈ¡µÄ״ֵ̬
38     do{
39         while(HAL_I2C_IsDeviceReady(&hi2c1,0xA1,3,5));//²â溯Êý
40         Read_status = HAL_I2C_Mem_Read(&hi2c1,0xA1,address,I2C_MEMADD_SIZE_8BIT,&data[d],1,200);
41         if(Read_status == HAL_OK){
42             d             ++;
43             address ++;
44         }else{
45             printf("¶ÁÈ¡µ½µÚ%d¸ö×Ö½Ú³öÏÖ´íÎó:%d\n",d-1,Read_status);
46         }
47         HAL_Delay(10);
48     }while(data[d-1] != '\0' && d<100);
49     return data;
50 }

复制代码

复制代码

主函数代码
void main(){
     printf("\n1-------------------eeprom  start\n"); 
     I2C_eepWritePage(0x00,"你好,我是新写入的数据!我写了很多内容今天的天气很多变\0");
        uint8_t data[100] = {0};
        HAL_Delay(100);
        printf("读取到的数据:%s",I2c_eep_Read(0x00,data));//eeprom  读取数据
}

复制代码

 

实现结果

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在STM32HAL库中,可以使用UART串口通信模块来接收字符串。UART串口通信模块在HAL库中提供了一系列API函数,可以方便地实现串口通信。下面是一个简单的接收字符串的示例代码: ```c #include "stm32f4xx_hal.h" #define RX_BUFFER_SIZE 128 uint8_t rx_buffer[RX_BUFFER_SIZE]; // 接收缓冲区 uint8_t rx_index = 0; // 缓冲区指针 void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if (huart->Instance == USART1) // 如果是串口1接收到数据 { if (rx_buffer[rx_index] == '\n') // 如果接收到回车换行符 { rx_buffer[rx_index] = '\0'; // 将字符串结束符放在末尾 rx_index = 0; // 重置指针 // 处理接收到的字符串 // ... } else { rx_index++; // 指针加1 if (rx_index >= RX_BUFFER_SIZE) // 缓冲区溢出 { rx_index = 0; // 重置指针 } } HAL_UART_Receive_IT(&huart1, &rx_buffer[rx_index], 1); // 继续接收数据 } } int main(void) { // 初始化串口1 __HAL_RCC_USART1_CLK_ENABLE(); 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_RX; huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart1.Init.OverSampling = UART_OVERSAMPLING_16; HAL_UART_Init(&huart1); // 开始接收数据 HAL_UART_Receive_IT(&huart1, &rx_buffer[rx_index], 1); while (1) { // 主循环 } } ``` 在这个示例代码中,我们定义了一个接收缓冲区rx_buffer和一个指针rx_index,指针rx_index用来指向缓冲区中下一个可写入数据的位置。当接收到数据时,如果是回车换行符,则将字符串结束符放在末尾,重置指针rx_index,并处理接收到的字符串。如果不是回车换行符,则将指针rx_index加1,如果缓冲区溢出则重置指针rx_index,并继续接收数据。在main函数中,我们初始化了串口1,并开始接收数据。在HAL_UART_RxCpltCallback回调函数中,我们继续调用HAL_UART_Receive_IT函数来继续接收数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值