我可以使用 libopencm3 在我的 STM32L0 上编写 i2c 程序吗?

Can I use libopencm3 to write an i2c program on my STM32L0?

我正在尝试在我的 STM32L0(发现套件)上为 运行 创建一个非常简单的 i2c 测试程序。我修改了libopencm3-examples/examples/stm32/l0/stm32l0538-disco.

中的miniblink程序

但是如果我只包含 i2c 头文件:

#include <libopencm3/stm32/i2c.h>

和运行让我得到错误:

 ../../../../../libopencm3//include/libopencm3/stm32/i2c.h:36:9: error: #error "stm32 family not defined."

调查此文件后,似乎为每个其他模型定义了规则,但没有为 l0 定义,这是为什么? STM32L0系列libopencm3不支持i2c吗?

#if defined(STM32F0)
#       include <libopencm3/stm32/f0/i2c.h>
#elif defined(STM32F1)
#       include <libopencm3/stm32/f1/i2c.h>
#elif defined(STM32F2)
#       include <libopencm3/stm32/f2/i2c.h>
#elif defined(STM32F3)
#       include <libopencm3/stm32/f3/i2c.h>
#elif defined(STM32F4)
#       include <libopencm3/stm32/f4/i2c.h>
#elif defined(STM32L1)
#       include <libopencm3/stm32/l1/i2c.h>
#else
#       error "stm32 family not defined."
#endif

我查看了 libopencm3/stm32/l1/i2c.h,它似乎只是导入了通用的 i2c 库。有什么办法可以只使用 l1 的 i2c 库吗?

谢谢

STM32L0具体header需要补充
虽然(可以使用 i2c 通用 header 文件)。
不打算直接包含常见的 header(为了安全和减少头痛)。 (它有包含检查)

解决方案:
您应该检查 "i2c_common_all.h" 是否具有正确的 l0 寄存器定义(可能是),然后将 stm32/l1/i2c.h 复制到 stm32/l0/i2c.h 并将(最后两行)添加到 stm32/i2c.h

#elif defined(STM32L1)
#       include <libopencm3/stm32/l1/i2c.h>
#elif defined(STM32L0)
#       include <libopencm3/stm32/l0/i2c.h>

并对lib/stm32/l0/Makefile进行修改OBJS += i2c_common_all.o

如果需要,请发送拉取请求

破解:(不推荐)

#include <libopencm3/cm3/common.h>
#include <libopencm3/stm32/memorymap.h>
#define LIBOPENCM3_I2C_H
#include <libopencm3/stm32/i2c_common_all.h>

并手动包含源文件 lib/stm32/common/i2c_common_all.c