找回密码
 立即注册

QQ登录

只需一步,快速开始

打印 上一主题 下一主题
开启左侧

[M051] 关于M0518的ALT_MFP寄存器的秘密

[复制链接]
跳转到指定楼层
楼主
       如题, 在使用新唐M0518的过程中,忽然发现ALT_MFP的这个神器, 到底是做什么用场的呢? 为何M0516这样的基础性M0没有呢. 请熟悉的朋友答疑解惑, 是因为M0518的单个引脚的复用功能脚多,同样的串口,可以选择放在多个io端口中的一个吗?
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 顶 踩
回复

使用道具 举报

沙发
 楼主| harvardx 发表于 2016-4-4 01:05:53 | 只看该作者
差点搞复杂了:


其实宏观的看ALT_MFP   ALT2_MFP , ALT3_MFP, ALT4_MFP 就知道了答案: 可以直接对这4个寄存器整体赋值, 而不需要走下面这样:  先清零msk ,后通过|= 的形式进行位操作,赋值的方式:







5[EXR7J1B@87COTRJGNNAX8.png (91.06 KB, 下载次数: 331)

ALT_MFP

ALT_MFP
回复 支持 反对

使用道具 举报

板凳
 楼主| harvardx 发表于 2016-4-4 01:08:53 | 只看该作者
   /* ALT_MFP , ALT2_MFP~ALT4_MFP清零复位 */
    SYS->ALT_MFP &=~(
                        SYS_ALT_MFP_PA0_Msk|  SYS_ALT_MFP_PA1_Msk |

                );
                    
    SYS->ALT2_MFP &=~(
                        SYS_ALT_MFP_PA0_Msk|  SYS_ALT_MFP_PA1_Msk |

                        

        );
        
    SYS->ALT3_MFP &=~(
                        SYS_ALT_MFP3_PA0_Msk    |   SYS_ALT_MFP3_PA1_Msk |      
                        SYS_ALT_MFP3_PA2_Msk    |   SYS_ALT_MFP3_PA3_Msk |      

        );
        
    SYS->ALT4_MFP &=~( SYS_ALT_MFP4_PA1_Msk|  SYS_ALT_MFP4_PA2_Msk |

        );
                    
    /* ALT_MFP , ALT2_MFP~ALT4_MFP设置   */

    SYS->ALT_MFP |=(
                        SYS_ALT_MFP_PA0_UART5_TXD   |   SYS_ALT_MFP_PA1_UART5_RXD |
   
                    );                    
    SYS->ALT2_MFP |=(
                        SYS_ALT_MFP_PA0_UART5_TXD   |   SYS_ALT_MFP_PA1_UART5_RXD |
   
                    );  
                    
    SYS->ALT3_MFP |=(
                        SYS_ALT_MFP3_PA0_UART5_TXD  |   SYS_ALT_MFP3_PA1_UART5_RXD  |
                        SYS_ALT_MFP3_PA2_UART3_TXD  |   SYS_ALT_MFP3_PA3_UART3_RXD  |
     
                    );   
                    
    SYS->ALT4_MFP |=(
                        SYS_ALT_MFP4_PA0_UART5_TXD |    SYS_ALT_MFP4_PA1_UART5_RXD  |
                        SYS_ALT_MFP4_PA2_UART3_TXD |    SYS_ALT_MFP4_PA3_UART3_RXD  |
                    );                    
这样的形式太累,容易出错,

其实看了几个ALT_MFP寄存器的定义就明白了 . 一般的功能都无需触及他,关于pwm和定时等相关时,才需要操作. 平常,还是和M0516一样 操作对应端口的MFP就可以了

如下:

#include "M0518.h";
/*
* @brief This function provides the configued MFP registers
* @param None
* @return None
*/
void SYS_Init(void)
{
    //SYS->ALT_MFP = 0x00000000;
    //SYS->ALT_MFP2 = 0x00000000;
    //SYS->ALT_MFP3 = 0x00000000;
    //SYS->ALT_MFP4 = 0x0000000C;
    //SYS->GPA_MFP = 0x0000000C;
    //SYS->GPB_MFP = 0x00000033;
    //SYS->GPC_MFP = 0x000000C0;
    //SYS->GPD_MFP = 0x0000C000;
    //SYS->GPF_MFP = 0x000000C0;

    //If the defines do not exist in your project, please refer to the related sys.h in the sys_h folder appended to the tool package.
    SYS->ALT_MFP = 0x00000000;
    SYS->ALT_MFP2 = 0x00000000;
    SYS->ALT_MFP3 = 0x00000000;
    SYS->ALT_MFP4 = SYS_ALT_MFP4_PA3_UART3_RXD | SYS_ALT_MFP4_PA2_UART3_TXD;
    SYS->GPA_MFP = SYS_GPA_MFP_PA3_UART3_RXD | SYS_GPA_MFP_PA2_UART3_TXD;
    SYS->GPB_MFP = SYS_GPB_MFP_PB5_UART1_TXD | SYS_GPB_MFP_PB4_UART1_RXD | SYS_GPB_MFP_PB1_UART0_TXD | SYS_GPB_MFP_PB0_UART0_RXD;
    SYS->GPC_MFP = SYS_GPC_MFP_PC7_UART4_RXD | SYS_GPC_MFP_PC6_UART4_TXD;
    SYS->GPD_MFP = SYS_GPD_MFP_PD15_UART2_TXD | SYS_GPD_MFP_PD14_UART2_RXD;
    SYS->GPF_MFP = SYS_GPF_MFP_PF7_ICE_DAT | SYS_GPF_MFP_PF6_ICE_CLK;

    return;
}

5[EXR7J1B@87COTRJGNNAX8.png (91.06 KB, 下载次数: 333)

5[EXR7J1B@87COTRJGNNAX8.png
回复 支持 反对

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies |上传

本版积分规则

新唐MCU