[DemoCode下载] NUC029的GPIO输入输出操作方法

[复制链接]
3673|15
 楼主| gejigeji521 发表于 2017-2-14 17:19 | 显示全部楼层 |阅读模式
  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: 3 $
  5. * $Date: 14/01/28 11:44a $
  6. * [url=home.php?mod=space&uid=247401]@brief[/url]    NUC029 Series GPIO Driver Sample Code
  7. *
  8. * @note
  9. * Copyright (C) 2013 Nuvoton Technology Corp. All rights reserved.
  10. ******************************************************************************/
  11. #include <stdio.h>
  12. #include "NUC029xAN.h"


  13. #define PLL_CLOCK           50000000


  14. void SYS_Init(void)
  15. {
  16.     /*---------------------------------------------------------------------------------------------------------*/
  17.     /* Init System Clock                                                                                       */
  18.     /*---------------------------------------------------------------------------------------------------------*/
  19.     /* Enable Internal RC 22.1184MHz clock */
  20.     CLK_EnableXtalRC(CLK_PWRCON_OSC22M_EN_Msk);

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

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

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

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

  29.     /* Set core clock as PLL_CLOCK from PLL */
  30.     CLK_SetCoreClock(PLL_CLOCK);

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

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

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

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

  41. }

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

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

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

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

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

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

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

  66.     printf("\n\nCPU [url=home.php?mod=space&uid=72445]@[/url] %d Hz\n", SystemCoreClock);
  67.     printf("+-------------------------------------------------+\n");
  68.     printf("|    P1.2(Output) and P4.1(Input) Sample Code     |\n");
  69.     printf("+-------------------------------------------------+\n\n");

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

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

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

  81.     P12 = 1;
  82.     if(P41 != 1)
  83.     {
  84.         i32Err = 1;
  85.     }

  86.     if(i32Err)
  87.     {
  88.         printf("  [FAIL].\n");
  89.     }
  90.     else
  91.     {
  92.         printf("  [OK].\n");
  93.     }

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

  97.     while(1);
  98. }

  99. /*** (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);
_________________________________________________________________________________
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%误差
稳稳の幸福 发表于 2017-2-14 21:47 | 显示全部楼层

  1.     /* Set GPB multi-function pins for UART0 RXD(PB.0) and TXD(PB.1) */
  2.     SYS->GPB_MFP &= ~(SYS_GPB_MFP_PB0_Msk | SYS_GPB_MFP_PB1_Msk);
  3.     SYS->GPB_MFP |= (SYS_GPB_MFP_PB0_UART0_RXD | SYS_GPB_MFP_PB1_UART0_TXD);
这个是0518的串口管脚功能选择的配置,仔细看,跟那个029的类似,如果搞不清就死记住就行了。
稳稳の幸福 发表于 2017-2-14 21:58 | 显示全部楼层
根据我查看各种例程,需要这种寄存器配置的地方,无非就是这些管脚的功能选择的时候。
yiyigirl2014 发表于 2017-2-15 15:16 | 显示全部楼层
那个操作寄存器的两行,应该跟手册里描述的使用方法有关系。
 楼主| gejigeji521 发表于 2017-2-20 00:07 | 显示全部楼层
一些都要根据用户手册的说明为主,那些寄存器通过库函数操作的也是根据昂写的。
yiyigirl2014 发表于 2017-2-20 00:09 | 显示全部楼层
通过宏定义的时钟频率,可以让其他调用时钟的地方知道定义了多少
天灵灵地灵灵 发表于 2017-2-20 00:18 | 显示全部楼层
新唐的IO用起来比较简单没有STM32的那种繁琐。
iwqt1983 发表于 2017-2-20 13:04 | 显示全部楼层
本帖最后由 iwqt1983 于 2017-2-20 13:06 编辑

NUC029LAN我也在使用,真心不错,与新唐的M0516,M058是硬件软件都兼容的,并且价格更低,性能更好。
http://club.szlcsc.com/article/details_1965_1.html这里的资料更多些。
稳稳の幸福 发表于 2017-2-20 16:22 | 显示全部楼层
数据手册我还是喜欢去官方下载中文版的。
稳稳の幸福 发表于 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));
iwqt1983 发表于 2017-2-22 13:22 | 显示全部楼层
NUC029LAN 不错的,是用来代替M0516,M058,工艺更先进,价格更有优势。表扬下NUC029LAN
dongnanxibei 发表于 2017-2-22 13:50 | 显示全部楼层
准双向模式没有给出如何用,用于干什么。
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是低电平吧,怎么做按键啊
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    196

    主题

    2465

    帖子

    8

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