[技术文档]

HK32F030MF4P6库函数IOMUX的BUG补漏

[复制链接]
446|1
手机看帖
扫描二维码
随时随地手机跟帖
暗星归来|  楼主 | 2021-4-3 10:59 | 显示全部楼层 |阅读模式
本帖最后由 暗星归来 于 2021-6-23 11:12 编辑

#申请原创# HK32F030MF4P6的库V1.1.3版本(1.0.5版本也有这个问题),关于PC3/PC4/PB5三个引脚外设复用的漏洞,体现在函数GPIO_IOMUX_PinAFConfig及其复用功能的定义上,官方提供的数据手册和用户手册关于IOMUX寄存器外设的说明如下:
官方IOMUX说明.png
根据官方文档说明,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_PinAFConfig.png
官方库对应的GPIO_IOMUX定义如下:
官方库函数IOMUX_AF定义.png

可以看出,官方库文件的位操作刚好与官方文档说明反过来了,经过实际测试发现库文件的定义方式确实存在反过来的问题。
因此需要对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






使用特权

评论回复

相关帖子

非凡378159128| | 2021-4-10 01:17 | 显示全部楼层
你的是HK32F030MF4P6(SSOP20),我的是HK32F030MJ4M6(SOP8)直接IOMUX无效
https://bbs.21ic.com/icview-3124052-1-1.html

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

16

帖子

0

粉丝