打印
[DemoCode下载]

IO口操作

[复制链接]
409|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jiekou001|  楼主 | 2019-12-13 22:27 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
IO, ck, TE, se, UART
/**************************************************************************//**
* [url=home.php?mod=space&uid=288409]@file[/url]     main.c
* [url=home.php?mod=space&uid=895143]@version[/url]  V3.00
* $Revision: 5 $
* $Date: 15/02/06 10:22a $
* [url=home.php?mod=space&uid=247401]@brief[/url]    Show how to set GPIO pin mode and use pin dataoutput control.
* @note
* Copyright (C) 2013 Nuvoton Technology Corp. All rights reserved.
******************************************************************************/
#include <stdio.h>
#include "M058S.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_RXD | SYS_MFP_P31_TXD);

}

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

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

/*---------------------------------------------------------------------------------------------------------*/
/* MAIN function                                                                                           */
/*---------------------------------------------------------------------------------------------------------*/
int main(void)
{


    /* 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("|    P3.6(Output) Sample Code    |\n");
    printf("+-------------------------------------------------------------------------------+\n\n");

    /*-----------------------------------------------------------------------------------------------------*/
    /* GPIO Basic Mode Test --- Use Pin Data Input/Output to control GPIO pin                              */
    /*-----------------------------------------------------------------------------------------------------*/


    /* Configure P1.6 as Output mode  */
    GPIO_SetMode(P3,BIT6, GPIO_PMD_OUTPUT);
while(1)
  {
          GPIO_SET_OUT_DATA(P3, 0xff);
                CLK_SysTickDelay(500000);
          GPIO_SET_OUT_DATA(P3, 0x00);
                CLK_SysTickDelay(500000);
        }

}

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


使用特权

评论回复
沙发
捉虫天师| | 2019-12-13 22:28 | 只看该作者
#define GPIO_SET_OUT_DATA(port, u32Data)    ((port)->DOUT = (u32Data))

使用特权

评论回复
板凳
捉虫天师| | 2019-12-13 22:28 | 只看该作者
使用这个就行了,就可以直接操作8个端口。1个端口,多个端口。

使用特权

评论回复
地板
捉虫天师| | 2019-12-13 22:29 | 只看该作者
GPIO_SET_OUT_DATA(port, u32Data)
可以这么用
GPIO_SET_OUT_DATA(P3, BIT6)
GPIO_SET_OUT_DATA(P3, BIT6|BIT1|BIT2)
或者直接写数据,比如全部端口输出1
GPIO_SET_OUT_DATA(P3, 0xFF)

使用特权

评论回复
5
捉虫天师| | 2019-12-13 22:30 | 只看该作者
GPIO_SET_OUT_DATA(P3, 0x00)
就是全部输出0

使用特权

评论回复
6
捉虫天师| | 2019-12-13 22:31 | 只看该作者

使用特权

评论回复
7
捉虫天师| | 2019-12-13 22:32 | 只看该作者
效果非常不错,刚开始提示升级,按照提示升级就行了。

使用特权

评论回复
8
捉虫天师| | 2019-12-13 22:33 | 只看该作者

然后直接用P36也可以。

使用特权

评论回复
9
捉虫天师| | 2019-12-13 22:34 | 只看该作者

另外一定看清楚原理图的端口编号。

使用特权

评论回复
10
捉虫天师| | 2019-12-13 22:52 | 只看该作者

也可以这么操作IO。

使用特权

评论回复
11
捉虫天师| | 2019-12-13 22:52 | 只看该作者
这充分说明新唐的M0系列的IO操作起来跟51的IO一样容易,甚至更容易,更灵活。

使用特权

评论回复
12
jiekou001|  楼主 | 2019-12-14 09:37 | 只看该作者
/**************************************************************************//**
* @file     main.c
* @version  V3.00
* $Revision: 2 $
* $Date: 15/02/13 3:18p $
* @brief
*           A sample code for LED blanking.
*
* @note
* Copyright (C) 2015 Nuvoton Technology Corp. All rights reserved.
*
******************************************************************************/
#include <stdio.h>
#include "M058S.h"

#define PLLCON_SETTING  CLK_PLLCON_50MHz_HXT
#define PLL_CLOCK       50000000

void SYS_Init(void)
{

    /*---------------------------------------------------------------------------------------------------------*/
    /* Init System Clock                                                                                       */
    /*---------------------------------------------------------------------------------------------------------*/

    /* Enable Internal RC 22.1184MHz clock */
    CLK->PWRCON |= CLK_PWRCON_OSC22M_EN_Msk;

    /* Waiting for Internal RC clock ready */
    while(!(CLK->CLKSTATUS & CLK_CLKSTATUS_OSC22M_STB_Msk));

    /* Switch HCLK clock source to Internal RC and and HCLK source divide 1 */
    CLK->CLKSEL0 &= ~CLK_CLKSEL0_HCLK_S_Msk;
    CLK->CLKSEL0 |= CLK_CLKSEL0_HCLK_S_HIRC;
    CLK->CLKDIV &= ~CLK_CLKDIV_HCLK_N_Msk;
    CLK->CLKDIV |= CLK_CLKDIV_HCLK(1);

    /* Enable external XTAL 12MHz clock */
    CLK->PWRCON |= CLK_PWRCON_XTL12M_EN_Msk;

    /* Waiting for external XTAL clock ready */
    while(!(CLK->CLKSTATUS & CLK_CLKSTATUS_XTL12M_STB_Msk));

    /* Set core clock as PLL_CLOCK from PLL */
    CLK->PLLCON = PLLCON_SETTING;
    while(!(CLK->CLKSTATUS & CLK_CLKSTATUS_PLL_STB_Msk));
    CLK->CLKSEL0 &= (~CLK_CLKSEL0_HCLK_S_Msk);
    CLK->CLKSEL0 |= CLK_CLKSEL0_HCLK_S_PLL;

    /* Update System Core Clock */
    /* User can use SystemCoreClockUpdate() to calculate PllClock, SystemCoreClock and CycylesPerUs automatically. */
    //SystemCoreClockUpdate();
    PllClock        = PLL_CLOCK;            // PLL
    SystemCoreClock = PLL_CLOCK / 1;        // HCLK
    CyclesPerUs     = PLL_CLOCK / 1000000;  // For SYS_SysTickDelay()

    /* Enable UART module clock */
    CLK->APBCLK |= CLK_APBCLK_UART0_EN_Msk;

    /* Select UART module clock source */
    CLK->CLKSEL1 &= ~CLK_CLKSEL1_UART_S_Msk;
    CLK->CLKSEL1 |= CLK_CLKSEL1_UART_S_HXT;

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

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

}

void UART0_Init()
{
    /*---------------------------------------------------------------------------------------------------------*/
    /* Init UART                                                                                               */
    /*---------------------------------------------------------------------------------------------------------*/
    /* Reset UART0 */
    SYS->IPRSTC2 |=  SYS_IPRSTC2_UART0_RST_Msk;
    SYS->IPRSTC2 &= ~SYS_IPRSTC2_UART0_RST_Msk;

    /* Configure UART0 and set UART0 Baudrate */
    UART0->BAUD = UART_BAUD_MODE2 | UART_BAUD_MODE2_DIVIDER(__HXT, 115200);
    UART0->LCR = UART_WORD_LEN_8 | UART_PARITY_NONE | UART_STOP_BIT_1;
}

/*---------------------------------------------------------------------------------------------------------*/
/*  Main Function                                                                                          */
/*---------------------------------------------------------------------------------------------------------*/
int32_t main(void)
{
    int32_t i;
   
    /* 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 @ %dHz\n", SystemCoreClock);

    /*
        This sample code will blinking LED on NuTiny EVB board of M058SSAN.
        The I/O for LED is P2.3 or P3.6
    */

    printf("+---------------------------------------+\n");
    printf("|    NuTiny EVB LED Sample Code         |\n");
    printf("+---------------------------------------+\n");
   
    /* Init P2.3 and P3.6 to be output mode */
    P2->PMD = (P2->PMD & ~(0x3 << 2*3)) | (1 << 2*3);
    P3->PMD = (P3->PMD & ~(0x3 << 2*6)) | (1 << 2*6);
   
    while(1)
    {
        /* Toggle P2.3 */
        P23 ^= 1;
        
        /* Toggle P3.6 */
        P36 ^= 1;
        
        /* Delay 200ms */
        for(i=0;i<2;i++)
            CLK_SysTickDelay(100000);
    }
   
   
}

使用特权

评论回复
13
jiekou001|  楼主 | 2019-12-14 09:38 | 只看该作者
上面这个是基于寄存器配置的。

使用特权

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

本版积分规则

124

主题

1259

帖子

2

粉丝