繁体   English   中英

STM32CubeMX I2C 代码写入保留寄存器位

[英]STM32CubeMX I2C code writing to reserved register bits

我正在 STM32F74 系列处理器上开发 I2C 驱动程序。 我正在使用 STM32CubeMX 低级驱动程序,我无法理解为 I2C 启动和停止寄存器值 (CR2) 生成的定义。

代码在stm32f7xx_ll_i2c.h中生成,如下。

/** @defgroup I2C_LL_EC_GENERATE Start And Stop Generation
 * @{
 */
 #define LL_I2C_GENERATE_NOSTARTSTOP         0x00000000U
 /*!< Don't Generate Stop and Start condition. */
 #define LL_I2C_GENERATE_STOP                (uint32_t)(0x80000000U | I2C_CR2_STOP)
 /*!< Generate Stop condition (Size should be set to 0).      */
 #define LL_I2C_GENERATE_START_READ          (uint32_t)(0x80000000U | I2C_CR2_START | I2C_CR2_RD_WRN)
 /*!< Generate Start for read request. */

我的问题是为什么这些定义中包含第 31 位? (0x 8 0000000U)。 参考手册 (RM0385) 指出“位 31:27 保留,必须保持在复位值。”。 我无法决定是修改生成的代码还是保留 31 位。 我很乐意接受建议,无论这更有可能是需要的东西,还是我会通过写入保留位来破坏事情。 来自 RM0385 的寄存器位图 (I2C_CR2) 的图像

提前致谢!

我在这里猜测是因为谁知道图书馆作者的想法? (如果您查看源代码,则不是很多!)。 但我猜想在调用 LL 函数时检查是否使用了指定的宏是一个“肮脏的技巧”。

然而,它存在严重缺陷,因为“技巧”仅适用于 Cortex-M3/4 STM32 变体(例如 F1xx、F2xx、F4xx),其中 I2C 外设非常不同,并且 I2C_CR2 等寄存器只有 15 位宽。

诀窍是库函数具有参数检查断言,例如:

assert_param(IS_TRANSFER_REQUEST(Request));

IS_TRANSFER_REQUEST的定义如下:

#define IS_TRANSFER_REQUEST(REQUEST)    (((REQUEST) == I2C_GENERATE_STOP)        || \
                                         ((REQUEST) == I2C_GENERATE_START_READ)  || \
                                         ((REQUEST) == I2C_GENERATE_START_WRITE) || \
                                         ((REQUEST) == I2C_NO_STARTSTOP))

这迫使您使用 LL 定义的宏作为参数,而不是一些自定义或计算的掩码,因为它们都具有“未使用”的检查位。

如果这确实是原因,那么没有设想更新的 I2C 外设是一种不明智的做法。 您可能会认为该位在写入寄存器之前已从参数中删除。 我查过了,不是。 如果你会在每次通话时支付开销,这也是不可取的。

作为一种错误检测技术,如果它是这样的话,它甚至没有被一致地应用; 例如,所有 GPIO_PIN_xx 宏都是 16 位宽,并且由于它们是掩码而不是引脚编号,因此使用位 31 可以例如防止传递实际上需要掩码1<<10的文字引脚编号 10。 传递 10 指的是引脚 3 和 1 而不是 10。老实说,这个错误比传递错误的 I2C 传输请求类型更有可能发生。

最后,“保留”通常意味着“未使用但可能在未来的实现中使用” ,并且要求您使用“重置值”是确保前向二进制兼容性的一种方式。 如果你有这样的设备,毫无疑问会有相应的库更新来支持它——但它需要重新编译代码。 如果您尝试在使用此位的较新的不兼容部件上运行此二进制文件,则风险很低,并且可能只是一个问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM