打印
[综合信息]

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

[复制链接]
3040|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 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;
}
演示一下串口分时复用的效果
不知道朋友们还有没有别的妙用? 可以评论分享,谢谢。

使用特权

评论回复
沙发
renzheshengui| | 2022-2-2 17:32 | 只看该作者
请问什么叫做自由映射啊

使用特权

评论回复
板凳
heimaojingzhang| | 2022-2-2 17:34 | 只看该作者
这样做的优点非常多啊

使用特权

评论回复
地板
keaibukelian| | 2022-2-2 17:35 | 只看该作者
这个自由的尺度大吗

使用特权

评论回复
5
labasi| | 2022-2-2 17:39 | 只看该作者
我得先体会一下楼主的这个用处

使用特权

评论回复
6
paotangsan| | 2022-2-2 17:41 | 只看该作者
我一直也搞不清楚分时复用  每次都需要初始化吗

使用特权

评论回复
7
tpgf| | 2022-2-2 17:43 | 只看该作者
分时复用的节奏比较紧凑

使用特权

评论回复
8
tail066| | 2022-2-14 11:06 | 只看该作者
什么是自由映射

使用特权

评论回复
9
kensilong|  楼主 | 2022-2-17 17:42 | 只看该作者
renzheshengui 发表于 2022-2-2 17:32
请问什么叫做自由映射啊

自由映射是指,IO可以设置成这个表格的任意一种功能,通过对应的寄存器配置就可以实现。可以看一下**开头的描述,很详细了。

使用特权

评论回复
10
guijial511| | 2022-2-18 08:16 | 只看该作者
这个思路不错啊

使用特权

评论回复
11
我滴神啊| | 2022-2-18 08:58 | 只看该作者
还可以这样用

使用特权

评论回复
12
sadicy| | 2022-3-15 10:14 | 只看该作者
这不是引脚复用么?

使用特权

评论回复
13
xwpcom| | 2022-7-3 06:47 | 只看该作者
是个好主意,多谢分享

使用特权

评论回复
14
eefas| | 2023-2-4 10:02 | 只看该作者
自由映射端口确实自由多了。              

使用特权

评论回复
15
olivem55arlowe| | 2023-2-4 23:22 | 只看该作者
这个映射有什么问题吗?              

使用特权

评论回复
16
jingjitidu| | 2023-6-12 17:34 | 只看该作者
我今天也在搞这个管脚复用的功能,我这有个串口,因为收发频率比较低,在不进行传输期间切换到IO模式。按照历程的思路,在串口功能下,要先关闭RX与TX功能、锁存引脚电平、切换引脚功能函数、解除锁存。在IO功能下要锁存电平、切换引脚功能、使能RX或者TX。测试了RX结果正常,切换到GPI可以有信号输入,切换回RX也能收到数据(我用OLED显示屏显示了接收到的数据)。但是在TX功能就出现了问题,复位后功能都正常,外部按键按下后将TX引脚变更成GPO(暂时未验证GPO正确性),再按下按钮后切换回TX,程序内会根据串口发来的数据做出判断回复数据。实际的结果是,接收数据正常面显示屏显示了接收到的数据,但是却没有发送的数据。显示发送次数为正确调用了4次发送填装函数,发送完毕中断也触发(出发后LED_G翻转,证明发送完毕中断触发)。也就是说,调用了UART_Send函数向TDR句存起中填装数据,也有发送完毕中断,就是在电脑上获取不到数据,用示波器也抓不到波形。楼主能否根据你的经验答疑解惑?谢谢!

使用特权

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

本版积分规则

4

主题

32

帖子

1

粉丝