本帖最后由 kensilong 于 2022-2-17 17:44 编辑
HC32F460和HC32F4A0支持端口自由映射,映射的外设是串行接口,如I2C, USART, CAN, I2S, SPI 这些外设支持自由映射到外设管脚上。我们来通过数据手册来理解一下这一功能。如下表,从32-63对应了不同的外设功能,另外最左侧,Func_grp1和Func_grp2分开了两组。 再来看一下引脚功能表,我们发现最后一列Func_grp1和Func_grp2的描述,也就是对应的管脚属于Func_grp1或者Func_grp2分组。 再看一下对应每个管脚的功能选择寄存器描述 这里面Bit0-5就是选择对应的功能,比如当前管脚是Func_grp1组的,要设置成USART1_TX,那把这个寄存器设置成32就可以了。 让我们来思考一下,端口自由映射有什么好处 1. 可以最近布线,让PCB更加整洁,有利于EMC 2. 分时复用串行外设,曾有客户有多个传感器需要较多的UART串口,但芯片只有4个UART,传感器不会主动发送数据给MCU,这样就可以通过分时复用的方式,把串口分时映射到不同的IO实现多个传感器数据的采集。这里要注意一下,在切换功能的时候,可以把端口的LTE打开,保持当前电平,还有同一功能不要同时映射到多个IO上。 代码如下 uint8_tbsp_uart3_port_switch(void) { static bool flag; while(M4_USART3->SR_f.TC == 0);//等待串口发送完成 PORT_Unlock(); if(flag == false) { bM4_PORT_PCRE4_LTE = 1; bM4_PORT_PCRE5_LTE = 1; M4_PORT->PFSRE4_f.FSEL = Func_Gpio; M4_PORT->PFSRE5_f.FSEL = Func_Gpio; M4_PORT->PFSRE1_f.FSEL =Func_Usart3_Rx; M4_PORT->PFSRE2_f.FSEL =Func_Usart3_Tx; bM4_PORT_PCRE1_LTE = 0; bM4_PORT_PCRE2_LTE = 0; } else { bM4_PORT_PCRE1_LTE = 1; bM4_PORT_PCRE2_LTE = 1; M4_PORT->PFSRE1_f.FSEL = Func_Gpio; M4_PORT->PFSRE2_f.FSEL = Func_Gpio; M4_PORT->PFSRE4_f.FSEL =Func_Usart3_Rx; M4_PORT->PFSRE5_f.FSEL =Func_Usart3_Tx; bM4_PORT_PCRE4_LTE = 0; bM4_PORT_PCRE5_LTE = 0; } flag= !flag; PORT_Lock(); return flag; } 演示一下串口分时复用的效果 不知道朋友们还有没有别的妙用? 可以评论分享,谢谢。 |