打印
[综合信息]

关于HC32F460端口自由映射的思考

[复制链接]
1088|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 kensilong 于 2022-1-6 17:19 编辑

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;
}
演示一下串口分时复用的效果
不知道朋友们还有没有别的妙用? 可以评论分享,谢谢。

使用特权

评论回复
沙发
caigang13| | 2022-1-7 09:14 | 只看该作者
学习了,谢谢分享。

使用特权

评论回复
板凳
watermellon| | 2022-1-7 10:14 | 只看该作者
很好的思路,以前到时没有这么考虑过。很多产品模块化设计,需要的串口越来越多,在芯片串口资源不够的情况下很好应对思路

使用特权

评论回复
地板
七毛钱| | 2022-1-11 11:35 | 只看该作者
非常棒的思路

使用特权

评论回复
5
豌豆爹| | 2022-1-18 11:10 | 只看该作者
这个确实值得学习

使用特权

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

本版积分规则

3

主题

31

帖子

1

粉丝