各位老师,本人在学习F28M35的H52C型号处理器。芯片的GPIO34_PF2引脚可以复用为XCLKOUT,即时钟外部输出。根据资料,这个引脚既可以在M3内核控制下更改MUX来复用,也可以在C28内核控制下复用。我在C28下复用有输出,但在M3内核下复用没有输出,不知道什么原因。因为设计需要,希望能把该引脚控制程序放在M3里面。
在C28里面,更改引脚复用就行了:
EALLOW;
GpioCtrlRegs.GPBMUX1.bit.GPIO34 = 3;
EDIS;
在M3环境下就不能输出,M3的配置代码(编译下载运行都没问题):
SysCtlClockConfigSet(SYSCTL_USE_PLL | (SYSCTL_SPLLIMULT_M & 0x0F) |
SYSCTL_SYSDIV_1 | SYSCTL_M3SSDIV_2);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
GPIOPinConfigureCoreSelect(GPIO_PORTF_BASE, GPIO_PIN_2, GPIO_PIN_M_CORE_SELECT);
GPIOPinConfigure(GPIO_PF2_XCLKOUT0);
GPIODirModeSet(GPIO_PORTF_BASE, GPIO_PIN_2,GPIO_DIR_MODE_HW);
不知道是什么问题,还是需要其他配置?
gaoyang9992006:
这个问题解决了没,怎么做到的? 没用过这个芯片,但是很想了解一下,怎么使用M3内核控制这个引脚输出CLK。
user4379468:
回复 gaoyang9992006:
还没解决,感觉是寄存器的问题,库函数里面没有能直接把M3的XCLKOUT引脚初始化的函数,需要自己用几个其他函数把寄存器配出来。
关于M3内核控制这个引脚输出CLK的问题,我个人大概的理解是:对于单核芯片,同一个引脚通过多路复用器来实现各种功能,例如GPIO、UART等,对于双核芯片又增加了“更高一级”的复用选项,这个选项决定了引脚当前是受到哪个内核的控制,这个选项是由M3内核来决定的。通过这个选项确定了内核,之后才会涉及到内核控制下的引脚的具体复用功能。所以步骤是首先在M3程序里把引脚权限给M3,之后通过引脚复用把这个引脚配置为XCLKOUT模式,这个引脚会输出一个可配置分频的时钟。
user4379468:
我的问题已经解决了,原因是没有把引脚设定为输出模式导致的。
在c28核中,引脚貌似一旦使能,就默认为输出模式的,所以只要经过引脚复用:
GpioCtrlRegs.GPBMUX1.bit.GPIO34 = 3;就可以输出CLKOUT时钟了。
在m3核中,引脚貌似默认不是输出,所以要选为输出模式,增加这句代码:
GPIOPadConfigSet(GPIO_PORTF_BASE, GPIO_PIN_2, GPIO_PIN_TYPE_STD);
由此,如果不考虑时钟源的话,m3内核下的外部时钟输出的完整配置方法为:
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF); //引脚使能 GPIOPinConfigureCoreSelect(GPIO_PORTF_BASE, GPIO_PIN_2, GPIO_PIN_M_CORE_SELECT); //内核权限选择
GPIOPinConfigure(GPIO_PF2_XCLKOUT0); //引脚复用 GPIODirModeSet(GPIO_PORTF_BASE, GPIO_PIN_2, GPIO_DIR_MODE_HW); //硬件控制模式 GPIOPadConfigSet(GPIO_PORTF_BASE, GPIO_PIN_2, GPIO_PIN_TYPE_STD); //输出模式配置,这里选择了推挽
其实,对于M3内核中一般的引脚复用,例如UART,例程已经很清楚了,核心是:
GPIOPinConfigure(GPIO_PE4_U0RX); GPIOPinConfigure(GPIO_PE5_U0TX); GPIOPinTypeUART(GPIO_PORTE_BASE, GPIO_PIN_4 | GPIO_PIN_5);
对于实现外部时钟输出,上面最后一行代码的这种函数形式:GPIOPinType_?_?_?官方库函数是没有给的,因此后面的东西要自己配。之前没有仔细分析时钟输出的信号连接原理,所示出现了问题。