打印
[NUC120]

请教nuc120串口不使用流控时,RTS和CTS是否作为GPIO使用?

[复制链接]
3651|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wajlh|  楼主 | 2013-3-9 16:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近做了一个控制电路,使用nuc120作为主控,画PCB时想当然的认为,不使用串口的流控功能时,RTS可以作为GPIO使用。于是在RTS0引脚接了一个DS18B20,调试的时候怎么也调试不通。后来飞线换了个IO就能行了。看了下手册没有提到这个问题。不想重新画PCB了。特发帖求助,RTS和CTS能否作为GPIO使用。

相关帖子

沙发
呆板书生| | 2013-3-9 20:40 | 只看该作者
当然可以,我试过,

不过你先去改改新塘提供的驱动库,

使用特权

评论回复
板凳
wajlh|  楼主 | 2013-3-9 23:41 | 只看该作者
呆板书生 发表于 2013-3-9 20:40
当然可以,我试过,

不过你先去改改新塘提供的驱动库,

您好,可以详细说下改什么地方么?谢谢
我试了加了下面的两句       
UART0->IER.AUTO_CTS_EN                = 0;
UART0->IER.AUTO_RTS_EN                = 0;
没什么效果。分析了一下库函数,没有发现有操作CTS和RTS管脚的地方。

使用特权

评论回复
地板
呆板书生| | 2013-3-10 18:15 | 只看该作者
在open 语句中,

使用特权

评论回复
5
呆板书生| | 2013-3-10 18:21 | 只看该作者
有了,


在库函数中,
int32_t DrvGPIO_InitFunction(E_DRVGPIO_FUNC function)

这样修改
case E_FUNC_UART0:
{
      //outpw(&SYS->GPBMFP, inpw(&SYS->GPBMFP) | (0xF<<0));---->这句使用RTS和CTS
        outpw(&SYS->GPBMFP, inpw(&SYS->GPBMFP) | (0x3<<0));---->这句是不使用RTS和CTS
}break;

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
wajlh + 1 很给力!
6
缥缈九哥| | 2013-3-10 22:10 | 只看该作者
自己选择不同的配置。

使用特权

评论回复
7
wajlh|  楼主 | 2013-3-10 22:59 | 只看该作者
呆板书生 发表于 2013-3-10 18:21
有了,

谢谢您了,我跟您的方法没有配置成功。但是根据您的思路,在串口初始化的时候增加了下面的两句就可以了。
        SYS->GPBMFP. UART0_nRTS_nWRL= 0;        //禁用RTS0
        SYS->GPBMFP. UART0_nCTS_nWRH= 0;        //禁用CTS0

使用特权

评论回复
8
wajlh|  楼主 | 2013-3-10 23:04 | 只看该作者
缥缈九哥 发表于 2013-3-10 22:10
自己选择不同的配置。

谢谢 九哥回复。因为刚刚开始使用芯唐的芯片。还不是很熟悉。基本上是都是一边看库函数一边写程序,所以库函数里没有的东西,就不太会用了。

使用特权

评论回复
9
缥缈九哥| | 2013-3-14 01:35 | 只看该作者
M0的应用,要有C基础,电子电路基础,单片机原理,其它就是看BSP足够了。再附加用TRM去辅助阅读。当然要有一个有些悟性的脑子 。不要死板。

使用特权

评论回复
10
a2999434| | 2014-5-5 17:05 | 只看该作者
_GPIO_SET_PIN_MODE(引脚名,引脚号 , GPIO_PMD_INPUT);
貌似这个也可以把

使用特权

评论回复
11
eyancool| | 2014-7-3 16:58 | 只看该作者
                case E_FUNC_UART0:
                case E_FUNC_UART0_RX_TX:
                case E_FUNC_UART0_RTS_CTS:
                case E_FUNC_UART1:
                case E_FUNC_UART1_RX_TX:
                case E_FUNC_UART1_RTS_CTS:
                {
            if ((function >= E_FUNC_UART0) && (function <= E_FUNC_UART0_RTS_CTS))
                u8Offset = 0;
            else
                u8Offset = 4;                                 
            if ((function == E_FUNC_UART0) || (function == E_FUNC_UART1))
                  {
                outpw(&SYS->GPBMFP, inpw(&SYS->GPBMFP) | (0xF<<(0+u8Offset)));
                              outpw(&SYS->ALTMFP, inpw(&SYS->ALTMFP) & ~(0x1<<11));
            }else
            if ((function == E_FUNC_UART0_RX_TX) || (function == E_FUNC_UART1_RX_TX))//这一句的意思就是只用TX,RX为串口收发,CTS,RTS不使用。
            {
                outpw(&SYS->GPBMFP, inpw(&SYS->GPBMFP) | (0x3<<(0+u8Offset)));
            }else
            if ((function == E_FUNC_UART0_RTS_CTS) || (function == E_FUNC_UART1_RTS_CTS))
            {
                outpw(&SYS->GPBMFP, inpw(&SYS->GPBMFP) | (0x3<<(2+u8Offset)));
                              outpw(&SYS->ALTMFP, inpw(&SYS->ALTMFP) & ~(0x1<<11));
            }
                }break;
在串口初始化里面设置成
void UART1_Init()
{
    STR_UART_T UartParam;
   // E_DRVGPIO_FUNC FuncNum = E_FUNC_UART1;
    E_UART_PORT UartNum = UART_PORT1;

    /* Uart Pin Config */
    DrvGPIO_InitFunction(E_FUNC_UART1_RX_TX);

    /* Uart Config */
    UartParam.u32BaudRate = 921600;
    UartParam.u8cDataBits = DRVUART_DATABITS_8;
    UartParam.u8cStopBits = DRVUART_STOPBITS_1;
    UartParam.u8cParity = DRVUART_PARITY_NONE;
    UartParam.u8cRxTriggerLevel = DRVUART_FIFO_1BYTES;
    UartParam.u8TimeOut = 0;
    /* Uart Open */
    DrvUART_Open(UartNum, &UartParam);
    /* Enable the Uart function */
    DrvUART_EnableInt(UartNum, DRVUART_RDAINT, UART1_Callbackfn);
}
CTS,RST就可以当普通I/0使用。

使用特权

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

本版积分规则

3

主题

42

帖子

0

粉丝