: w& C# n5 |7 I4 w Y
- HAL_StatusTypeDef HAL_I2C_Mem_Read_AT24CM02(I2C_HandleTypeDef *hi2c, uint32_t MemAddress18bit, uint8_t *pData, uint16_t Size, uint32_t Timeout); // 根据AT24CM02重新封装读取函数
6 [; Z5 I& C- {$ ] - HAL_StatusTypeDef HAL_I2C_Mem_Write_AT24CM02(I2C_HandleTypeDef *hi2c, uint32_t MemAddress18bit, uint8_t *pData, uint16_t Size, uint32_t Timeout); // 根据AT24CM02重新封装写入函数
, s' ^1 A% K1 l
复制代码 . p) Y- K% Y+ ~
0 o, i, ]8 z2 b+ |0 k+ q c0 f上面两个函数声明放在下面两行中间,避免重新配置STM32CubeMX后被覆盖删除。
5 u6 _! A7 M( c! }. G5 t4 z/* USER CODE BEGIN PFP */
. u6 [+ v8 } p. V+ G8 ^6 s/* USER CODE END PFP */
+ w) }: z# W- ~; H( b# @8 L8 i, O# {) a6 c* i- ? s1 C) J& @9 i3 B
- HAL_StatusTypeDef HAL_I2C_Mem_Read_AT24CM02(I2C_HandleTypeDef *hi2c, uint32_t MemAddress18bit, uint8_t *pData, uint16_t Size, uint32_t Timeout) // 根据AT24CM02重新封装读取函数& [& k! @7 d# ~5 m
- {
3 J8 L$ h8 S/ J( D: D3 N - //
4 ^ U/ y7 I, [0 O - return HAL_I2C_Mem_Read(hi2c,(((MemAddress18bit/65536)<<1)+0xA0),(MemAddress18bit%65536),I2C_MEMADD_SIZE_16BIT,pData,Size,Timeout);
& D2 _) T5 q' F - }
/ H/ Y) x: a% }- @
- N% D$ _1 U1 O ?9 r' I- HAL_StatusTypeDef HAL_I2C_Mem_Write_AT24CM02(I2C_HandleTypeDef *hi2c, uint32_t MemAddress18bit, uint8_t *pData, uint16_t Size, uint32_t Timeout) // 根据AT24CM02重新封装写入函数& U6 M/ M+ L/ P* V' c$ V$ k
- {
* g. t4 O( I% u( a9 y7 I' Y+ A - //
' C- n9 R2 v8 K+ y - return HAL_I2C_Mem_Write(hi2c,(((MemAddress18bit/65536)<<1)+0xA1),(MemAddress18bit%65536),I2C_MEMADD_SIZE_16BIT,pData,Size,Timeout);) n2 X7 j* D" N" J8 c" R0 I, G( _
- }
复制代码
& b( @8 b% z; N1 `: K3 J
* K# y! Y# D( x% j3 u( v: ?+ _+ l) q& r9 G- N
后面两个函数放在“/* USER CODE END 4 */”上面,“/* USER CODE BEGIN 4 */”下面,避免重新配置STM32CubeMX后被覆盖删除。
$ h1 ?3 [: `6 N
使用前提是: 软件上用 STM32CubeMX 配置工程,选择HAL库。 硬件上芯片的A2引脚不接入IO脚使用,如果需要用到2片AT24CM02的同学当是留家庭作业自己回家做了,这里就不讲了^_^
9 C' t6 X) _9 X; }1 O! J* j2 `
之前发了个求助贴,得到大佬们的提示,终于明白是怎么回事了。所以做好分享出来,让同行少折腾。
9 I; i, O, S, J' G) N |
/ ~1 t. f8 J& S4 e+ t. u7 b
, x, P8 v0 } h- q+ D- S9 w
* L- d- M. E/ r. |$ d8 Q5 i: S/ m+ q
然后打印输出的结果是:$ X) m, J7 b7 U* I0 \- r( t8 r
AT24CM02 第262144个字节中的数据是:0xff2 [2 U& w' l" l8 g
AT24CM02 第131072个字节中的数据是:0xff
AT24CM02 第65536个字节中的数据是:0xff* M; B, G* l! U, }4 ?0 z
AT24CM02 第262144个字节中的数据是:0xab+ F% F+ E; A5 H4 u
AT24CM02 第131072个字节中的数据是:0xff2 J5 ?4 b# g4 [1 `
AT24CM02 第65536个字节中的数据是:0xff
AT24CM02 第262144个字节中的数据是:0xab
AT24CM02 第131072个字节中的数据是:0xcd
AT24CM02 第65536个字节中的数据是:0xff
AT24CM02 第262144个字节中的数据是:0xab
AT24CM02 第131072个字节中的数据是:0xcd6 h. m$ s9 A2 b8 c0 k6 b4 X$ a/ v
AT24CM02 第65536个字节中的数据是:0xef0 G* y- B4 S' j" B- w. T% ^
AT24CM02 第262144个字节中的数据是:0xff( Q- y j; V2 c; q& ^8 Q: w
AT24CM02 第131072个字节中的数据是:0xff
AT24CM02 第65536个字节中的数据是:0xff6 q3 V7 A, ^/ l6 z* u0 R, }
5 @% @' j* \' w* w
1 U- @$ C! r* `3 p9 @0 e
补充说明一下,上面我开启了看门狗,所以用了喂狗处理,不用看门狗的话用 __nop(); 也是一样的1 S$ N0 w/ D' m4 O9 S
1.代码太累赘,重复的太多 封装性太差' E8 @" |0 S, _2 G( A
2.代码不规范,格式上实在不敢恭维
z$ y+ i' P4 p4 [6 r0 f/ S) T
让我评价打分10分给3分
有请这位大佬展示一下要是你怎么封装?8 G* U5 e' n9 O# A0 R" X- C
注意一下 沙发里的代码作用是演示怎样代入使用,并且通过打印证实了并没有只用到低16位地址的存储空间,9 ]- m0 Z: t, \ k5 `! @. K" Q% ?
主贴上的无论是 读取 还是 写入 函数 都只有 return 一行代码,并且保持HAL官方库的风格。
所以把可以直接替换的改了一下封装函数的入口形参,保持与官方一致,方便已有工程的EEPROM读写代码直接替换函数名+ s2 S& v0 i4 a+ w C1 e1 l
! z& O& X% t: m: N