STM32
直播中

乐骞添

7年用户 1011经验值
私信 关注
[问答]

STM32F103C8 UART1, I2C1, CAN冲突问题怎么解决?

ST芯片型号: STM32F103C8T6
PB7,PB6用于UART1
PB8,PB9用于做CAN.
问题:I2C1_REMAP关闭,影响PB7,PB6的UART1功能,导致UART1不能发送
I2C1_REMAP打开,影响PB9,PB8的CAN功能,导致CAN TX不能发送

具体如下:
使用PB7,PB6做IO口,需要做如下映射,才可以UART1, tx,rx正常工作:
GPIO_PinRemapConfig(GPIO_Remap_USART1, ENABLE);
GPIO_PinRemapConfig(GPIO_Remap_I2C1, ENABLE); //Must remap I2C1, otherwise PB6 conficts

如果:
GPIO_PinRemapConfig(GPIO_Remap_I2C1, ENABLE);
为disable,uart1 tx不能发送,rx接收正常.
根据芯片手册,也正常


复用功能       I2C1_REMAP = 0    I2C1_REMAP = 1   
I2C1_SCL         PB6                        PB8
I2C1_SDA        PB7                        PB9


复用功能              USART1_REMAP = 1   
USART1_TX                    PB6
USART1_RX                    PB7


由于PB6,PB7已经用于UART1, 所以需要将 I2C1_REMAP设置为1,切换到PB8,PB9.

但是PB8,PB9做can时,又与I2C1冲突了,导致PB9 can不能发送,但PB8 can接收正常.


复用功能              CAN_REMAP[1:0]=”10”
CAN1_RX                    PB8
CAN1_TX                    PB9


怎样能解决这个冲突呢,是芯片设计bug吗?

回帖(2)

刘甜甜

2024-4-8 11:04:20
将各个功能分配给不同的引脚,也就是说每个引脚只承担一个功能,就不会出现冲突的现象了。
举报

淡淡的爱

2024-4-8 15:38:21
在STM32F103C8芯片上,UART1和I2C1是共享GPIO引脚的,因此需要正确配置引脚映射,以避免冲突。

在您的情况下,当I2C1_REMAP关闭时,UART1的发送功能受到影响,当I2C1_REMAP打开时,CAN的发送功能受到影响。

要解决这个问题,您可以尝试以下方法之一:

1. 将UART1与I2C1映射到不同的引脚:

将UART1映射到其他引脚,而不是PB7和PB6。您可以使用GPIO_PinRemapConfig函数选择其他引脚作为UART1的TX和RX。这样,无论I2C1_REMAP是打开还是关闭,UART1的发送和接收都应该正常工作。

2. 将CAN与I2C1映射到不同的引脚:

将CAN的TX和RX引脚从PB9和PB8改为其他引脚,然后保留I2C1_REMAP打开。这样,无论I2C1_REMAP是打开还是关闭,CAN的发送和接收都应该正常工作。

请注意,为了使CAN和串口正常工作,您需要在代码中相应地更改引脚映射。

希望这些方法能帮助您解决冲突问题。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分