打印
[DemoCode下载]

新唐M0的准双向

[复制链接]
1568|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
dongnanxibei|  楼主 | 2018-12-26 22:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/**************************************************************************//**
* [url=home.php?mod=space&uid=288409]@file[/url]     main.c
* [url=home.php?mod=space&uid=895143]@version[/url]  V3.00
* $Revision: 8 $
* $Date: 15/07/02 11:18a $
* [url=home.php?mod=space&uid=247401]@brief[/url]    Demonstrate how to set GPIO pin mode and use pin data input/output control.
* @note
* Copyright (C) 2014~2015 Nuvoton Technology Corp. All rights reserved.
******************************************************************************/
#include <stdio.h>
#include "NUC123.h"


#define HCLK_CLOCK           72000000


void SYS_Init(void)
{
    /*---------------------------------------------------------------------------------------------------------*/
    /* Init System Clock                                                                                       */
    /*---------------------------------------------------------------------------------------------------------*/

    /* Enable XT1_OUT(PF0) and XT1_IN(PF1) */
    SYS->GPF_MFP |= SYS_GPF_MFP_PF0_XT1_OUT | SYS_GPF_MFP_PF1_XT1_IN;

    /* Enable Internal RC 22.1184MHz clock */
    CLK_EnableXtalRC(CLK_PWRCON_OSC22M_EN_Msk);

    /* Waiting for Internal RC clock ready */
    CLK_WaitClockReady(CLK_CLKSTATUS_OSC22M_STB_Msk);

    /* Switch HCLK clock source to Internal RC and HCLK source divide 1 */
    CLK_SetHCLK(CLK_CLKSEL0_HCLK_S_HIRC, CLK_CLKDIV_HCLK(1));

    /* Enable external XTAL 12MHz clock */
    CLK_EnableXtalRC(CLK_PWRCON_XTL12M_EN_Msk);

    /* Waiting for external XTAL clock ready */
    CLK_WaitClockReady(CLK_CLKSTATUS_XTL12M_STB_Msk);

    /* Set core clock as HCLK_CLOCK */
    CLK_SetCoreClock(HCLK_CLOCK);

    /* Enable UART module clock */
    CLK_EnableModuleClock(UART0_MODULE);

    /* Select UART module clock source */
    CLK_SetModuleClock(UART0_MODULE, CLK_CLKSEL1_UART_S_HXT, CLK_CLKDIV_UART(1));

    /*---------------------------------------------------------------------------------------------------------*/
    /* Init I/O Multi-function                                                                                 */
    /*---------------------------------------------------------------------------------------------------------*/

    /* Set GPB multi-function pins for UART0 RXD(PB.0) and TXD(PB.1) */
    SYS->GPB_MFP &= ~(SYS_GPB_MFP_PB0_Msk | SYS_GPB_MFP_PB1_Msk);
    SYS->GPB_MFP |= (SYS_GPB_MFP_PB0_UART0_RXD | SYS_GPB_MFP_PB1_UART0_TXD);

}

void UART0_Init()
{
    /*---------------------------------------------------------------------------------------------------------*/
    /* Init UART                                                                                               */
    /*---------------------------------------------------------------------------------------------------------*/
    /* Reset UART0 module */
    SYS_ResetModule(UART0_RST);

    /* Configure UART0 and set UART0 Baudrate */
    UART_Open(UART0, 115200);
}

/*---------------------------------------------------------------------------------------------------------*/
/* MAIN function                                                                                           */
/*---------------------------------------------------------------------------------------------------------*/
int main(void)
{
    int32_t i32Err;

    /* Unlock protected registers */
    SYS_UnlockReg();

    /* Init System, peripheral clock and multi-function I/O */
    SYS_Init();

    /* Lock protected registers */
    SYS_LockReg();

    /* Init UART0 for printf */
    UART0_Init();

    printf("\n\nCPU [url=home.php?mod=space&uid=72445]@[/url] %d Hz\n", SystemCoreClock);
    printf("+-------------------------------------------------+\n");
    printf("|    PB.4(Output) and PC.9(Input) Sample Code     |\n");
    printf("+-------------------------------------------------+\n\n");

    /* Configure PB.4 as Output mode and PC.9 as Input mode */
    GPIO_SetMode(PB, BIT4, GPIO_PMD_OUTPUT);
    GPIO_SetMode(PC, BIT9, GPIO_PMD_INPUT);

    i32Err = 0;
    printf("GPIO PB.4(output mode) connect to PC.9(input mode) ......");

    /* Use Pin Data Input/Output Control to pull specified I/O or get I/O pin status */
    /* Pull PB.4 to Low and check PC.9 status */
    PB4 = 0;
    if(PC9 != 0)
    {
        i32Err = 1;
    }

    /* Pull PB.4 to High and check PC.9 status */
    PB4 = 1;
    if(PC9 != 1)
    {
        i32Err = 1;
    }

    if(i32Err)
    {
        printf("  [FAIL].\n");
    }
    else
    {
        printf("  [OK].\n");
    }

    /* Configure PB.4 and PC.9 to default Quasi-bidirectional mode */
    GPIO_SetMode(PB, BIT4, GPIO_PMD_QUASI);
    GPIO_SetMode(PC, BIT9, GPIO_PMD_QUASI);

    while(1);
}

/*** (C) COPYRIGHT 2014~2015 Nuvoton Technology Corp. ***/


沙发
dongnanxibei|  楼主 | 2018-12-26 22:45 | 只看该作者
我们可以看出是有设置为准双向模式,那么怎么使用呢?
    PB4 = 0;
    if(PC9 != 0)

这里两句,第一个是输出,直接就像51那样。
而第二句,比较是不是低电平,属于读。
这就是相当于51那种准双向。
这个模式有个好处,用于与外设模块通信方便。

使用特权

评论回复
板凳
dongnanxibei|  楼主 | 2018-12-26 22:53 | 只看该作者
遇到那种需要时序通信,既需要写,又需要读的通信时序,就可以用这个模式。

使用特权

评论回复
地板
zhuomuniao110| | 2018-12-26 23:19 | 只看该作者
对,每种模式都有自己适合的场景。

使用特权

评论回复
5
dongliushui| | 2018-12-27 11:30 | 只看该作者
终于看明白怎么用准双向了。

使用特权

评论回复
6
wanduzi| | 2018-12-30 18:54 | 只看该作者
这个模式可以很好的做IO的时序操作。

使用特权

评论回复
7
yiy| | 2018-12-30 19:46 | 只看该作者
读写全用端口操作了。

使用特权

评论回复
8
yiy| | 2018-12-30 19:46 | 只看该作者
PB4
PC9
直接使用这种端口的名字。

使用特权

评论回复
9
huangcunxiake| | 2018-12-31 18:22 | 只看该作者
M4的IO也继承了这个特性

使用特权

评论回复
10
renzheshengui| | 2019-1-8 11:51 | 只看该作者
准双向是指的哪种方式啊

使用特权

评论回复
11
dongnanxibei|  楼主 | 2019-1-8 12:58 | 只看该作者
renzheshengui 发表于 2019-1-8 11:51
准双向是指的哪种方式啊

你用过51单片机吗?传统的51单片机就是准双向接口。比如端口P00
你可以输出这么写:
P00=1;
同时你可以接着再读这个端口的电平
if(P00)  i=1;

使用特权

评论回复
12
li880wert| | 2019-1-8 17:42 | 只看该作者
哪里双准向了,我只看到 PB4为输出,PC9为读入。 双准向应该是 即可以输出,又可以读入,像常用的IO 模拟I2C 的SDA线。

使用特权

评论回复
13
renzheshengui| | 2019-2-1 16:18 | 只看该作者
dongnanxibei 发表于 2019-1-8 12:58
你用过51单片机吗?传统的51单片机就是准双向接口。比如端口P00
你可以输出这么写:
P00=1;

看着操作很便捷啊

使用特权

评论回复
14
dongnanxibei|  楼主 | 2019-2-11 10:32 | 只看该作者
li880wert 发表于 2019-1-8 17:42
哪里双准向了,我只看到 PB4为输出,PC9为读入。 双准向应该是 即可以输出,又可以读入,像常用的IO 模拟I2 ...

这两个端口设置的模式一致,分别测试了读和写。

使用特权

评论回复
评论
li880wert 2019-2-21 08:17 回复TA
这不叫准方向吗,任何一个单片机IO 都有这功能,像你设置 PC9 为输入状态,就能检测到高低电平。 我认为的是双准向是即可以 做为 输入-->检测高低电平,又能做为输出-->对外输出高低电平,而不用改变模式。你这就是一个PB.4做输出,一个PC.9做检 输入检测 
15
antusheng| | 2019-2-21 16:50 | 只看该作者
这个因为是增强型号的,设置了模式实现了准双向,也算。

使用特权

评论回复
16
qiangtech| | 2019-2-22 14:21 | 只看该作者
这样操作是方便很多了,不用临时去改变模式。

使用特权

评论回复
17
yiyigirl2014| | 2019-2-22 17:03 | 只看该作者
以前刚学时候觉得这搞的很复杂,现在顺手了,觉得真科学。

使用特权

评论回复
18
yiy| | 2019-2-22 22:36 | 只看该作者
这个模式还是非常适用于跟外设备通信的。

使用特权

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

本版积分规则

201

主题

3587

帖子

16

粉丝