马老师新年好!请教一个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, ¶m); //初始化串口
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一直为高)
}
}
可能是还应该对这几位复用的端口进行设置,但我没找到。
请马老师和各位高手指教,谢谢! 尽管我多次建议大家要认真看手册,要先注意和使用寄存器,总是有人反对。
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 谢谢马老师!您说的对。我也意识到不能浮躁,要沉下心去看资料。在昨晚我也找到了这几个寄存器,今天不用库直接设置寄存器看看。再次感谢马老师! 顶一下
页:
[1]