打印
[DemoCode下载]

NUC029的GPIO输入输出操作方法

[复制链接]
3274|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
gejigeji521|  楼主 | 2017-2-14 17:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/**************************************************************************//**
* [url=home.php?mod=space&uid=288409]@file[/url]     main.c
* [url=home.php?mod=space&uid=895143]@version[/url]  V3.00
* $Revision: 3 $
* $Date: 14/01/28 11:44a $
* [url=home.php?mod=space&uid=247401]@brief[/url]    NUC029 Series GPIO Driver Sample Code
*
* @note
* Copyright (C) 2013 Nuvoton Technology Corp. All rights reserved.
******************************************************************************/
#include <stdio.h>
#include "NUC029xAN.h"


#define PLL_CLOCK           50000000


void SYS_Init(void)
{
    /*---------------------------------------------------------------------------------------------------------*/
    /* Init System Clock                                                                                       */
    /*---------------------------------------------------------------------------------------------------------*/
    /* 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 PLL_CLOCK from PLL */
    CLK_SetCoreClock(PLL_CLOCK);

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

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

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

    /* Set P3 multi-function pins for UART0 RXD and TXD */
    SYS->P3_MFP &= ~(SYS_MFP_P30_Msk | SYS_MFP_P31_Msk);
    SYS->P3_MFP |= (SYS_MFP_P30_RXD0 | SYS_MFP_P31_TXD0);

}

void UART0_Init(void)
{
    /*---------------------------------------------------------------------------------------------------------*/
    /* Init UART                                                                                               */
    /*---------------------------------------------------------------------------------------------------------*/
    /* Reset UART */
    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("|    P1.2(Output) and P4.1(Input) Sample Code     |\n");
    printf("+-------------------------------------------------+\n\n");

    /* Configure P1.2 as Output mode and P4.1 as Input mode */
    GPIO_SetMode(P1, BIT2, GPIO_PMD_OUTPUT);
    GPIO_SetMode(P4, BIT1, GPIO_PMD_INPUT);

    i32Err = 0;
    printf("GPIO P1.2(output mode) connect to P4.1(input mode) ......");

    /* Use Pin Data Input/Output Control to pull specified I/O or get I/O pin status */
    P12 = 0;
    if(P41 != 0)
    {
        i32Err = 1;
    }

    P12 = 1;
    if(P41 != 1)
    {
        i32Err = 1;
    }

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

    /* Configure P1.2 and P4.1 to default Quasi-bidirectional mode */
    GPIO_SetMode(P1, BIT2, GPIO_PMD_QUASI);
    GPIO_SetMode(P4, BIT1, GPIO_PMD_QUASI);

    while(1);
}

/*** (C) COPYRIGHT 2013 Nuvoton Technology Corp. ***/


沙发
gejigeji521|  楼主 | 2017-2-14 18:07 | 只看该作者
  •   /* Set P3 multi-function pins for UART0 RXD and TXD */
  •     SYS->P3_MFP &= ~(SYS_MFP_P30_Msk | SYS_MFP_P31_Msk);
  •     SYS->P3_MFP |= (SYS_MFP_P30_RXD0 | SYS_MFP_P31_TXD0);
[size=12.6316px]_________________________________________________________________________________
[size=12.6316px]define SYS_MFP_P30_GPIO    0x00000000UL /*!< P3_MFP pin 0 setting for GPIO */
#define SYS_MFP_P30_RXD0    0x00000001UL /*!< P3_MFP pin 0 setting for RXD0 */
#define SYS_MFP_P30_CPN1    0x00000100UL /*!< P3_MFP pin 0 setting for CPN1 */
#define SYS_MFP_P30_ACMP1_N 0x00000100UL /*!< P3_MFP pin 0 setting for ACMP1_N */
#define SYS_MFP_P30_Msk     0x00000101UL /*!< P3_MFP pin 0 mask             */

#define SYS_MFP_P31_GPIO    0x00000000UL /*!< P3_MFP pin 1 setting for GPIO */
#define SYS_MFP_P31_TXD0    0x00000002UL /*!< P3_MFP pin 1 setting for TXD0 */
#define SYS_MFP_P31_CPP1    0x00000200UL /*!< P3_MFP pin 1 setting for CPP1 */
#define SYS_MFP_P31_ACMP1_P 0x00000200UL /*!< P3_MFP pin 1 setting for ACMP1_P */
#define SYS_MFP_P31_Msk     0x00000202UL /*!< P3_MFP pin 1 mask             */

关于第一条那个操作是什么意思,谁知道?


使用特权

评论回复
板凳
gejigeji521|  楼主 | 2017-2-14 18:11 | 只看该作者
因此我觉得如果这么操作其实还是跟使用库操作的定位有点不符合。

使用特权

评论回复
地板
gejigeji521|  楼主 | 2017-2-14 18:12 | 只看该作者
NUC029系列为Cortex-M0 32位微控制器系列,其特点为宽电压工作范围 2.5V 至 5.5V与-40℃ ~ 105℃工作温度、内建22.1184 MHz 高精度RC晶振(±3%精确度, 2.5V 至 5.5V, -40℃ ~ 105℃)与硬件除法器、并内建Data Flash、欠压检测、丰富外设、整合多种多组串行传输接口、高抗干扰能力 (8KV ESD/4KV EFT)、支持在线系统更新(ISP)、在线电路更新(ICP)与在线应用程序更新(IAP),提供封装有NUC029FAE TSSOP20、NUC029TAN QFN33 (4mm*4mm) 与NUC029LAN LQFP48。
应用领域 :
门禁系统/警报器、温度传感设备、直流无刷马达应用等。
关键特性 :
• 内核(Core)
- Cortex™-M0 32位微处理器
- 工作频率可达 50 MHz
- 工作电压:2.5V to 5.5V
- 工作温度:-40℃ ~ 105℃
• 内存(Memory)
- 最大64 kB应用程序
- 内嵌4 KB SRAM
- 内嵌4 kB Data Flash
- 在线系统更新ISP
  (In-System Programming)
- 在线电路更新ICP
  (In-Circuit Programming)
- 在线应用程序更新 IAP
  (In-Application Programming)
• 模拟转数字转换器(ADC)
- 提供8通道
- 最多12位10位分辨率
- 每秒采样率可达 800kSPS
- PWM输出可以触发A/D转换
- 提供误差±1℃温度传感器
• 脉波宽度调变(PWM)
- 最多8通道PWM输出或互补式PWM输出
- PWM时间与周期可触发A/D转换
• 通讯接口(Connectivity)
- 提供最多二组SPI
- 提供最多二组I²C
- 提供最多二组UART
- 提供一组16/8位外扩接口(EBI)
• 时钟控制(Clock control)
- 外部晶振4 to 24MHz
- 内置22.1184 MHz 高精度RC晶振,
  常温5V下±1%误差

使用特权

评论回复
5
稳稳の幸福| | 2017-2-14 21:47 | 只看该作者

    /* 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);
这个是0518的串口管脚功能选择的配置,仔细看,跟那个029的类似,如果搞不清就死记住就行了。

使用特权

评论回复
6
稳稳の幸福| | 2017-2-14 21:58 | 只看该作者
根据我查看各种例程,需要这种寄存器配置的地方,无非就是这些管脚的功能选择的时候。

使用特权

评论回复
7
yiyigirl2014| | 2017-2-15 15:16 | 只看该作者
那个操作寄存器的两行,应该跟手册里描述的使用方法有关系。

使用特权

评论回复
8
gejigeji521|  楼主 | 2017-2-20 00:07 | 只看该作者
一些都要根据用户手册的说明为主,那些寄存器通过库函数操作的也是根据昂写的。

使用特权

评论回复
9
yiyigirl2014| | 2017-2-20 00:09 | 只看该作者
通过宏定义的时钟频率,可以让其他调用时钟的地方知道定义了多少

使用特权

评论回复
10
天灵灵地灵灵| | 2017-2-20 00:18 | 只看该作者
新唐的IO用起来比较简单没有STM32的那种繁琐。

使用特权

评论回复
11
iwqt1983| | 2017-2-20 13:04 | 只看该作者
本帖最后由 iwqt1983 于 2017-2-20 13:06 编辑

NUC029LAN我也在使用,真心不错,与新唐的M0516,M058是硬件软件都兼容的,并且价格更低,性能更好。
http://club.szlcsc.com/article/details_1965_1.html这里的资料更多些。

使用特权

评论回复
12
稳稳の幸福| | 2017-2-20 16:22 | 只看该作者
数据手册我还是喜欢去官方下载中文版的。

使用特权

评论回复
13
稳稳の幸福| | 2017-2-20 17:42 | 只看该作者
    /* Enable UART module clock */
    CLK_EnableModuleClock(UART0_MODULE);

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

使用特权

评论回复
14
iwqt1983| | 2017-2-22 13:22 | 只看该作者
NUC029LAN 不错的,是用来代替M0516,M058,工艺更先进,价格更有优势。表扬下NUC029LAN

使用特权

评论回复
15
dongnanxibei| | 2017-2-22 13:50 | 只看该作者
准双向模式没有给出如何用,用于干什么。

使用特权

评论回复
16
lss1985| | 2017-5-28 17:08 | 只看该作者
gejigeji521 发表于 2017-2-14 18:07
  •   /* Set P3 multi-function pins for UART0 RXD and TXD */
  •     SYS->P3_MFP &= ~(SYS_MFP_P30_Msk ...

  • 第一条像是清零吧
    另外问下GPIO设置为输入时NUC029是低电平吧,怎么做按键啊

    使用特权

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

    本版积分规则

    172

    主题

    2193

    帖子

    8

    粉丝