focus012 发表于 2011-1-30 20:25:05

马老师新年好!请教一个M051 GPIO复用的问题

我用新唐送的开发板,测试GPIO时发现:
1.只要使能了UART0,则P0.2(CTS0)和P0.3(RTS0)就一直为高电平。无法作为通用输出口置低。
2.只要使能了定时器TIMER0,则P1.0(T2)和P1.1(T3)就一直为高电平。无法作为通用输出口置低。

程序如下:
#include <stdio.h>
#include "Driver/DrvTIMER.h"
#include "Driver/DrvGPIO.h"
#include "Driver/DrvSYS.h"
#include "Driver/DrvUART.h"

int main(void)
{   
    STR_UART_T param;

    UNLOCKREG(x);                           //解锁寄存器
    DrvSYS_SetOscCtrl(E_SYS_XTL12M, 1);   //使能外部12M时钟源

    while (DrvSYS_GetChipClockSourceStatus(E_SYS_XTL12M) != 1);   //等待外部12M时钟源建立
   
    DrvSYS_SelectHCLKSource(0);                    //HCLK也选择外部12M时钟源

    DrvSYS_SetClockDivider(E_SYS_HCLK_DIV, 0);          //HCLK频率

    DrvGPIO_InitFunction(E_FUNC_UART0);                    //初始化串口引脚
    DrvSYS_SelectIPClockSource(E_SYS_UART_CLKSRC,0);    //串口时钟源选择外部12M
   
    param.u32BaudRate      = 57600;                   //Baudrate = 57600 bit/s
    param.u8cDataBits      = DRVUART_DATABITS_8;           //8数据位
    param.u8cStopBits      = DRVUART_STOPBITS_1;           //1停止位
    param.u8cParity          = DRVUART_PARITY_NONE;    //无奇偶校验
    param.u8cRxTriggerLevel= DRVUART_FIFO_1BYTES;
    param.u8TimeOut          = 0;
    DrvUART_Open(UART_PORT0, &param);                   //初始化串口

    DrvTIMER_Init();                  
    DrvSYS_SelectIPClockSource(E_SYS_TMR0_CLKSRC, 0);//TMR0的时钟源选择:外部12MHz 晶振
    DrvTIMER_Open(E_TMR0, 100, E_PERIODIC_MODE);         
    DrvTIMER_SetTimerEvent(E_TMR0, 10, (TIMER_CALLBACK)TMR0_CallbackFunction, 1);                                                                                                        
    DrvTIMER_EnableInt(E_TMR0);                        //使能TMR0中断
    DrvTIMER_Start(E_TMR0);                       //启动Timer0

    GPIO_Init();                               //初始化GPIO
          
    while(1)
    {
      DrvGPIO_SetPortBits (E_PORT0, 0x00);         //P0口置全低(但结果P0.2和P0.3一直为高)
      DrvGPIO_SetPortBits (E_PORT1, 0x00);         //P1口置全低(但结果P1.0和P1.1一直为高)
    }
}

可能是还应该对这几位复用的端口进行设置,但我没找到。
请马老师和各位高手指教,谢谢!

machao 发表于 2011-1-30 23:55:58

尽管我多次建议大家要认真看手册,要先注意和使用寄存器,总是有人反对。

M051说是“替代”8051,这个替代实际是颠覆性的。8051对I/O口控制的寄存器有几个?而M051针对I/O的寄存器就有10几个,功能多的要死。其它的硬件接口就不要谈了,一个UART复杂了N倍。

什么有了8051的基础,使用库,几天内就能掌握M051,那是骗人的鬼话。

要想真正掌握MCU的使用,先扔掉哪个“库”吧。

对于LZ的问题,我提供你查看手册,关注下面的寄存器:

P0_MFPGCR_BA+0x30R/WP0 multiple function and input type control register0x0000_0000
P1_MFPGCR_BA+0x34R/WP1 multiple function and input type control register0x0000_0000
P2_MFPGCR_BA+0x38R/WP2 multiple function and input type control register0x0000_0000
P3_MFPGCR_BA+0x3CR/WP3 multiple function and input type control register0x0000_0000
P4_MFPGCR_BA+0x40R/WP4 input type control register0x0000_00C0

greatwall2 发表于 2011-1-31 11:52:18

谢谢马老师!您说的对。我也意识到不能浮躁,要沉下心去看资料。在昨晚我也找到了这几个寄存器,今天不用库直接设置寄存器看看。再次感谢马老师!

tanghk 发表于 2011-7-4 20:14:39

顶一下
页: [1]
查看完整版本: 马老师新年好!请教一个M051 GPIO复用的问题