本帖最后由 暗星归来 于 2021-6-23 11:12 编辑
#申请原创# HK32F030MF4P6的库V1.1.3版本(1.0.5版本也有这个问题),关于PC3/PC4/PB5三个引脚外设复用的漏洞,体现在函数GPIO_IOMUX_PinAFConfig及其复用功能的定义上,官方提供的数据手册和用户手册关于IOMUX寄存器外设的说明如下:
根据官方文档说明,PB5/PC4/PC3复用为外设功能时,
其对应的SEL位=1时对应的外设功能分别为I2C1_SDA/TIM1_CH2N/TIM1_CH1N,
而对应的SEL位=0时对应的外设功能分别为SWCLK/TIM1_CH4/TIM1_CH3。
而官方库文件中GPIO_IOMUX_PinAFConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_PinSource, uint8_t IOMUX_AF)函数原型如下:
官方库对应的GPIO_IOMUX定义如下:
可以看出,官方库文件的位操作刚好与官方文档说明反过来了,经过实际测试发现库文件的定义方式确实存在反过来的问题。
因此需要对IOMUX_AF定义和函数GPIO_IOMUX_PinAFConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_PinSource, uint8_t IOMUX_AF)进行相应的修改,
这里为了大家复制方便,直接贴出修改后的代码,修改的部分已经标黄,如下:
void GPIO_IOMUX_PinAFConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_PinSource, uint8_t IOMUX_AF)
{
/* Check the parameters */
assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
assert_param(IS_GPIO_PIN_SOURCE(GPIO_PinSource));
assert_param(GPIO_IOMUX_AF(IOMUX_AF));
/* IOMUX function*/
// if PB5 as SWCLK
if((GPIOx == GPIOB)&&(GPIO_PinSource == GPIO_PinSource5))
{
if(IOMUX_AF == GPIOMUX_AF_0_SWCLK)
{
GPIOMUX->PIN_FUNC_SEL &= IOMUX_PB5_SWCLK; //原来是 |=
}
else if(IOMUX_AF == GPIOMUX_AF_0_I2C_SDA)
{
GPIOMUX->PIN_FUNC_SEL |= IOMUX_PB5_SWCLK; //原来是 &=
}
}
// select PC3 as TIM1 CH3 or CHIN
else if((GPIOx == GPIOC)&&(GPIO_PinSource == GPIO_PinSource3))
{
if(IOMUX_AF == GPIOMUX_AF_3_TIM1CH3)
{
GPIOMUX->PIN_FUNC_SEL &= IOMUX_PC3_TIM1CH3; //原来是 |=
}
else if(IOMUX_AF == GPIOMUX_AF_3_TIM1CH1N)
{
GPIOMUX->PIN_FUNC_SEL |= IOMUX_PC3_TIM1CH1N; //原来是 &=
}
}
// select PC4 as TIM1 CH4 or CH2N
else if((GPIOx == GPIOC)&&(GPIO_PinSource == GPIO_PinSource4))
{
if(IOMUX_AF == GPIOMUX_AF_3_TIM1CH4)
{
GPIOMUX->PIN_FUNC_SEL &= IOMUX_PC4_TIM1CH4; //原来是 |=
}
else if(IOMUX_AF == GPIOMUX_AF_3_TIM1CH2N)
{
GPIOMUX->PIN_FUNC_SEL |= IOMUX_PC4_TIM1CH2N; //原来是 &=
}
}
}
/** @defgroup GPIO_IOMUX
* @{
*/
#define IOMUX_PC3_TIM1CH3 0xFFFFFFFE //原定义为 0x00000001
#define IOMUX_PC3_TIM1CH1N 0x00000001 //原定义为 0xFFFFFFFE
#define IOMUX_PC4_TIM1CH4 0xFFFFFFFD //原定义为 0x00000002
#define IOMUX_PC4_TIM1CH2N 0x00000002 //原定义为 0xFFFFFFFD
#define IOMUX_PB5_SWCLK 0xFFFFFFFB //原定义为 0x00000004
#define IOMUX_PB5_I2C_SDA 0x00000004 //原定义为 0xFFFFFFFB
|