打印
[新手园地]

HOT大叔NUC120助学板第三贴----GPIO小练

[复制链接]
6013|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Swallow_0322|  楼主 | 2011-3-27 15:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 Swallow_0322 于 2011-3-30 16:40 编辑
/*Cortex M0学习断断续续,抽空玩下GPIO,利用下助学板上的LED_1~4及KEY1~2,单片机菜鸟,望各位不吝赐教!*/
/**************************************************
** 文件名称:NUC120_HOT_GPIO.c
** 文件说明:NUC120助学板练习程序
** 创建日期:2011-03-27
** 修改日期:
** 备    注:GPIO输入输出及中断程序
             LED_1与LED_2交替闪烁
             KEY_1下降沿中断 LED_3取反
             KEY_2按下即为低电平 LED_4亮
                  弹起即为高电平 LED_4灭
**************************************************/
#include <stdio.h>
#include "NUC1xx.h"
#include "Driver\DrvGPIO.h"
#include "Driver\DrvSYS.h"
#include "Driver\DrvUART.h"


/***************
**  函数声明  **
***************/
void Init_System (void);
void Init_Uart (void);
void Init_GPIO (void);
void delay_loop(void);
void LED_FLASH (void);
void INPUT_CHARGE (void);


/*****************************
** Name:      EINT0Callback
** Function:  EINT0中断服务函数
** Input:     None
** OutPut:    None
** Data:      2011-03-27
** Note:      
****************************/
void EINT0Callback(void)
{
    printf("EINT0 Interrupt!\n");
   
    /* Toggle LED (GPA4) */
    //outpw((uint32_t)&GPIOA->DOUT, inpw((uint32_t)&GPIOA->IN) ^ (1 << 4));   //与下面if else语句相同功能
    if (DrvGPIO_GetBit(E_GPA,4))
                DrvGPIO_ClrBit(E_GPA,4);
        else
                DrvGPIO_SetBit(E_GPA,4);
}

/*****************************
** Name:      delay_loop
** Function:  软件延时函数
** Input:     None
** OutPut:    None
** Data:      2011-03-27
** Note:      
****************************/
void delay_loop(void)
{
        uint32_t j;
        for(j=0;j<60000;j++)
                INPUT_CHARGE();
}

/*****************************
** Name:      Init_System
** Function:  系统初始化函数
** Input:      None
** OutPut:     None
** Data:       2011-03-17
** Note:      
****************************/
void Init_System(void)
{
        /* Unlock the locked registers before access */
    UNLOCKREG();        //寄存器锁定键地址寄存器(RegLockAddr) :有些系统控制寄存器需要被保护起来,以防止误操作而影响芯片运行,
                                    //这些寄存器在上电复位到用户解锁定之前是锁定的。用户可以连续依次写入“59h”, “16h” “88h”到0x5000_0100解锁定.
        /* Enable the 12MHz oscillator oscillation */
        DrvSYS_SetOscCtrl(E_SYS_XTL12M, 1);                                                                //SYSCLK->WRCON.XTL12M_EN = 1;

        /* Waiting for 12M Xtal stable */
        //while (DrvSYS_GetChipClockSourceStatus(E_SYS_XTL12M) != 1);                //SYSCLK->CLKSTATUS.XTL12M_STB
        /*eClkSrc  - [in]  E_SYS_XTL12M / E_SYS_XTL32K / E_SYS_OSC22M / E_SYS_OSC10K / E_SYS_PLL    */
        // Note: Only some of NuMicro NUC100 Series support this function.

        DrvSYS_Delay(5000);
        LOCKREG();
        //向“0x5000_0100”写入任何值,就可以重锁保护寄存器
}

/*****************************
** Name:      Init_Uart
** Function:  UART初始化函数
** Input:      None
** OutPut:     None
** Data:       2011-03-17
** Note:      
****************************/
void Init_Uart(void)
{
        STR_UART_T param;
        /*
        声明 UART设置的结构体 位于DRVUART.H
        结构体如下
        typedef struct DRVUART_STRUCT
        {
                uint32_t            u32BaudRate;                        
                E_DATABITS_SETTINS  u8cDataBits;                        
                E_STOPBITS_SETTINS  u8cStopBits;                        
                E_PARITY_SETTINS         u8cParity;                                 
                E_FIFO_SETTINGS     u8cRxTriggerLevel;                 
                uint8_t             u8TimeOut ;                                 
      }STR_UART_T;
        */
        DrvSYS_SelectIPClockSource(E_SYS_UART_CLKSRC,0);                    //使能UART时钟
        //SYSCLK->CLKSEL1.UART_S = 0;                //UART时钟源选择. 00 =外部12MHz 晶振 01 = PLL 1x =内部 22MHz 振荡器

        DrvGPIO_InitFunction(E_FUNC_UART0);                                                    //GPB_MFP0-1-2-3置位 GPIO使能UART功能
        //outpw(&SYS->GPBMFP, inpw(&SYS->GPBMFP) | (0xF<<0));

        param.u32BaudRate        = 115200;                                                        //         波特率
        param.u8cDataBits        = DRVUART_DATABITS_8;                                //         数据位
        param.u8cStopBits        = DRVUART_STOPBITS_1;                                //         停止位
        param.u8cParity          = DRVUART_PARITY_NONE;                                //         校验位
        param.u8cRxTriggerLevel  = DRVUART_FIFO_1BYTES;                                //         FIFO存储深度 1 字节
        param.u8TimeOut                 = 0;                                                                //         FIFO超时设定
        /* Set UART Configuration */
        if(DrvUART_Open(UART_PORT0,¶m) != E_SUCCESS)                        //         串口开启、结构体整体赋值
                printf("UART0 open failed\n");                                                
        /* u32Port -[in] UART Channel:  UART_PORT0 / UART_PORT1 /UART_PORT2        */
        /* sParam  -[in] the struct parameter to configure UART                         */   
}

/*****************************
** Name:      Init_GPIO
** Function:  GPIO初始化函数
** Input:     None
** OutPut:    None
** Data:      2011-03-27
** Note:      
****************************/
void Init_GPIO (void)
{
        /*set GPI0 output*/
        DrvGPIO_Open(E_GPA,2, E_IO_OUTPUT);                                //  设置GPA2端口为输出模式 连接LED_1
        DrvGPIO_Open(E_GPA,3, E_IO_OUTPUT);                                //  设置GPA3端口为输出模式 连接LED_2
        DrvGPIO_Open(E_GPA,4, E_IO_OUTPUT);                                //  设置GPA4端口为输出模式 连接LED_3
        DrvGPIO_Open(E_GPA,5, E_IO_OUTPUT);                                //  设置GPA5端口为输出模式 连接LED_4
        DrvGPIO_Open(E_GPB,14,E_IO_INPUT);                                //  设置GPB14端口为输入模式 连接按KEY1
        DrvGPIO_Open(E_GPB,15,E_IO_INPUT);                                //  设置GPB15端口为输入模式 连接按KEY2
        /*         port - [in]    E_DRVGPIO_PORT, specify GPIO port. It could be E_GPA, E_GPB, E_GPC, E_GPD and E_GPE.                                   */
    /*    i32Bit - [in]  Specify pin of the GPIO port. It could be 0~15.                                                                        */
        /*        mode - [in]    E_DRVGPIO_IO, set the specified GPIO pin to be E_IO_INPUT, E_IO_OUTPUT,E_IO_OPENDRAIN or E_IO_QUASI mode.*/

        /* Configure external interrupt */
    DrvGPIO_InitFunction(E_FUNC_EXTINT0);
        /* Parameter:                                                                                                                                   */        
        /*                    function - [in]                                                                          */
        /*                  E_DRVGPIO_FUNC, specified the relative GPIO pins as special function pins.             */
        /*                  It could be :                                                                          */
        /*                              E_FUNC_GPIO                                                                */
        /*                              E_FUNC_CLKO                                                                */
        /*                              E_FUNC_I2C0 / E_FUNC_I2C1                                                  */
        /*                              E_FUNC_I2S                                                                 */
        /*                              E_FUNC_CAN0                                                                */
        /*                              E_FUNC_ACMP0 / E_FUNC_ACMP1                                                */
        /*                              E_FUNC_SPI0 /E_ FUNC_SPI1 / E_FUNC_SPI2 / E_FUNC_SPI3 /                    */
        /*                              E_FUNC_ADC0 / E_FUNC_ADC1 / E_FUNC_ADC2 / E_FUNC_ADC3 /                             */
        /*                                                                E_FUNC_ADC4 / E_FUNC_ADC5 / E_FUNC_ADC6 / E_FUNC_ADC7         */
        /*                              E_FUNC_EXTINT0 / E_FUNC_EXTINT1                                            */
        /*                              E_FUNC_TMR0 / E_FUNC_TMR1 / E_FUNC_TMR2 / E_FUNC_TMR3                      */
        /*                              E_FUNC_UART0 / E_FUNC_UART1 / E_FUNC_UART2                                 */
        /*                              E_FUNC_PWM01 / E_FUNC_PWM23 / E_FUNC_PWM45 / E_FUNC_PWM67                  */
        /*                              E_FUNC_EBI_8B / E_FUNC_EBI_16B                                             */
        /*                              E_FUNC_SPI0_QFN36PIN                                                       */
    //DrvGPIO_InitFunction(E_FUNC_EXTINT1);
    DrvGPIO_EnableEINT0(E_IO_FALLING, E_MODE_EDGE, EINT0Callback);
        //若设置为上升沿中断即E_IO_RISING,则在每次按键弹起时响应中断
        //若设置为下降沿中断即E_IO_FALLING,则在每次按键按下时相应中断
        /* Parameter:                                                                                                                                    */        
        /*                    TriggerType - [in]                                                                       */
        /*                  E_DRVGPIO_INT_TYPE, specify the interrupt trigger type.                                */
        /*                  It could be E_IO_RISING, E_IO_FALLING or E_IO_BOTH_EDGE and                            */
        /*                  it's meaning the interrupt function enable by rising egde/high level,                  */
        /*                  falling edge/low level or both riging edge and falling egde.                           */
        /*                  If the interrupt mode is E_MODE_LEVEL and interrupt type is                            */
        /*                  E_BOTH_EDGEthen calling this API is ignored.                                         */
        /*                    Mode - [in]                                                                              */
        /*                  E_DRVGPIO_INT_MODE, specify the interrupt mode.                                        */
        /*                  It could be E_MODE_EDGE or E_MODE_LEVEL to control the interrupt is by                 */
        /*                        edge trigger or by level trigger.                                                   */
        /*                  If the interrupt mode is E_MODE_LEVEL and interrupt type is                            */
        /*                  E_BOTH_EDGEthen calling this API is ignored.                                         */
        /*                    pfEINT0Callback - [in]                                                                   */
        /*                  It's the function pointer of the external INT0 callback function.                      */
    //DrvGPIO_EnableEINT1(E_IO_BOTH_EDGE, E_MODE_EDGE, EINT1Callback);
}

/*****************************
** Name:      LED_FLASH
** Function:  LED闪烁函数
** Input:     None
** OutPut:    None
** Data:      2011-03-27
** Note:      
****************************/
void LED_FLASH (void)
{
        DrvGPIO_ClrBit(E_GPA,2);
        /* port - [in]            E_DRVGPIO_PORT, specify GPIO port. It could be E_GPA, E_GPB, E_GPC, E_GPD and E_GPE.   */
        /* i32Bit - [in]   Specify pin of the GPIO port. It could be 0~15.                                        */
        delay_loop();
        DrvGPIO_ClrBit(E_GPA,3);
        delay_loop();
        DrvGPIO_SetBit(E_GPA,2);      
        DrvGPIO_SetBit(E_GPA,3);
        delay_loop();
        DrvGPIO_ClrBit(E_GPA,3);
        delay_loop();
        DrvGPIO_ClrBit(E_GPA,2);
        delay_loop();
        DrvGPIO_SetBit(E_GPA,2);      
        DrvGPIO_SetBit(E_GPA,3);
        delay_loop();
}

/*****************************
** Name:      INPUT_CHARGE
** Function:  GPIO输入判断函数
** Input:     None
** OutPut:    None
** Data:      2011-03-27
** Note:      查询法
****************************/
void INPUT_CHARGE (void)
{
        if(DrvGPIO_GetBit(E_GPB, 15)==0)
        /*Description :Get the pin value from the specified input GPIO pin.                                           */
        /*port [in] :E_DRVGPIO_PORT, specify GPIO port. It could be E_GPA, E_GPB, E_GPC, E_GPD and E_GPE. */
        /*i32Bit [in] : Specify pin of the GPIO port. It could be 0~15.                                                  */
                DrvGPIO_ClrBit(E_GPA,5);
        else
                DrvGPIO_SetBit(E_GPA,5);
}


int main (void)
{
        uint8_t test = 250;
        
        Init_System();
        
        Init_Uart();

        Init_GPIO();

        printf("\n");
        printf("/*==========================\n");
        printf("======菜农 %d 助学计划======\n",test);
        printf("========NUC120助学板========\n");
        printf("==程序参考Cube教程及BSP例程=\n");
        printf("=======2010年03月27日=======\n");
        printf("==========GPIO实验==========\n");
        printf("==========================*/\n");

    while(1)
    {
                LED_FLASH();
    }
}

相关帖子

沙发
U灬U| | 2011-3-27 16:08 | 只看该作者
很黄 很强大

使用特权

评论回复
板凳
kinbing| | 2011-3-27 16:10 | 只看该作者
不错.

使用特权

评论回复
地板
hotpower| | 2011-3-28 01:36 | 只看该作者
好!!!

使用特权

评论回复
5
Swallow_0322|  楼主 | 2011-3-28 13:34 | 只看该作者
辛苦大叔给条裤子!:P

使用特权

评论回复
6
li80328| | 2011-3-28 22:42 | 只看该作者
不错,学习了。

使用特权

评论回复
7
hotpower| | 2011-3-29 02:31 | 只看该作者
学习是要鼓励的

使用特权

评论回复
8
Swallow_0322|  楼主 | 2011-3-29 13:40 | 只看该作者
多谢大叔的鼓励,俺会再接再厉!

使用特权

评论回复
9
weshiluwei6| | 2011-3-30 15:19 | 只看该作者
以后直接上文件比较好

使用特权

评论回复
10
Swallow_0322|  楼主 | 2011-3-31 15:29 | 只看该作者
9# weshiluwei6

呵呵!第四贴包含前三贴的所有文件。

使用特权

评论回复
11
tao560532| | 2011-8-13 08:46 | 只看该作者
高手,做的很好啊

使用特权

评论回复
12
cecwxf| | 2011-8-16 16:11 | 只看该作者
哈哈 这几天进展慢  得好好规划下

使用特权

评论回复
13
tao560532| | 2011-8-17 01:10 | 只看该作者
确实很好啊

使用特权

评论回复
14
yjwcom001| | 2011-12-19 10:52 | 只看该作者
嘿嘿,不错

使用特权

评论回复
15
西行侠客| | 2013-2-1 20:54 | 只看该作者
不错,学习下,取走试一试

使用特权

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

本版积分规则

121

主题

1393

帖子

4

粉丝