[DemoCode下载] 新唐M0的准双向

[复制链接]
562|18
 楼主 | 2018-12-26 22:43 | 显示全部楼层 |阅读模式
  1. /**************************************************************************//**
  2. * [url=home.php?mod=space&uid=288409]@file[/url]     main.c
  3. * [url=home.php?mod=space&uid=895143]@version[/url]  V3.00
  4. * $Revision: 8 $
  5. * $Date: 15/07/02 11:18a $
  6. * [url=home.php?mod=space&uid=247401]@brief[/url]    Demonstrate how to set GPIO pin mode and use pin data input/output control.
  7. * @note
  8. * Copyright (C) 2014~2015 Nuvoton Technology Corp. All rights reserved.
  9. ******************************************************************************/
  10. #include <stdio.h>
  11. #include "NUC123.h"


  12. #define HCLK_CLOCK           72000000


  13. void SYS_Init(void)
  14. {
  15.     /*---------------------------------------------------------------------------------------------------------*/
  16.     /* Init System Clock                                                                                       */
  17.     /*---------------------------------------------------------------------------------------------------------*/

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

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

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

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

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

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

  30.     /* Set core clock as HCLK_CLOCK */
  31.     CLK_SetCoreClock(HCLK_CLOCK);

  32.     /* Enable UART module clock */
  33.     CLK_EnableModuleClock(UART0_MODULE);

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

  36.     /*---------------------------------------------------------------------------------------------------------*/
  37.     /* Init I/O Multi-function                                                                                 */
  38.     /*---------------------------------------------------------------------------------------------------------*/

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

  42. }

  43. void UART0_Init()
  44. {
  45.     /*---------------------------------------------------------------------------------------------------------*/
  46.     /* Init UART                                                                                               */
  47.     /*---------------------------------------------------------------------------------------------------------*/
  48.     /* Reset UART0 module */
  49.     SYS_ResetModule(UART0_RST);

  50.     /* Configure UART0 and set UART0 Baudrate */
  51.     UART_Open(UART0, 115200);
  52. }

  53. /*---------------------------------------------------------------------------------------------------------*/
  54. /* MAIN function                                                                                           */
  55. /*---------------------------------------------------------------------------------------------------------*/
  56. int main(void)
  57. {
  58.     int32_t i32Err;

  59.     /* Unlock protected registers */
  60.     SYS_UnlockReg();

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

  63.     /* Lock protected registers */
  64.     SYS_LockReg();

  65.     /* Init UART0 for printf */
  66.     UART0_Init();

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

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

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

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

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

  89.     if(i32Err)
  90.     {
  91.         printf("  [FAIL].\n");
  92.     }
  93.     else
  94.     {
  95.         printf("  [OK].\n");
  96.     }

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

  100.     while(1);
  101. }

  102. /*** (C) COPYRIGHT 2014~2015 Nuvoton Technology Corp. ***/
复制代码


 楼主 | 2018-12-26 22:45 | 显示全部楼层
我们可以看出是有设置为准双向模式,那么怎么使用呢?
    PB4 = 0;
    if(PC9 != 0)

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

使用特权

评论回复
 楼主 | 2018-12-26 22:53 | 显示全部楼层
遇到那种需要时序通信,既需要写,又需要读的通信时序,就可以用这个模式。

使用特权

评论回复
| 2018-12-26 23:19 | 显示全部楼层
对,每种模式都有自己适合的场景。

使用特权

评论回复
| 2018-12-27 11:30 | 显示全部楼层
终于看明白怎么用准双向了。

使用特权

评论回复
| 2018-12-30 18:54 | 显示全部楼层
这个模式可以很好的做IO的时序操作。

使用特权

评论回复
| 2018-12-30 19:46 | 显示全部楼层
读写全用端口操作了。

使用特权

评论回复
| 2018-12-30 19:46 | 显示全部楼层
PB4
PC9
直接使用这种端口的名字。

使用特权

评论回复
| 2018-12-31 18:22 | 显示全部楼层
M4的IO也继承了这个特性

使用特权

评论回复
| 2019-1-8 11:51 | 显示全部楼层
准双向是指的哪种方式啊

使用特权

评论回复
 楼主 | 2019-1-8 12:58 | 显示全部楼层
renzheshengui 发表于 2019-1-8 11:51
准双向是指的哪种方式啊

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

使用特权

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

使用特权

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

看着操作很便捷啊

使用特权

评论回复
 楼主 | 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做检 输入检测 
| 2019-2-21 16:50 | 显示全部楼层
这个因为是增强型号的,设置了模式实现了准双向,也算。

使用特权

评论回复
| 2019-2-22 14:21 | 显示全部楼层
这样操作是方便很多了,不用临时去改变模式。

使用特权

评论回复
| 2019-2-22 17:03 | 显示全部楼层
以前刚学时候觉得这搞的很复杂,现在顺手了,觉得真科学。

使用特权

评论回复
| 2019-2-22 22:36 | 显示全部楼层
这个模式还是非常适用于跟外设备通信的。

使用特权

评论回复
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 投诉建议 创建版块 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

在线客服 快速回复 返回顶部 返回列表