[新手园地] HOT大叔NUC120助学板第三贴----GPIO小练

[复制链接]
 楼主| Swallow_0322 发表于 2011-3-27 15:32 | 显示全部楼层 |阅读模式
本帖最后由 Swallow_0322 于 2011-3-30 16:40 编辑
  1. /*Cortex M0学习断断续续,抽空玩下GPIO,利用下助学板上的LED_1~4及KEY1~2,单片机菜鸟,望各位不吝赐教!*/
  2. /**************************************************
  3. ** 文件名称:NUC120_HOT_GPIO.c
  4. ** 文件说明:NUC120助学板练习程序
  5. ** 创建日期:2011-03-27
  6. ** 修改日期:
  7. ** 备    注:GPIO输入输出及中断程序
  8.              LED_1与LED_2交替闪烁
  9.              KEY_1下降沿中断 LED_3取反
  10.              KEY_2按下即为低电平 LED_4亮
  11.                   弹起即为高电平 LED_4灭
  12. **************************************************/
  13. #include <stdio.h>
  14. #include "NUC1xx.h"
  15. #include "Driver\DrvGPIO.h"
  16. #include "Driver\DrvSYS.h"
  17. #include "Driver\DrvUART.h"


  18. /***************
  19. **  函数声明  **
  20. ***************/
  21. void Init_System (void);
  22. void Init_Uart (void);
  23. void Init_GPIO (void);
  24. void delay_loop(void);
  25. void LED_FLASH (void);
  26. void INPUT_CHARGE (void);


  27. /*****************************
  28. ** Name:      EINT0Callback
  29. ** Function:  EINT0中断服务函数
  30. ** Input:     None
  31. ** OutPut:    None
  32. ** Data:      2011-03-27
  33. ** Note:      
  34. ****************************/
  35. void EINT0Callback(void)
  36. {
  37.     printf("EINT0 Interrupt!\n");
  38.    
  39.     /* Toggle LED (GPA4) */
  40.     //outpw((uint32_t)&GPIOA->DOUT, inpw((uint32_t)&GPIOA->IN) ^ (1 << 4));   //与下面if else语句相同功能
  41.     if (DrvGPIO_GetBit(E_GPA,4))
  42.                 DrvGPIO_ClrBit(E_GPA,4);
  43.         else
  44.                 DrvGPIO_SetBit(E_GPA,4);
  45. }

  46. /*****************************
  47. ** Name:      delay_loop
  48. ** Function:  软件延时函数
  49. ** Input:     None
  50. ** OutPut:    None
  51. ** Data:      2011-03-27
  52. ** Note:      
  53. ****************************/
  54. void delay_loop(void)
  55. {
  56.         uint32_t j;
  57.         for(j=0;j<60000;j++)
  58.                 INPUT_CHARGE();
  59. }

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

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

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

  83. /*****************************
  84. ** Name:      Init_Uart
  85. ** Function:  UART初始化函数
  86. ** Input:      None
  87. ** OutPut:     None
  88. ** Data:       2011-03-17
  89. ** Note:      
  90. ****************************/
  91. void Init_Uart(void)
  92. {
  93.         STR_UART_T param;
  94.         /*
  95.         声明 UART设置的结构体 位于DRVUART.H
  96.         结构体如下
  97.         typedef struct DRVUART_STRUCT
  98.         {
  99.                 uint32_t            u32BaudRate;                        
  100.                 E_DATABITS_SETTINS  u8cDataBits;                        
  101.                 E_STOPBITS_SETTINS  u8cStopBits;                        
  102.                 E_PARITY_SETTINS         u8cParity;                                 
  103.                 E_FIFO_SETTINGS     u8cRxTriggerLevel;                 
  104.                 uint8_t             u8TimeOut ;                                 
  105.       }STR_UART_T;
  106.         */
  107.         DrvSYS_SelectIPClockSource(E_SYS_UART_CLKSRC,0);                    //使能UART时钟
  108.         //SYSCLK->CLKSEL1.UART_S = 0;                //UART时钟源选择. 00 =外部12MHz 晶振 01 = PLL 1x =内部 22MHz 振荡器

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

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

  123. /*****************************
  124. ** Name:      Init_GPIO
  125. ** Function:  GPIO初始化函数
  126. ** Input:     None
  127. ** OutPut:    None
  128. ** Data:      2011-03-27
  129. ** Note:      
  130. ****************************/
  131. void Init_GPIO (void)
  132. {
  133.         /*set GPI0 output*/
  134.         DrvGPIO_Open(E_GPA,2, E_IO_OUTPUT);                                //  设置GPA2端口为输出模式 连接LED_1
  135.         DrvGPIO_Open(E_GPA,3, E_IO_OUTPUT);                                //  设置GPA3端口为输出模式 连接LED_2
  136.         DrvGPIO_Open(E_GPA,4, E_IO_OUTPUT);                                //  设置GPA4端口为输出模式 连接LED_3
  137.         DrvGPIO_Open(E_GPA,5, E_IO_OUTPUT);                                //  设置GPA5端口为输出模式 连接LED_4
  138.         DrvGPIO_Open(E_GPB,14,E_IO_INPUT);                                //  设置GPB14端口为输入模式 连接按KEY1
  139.         DrvGPIO_Open(E_GPB,15,E_IO_INPUT);                                //  设置GPB15端口为输入模式 连接按KEY2
  140.         /*         port - [in]    E_DRVGPIO_PORT, specify GPIO port. It could be E_GPA, E_GPB, E_GPC, E_GPD and E_GPE.                                   */
  141.     /*    i32Bit - [in]  Specify pin of the GPIO port. It could be 0~15.                                                                        */
  142.         /*        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.*/

  143.         /* Configure external interrupt */
  144.     DrvGPIO_InitFunction(E_FUNC_EXTINT0);
  145.         /* Parameter:                                                                                                                                   */        
  146.         /*                    function - [in]                                                                          */
  147.         /*                  E_DRVGPIO_FUNC, specified the relative GPIO pins as special function pins.             */
  148.         /*                  It could be :                                                                          */
  149.         /*                              E_FUNC_GPIO                                                                */
  150.         /*                              E_FUNC_CLKO                                                                */
  151.         /*                              E_FUNC_I2C0 / E_FUNC_I2C1                                                  */
  152.         /*                              E_FUNC_I2S                                                                 */
  153.         /*                              E_FUNC_CAN0                                                                */
  154.         /*                              E_FUNC_ACMP0 / E_FUNC_ACMP1                                                */
  155.         /*                              E_FUNC_SPI0 /E_ FUNC_SPI1 / E_FUNC_SPI2 / E_FUNC_SPI3 /                    */
  156.         /*                              E_FUNC_ADC0 / E_FUNC_ADC1 / E_FUNC_ADC2 / E_FUNC_ADC3 /                             */
  157.         /*                                                                E_FUNC_ADC4 / E_FUNC_ADC5 / E_FUNC_ADC6 / E_FUNC_ADC7         */
  158.         /*                              E_FUNC_EXTINT0 / E_FUNC_EXTINT1                                            */
  159.         /*                              E_FUNC_TMR0 / E_FUNC_TMR1 / E_FUNC_TMR2 / E_FUNC_TMR3                      */
  160.         /*                              E_FUNC_UART0 / E_FUNC_UART1 / E_FUNC_UART2                                 */
  161.         /*                              E_FUNC_PWM01 / E_FUNC_PWM23 / E_FUNC_PWM45 / E_FUNC_PWM67                  */
  162.         /*                              E_FUNC_EBI_8B / E_FUNC_EBI_16B                                             */
  163.         /*                              E_FUNC_SPI0_QFN36PIN                                                       */
  164.     //DrvGPIO_InitFunction(E_FUNC_EXTINT1);
  165.     DrvGPIO_EnableEINT0(E_IO_FALLING, E_MODE_EDGE, EINT0Callback);
  166.         //若设置为上升沿中断即E_IO_RISING,则在每次按键弹起时响应中断
  167.         //若设置为下降沿中断即E_IO_FALLING,则在每次按键按下时相应中断
  168.         /* Parameter:                                                                                                                                    */        
  169.         /*                    TriggerType - [in]                                                                       */
  170.         /*                  E_DRVGPIO_INT_TYPE, specify the interrupt trigger type.                                */
  171.         /*                  It could be E_IO_RISING, E_IO_FALLING or E_IO_BOTH_EDGE and                            */
  172.         /*                  it's meaning the interrupt function enable by rising egde/high level,                  */
  173.         /*                  falling edge/low level or both riging edge and falling egde.                           */
  174.         /*                  If the interrupt mode is E_MODE_LEVEL and interrupt type is                            */
  175.         /*                  E_BOTH_EDGEthen calling this API is ignored.                                         */
  176.         /*                    Mode - [in]                                                                              */
  177.         /*                  E_DRVGPIO_INT_MODE, specify the interrupt mode.                                        */
  178.         /*                  It could be E_MODE_EDGE or E_MODE_LEVEL to control the interrupt is by                 */
  179.         /*                        edge trigger or by level trigger.                                                   */
  180.         /*                  If the interrupt mode is E_MODE_LEVEL and interrupt type is                            */
  181.         /*                  E_BOTH_EDGEthen calling this API is ignored.                                         */
  182.         /*                    pfEINT0Callback - [in]                                                                   */
  183.         /*                  It's the function pointer of the external INT0 callback function.                      */
  184.     //DrvGPIO_EnableEINT1(E_IO_BOTH_EDGE, E_MODE_EDGE, EINT1Callback);
  185. }

  186. /*****************************
  187. ** Name:      LED_FLASH
  188. ** Function:  LED闪烁函数
  189. ** Input:     None
  190. ** OutPut:    None
  191. ** Data:      2011-03-27
  192. ** Note:      
  193. ****************************/
  194. void LED_FLASH (void)
  195. {
  196.         DrvGPIO_ClrBit(E_GPA,2);
  197.         /* port - [in]            E_DRVGPIO_PORT, specify GPIO port. It could be E_GPA, E_GPB, E_GPC, E_GPD and E_GPE.   */
  198.         /* i32Bit - [in]   Specify pin of the GPIO port. It could be 0~15.                                        */
  199.         delay_loop();
  200.         DrvGPIO_ClrBit(E_GPA,3);
  201.         delay_loop();
  202.         DrvGPIO_SetBit(E_GPA,2);      
  203.         DrvGPIO_SetBit(E_GPA,3);
  204.         delay_loop();
  205.         DrvGPIO_ClrBit(E_GPA,3);
  206.         delay_loop();
  207.         DrvGPIO_ClrBit(E_GPA,2);
  208.         delay_loop();
  209.         DrvGPIO_SetBit(E_GPA,2);      
  210.         DrvGPIO_SetBit(E_GPA,3);
  211.         delay_loop();
  212. }

  213. /*****************************
  214. ** Name:      INPUT_CHARGE
  215. ** Function:  GPIO输入判断函数
  216. ** Input:     None
  217. ** OutPut:    None
  218. ** Data:      2011-03-27
  219. ** Note:      查询法
  220. ****************************/
  221. void INPUT_CHARGE (void)
  222. {
  223.         if(DrvGPIO_GetBit(E_GPB, 15)==0)
  224.         /*Description :Get the pin value from the specified input GPIO pin.                                           */
  225.         /*port [in] :E_DRVGPIO_PORT, specify GPIO port. It could be E_GPA, E_GPB, E_GPC, E_GPD and E_GPE. */
  226.         /*i32Bit [in] : Specify pin of the GPIO port. It could be 0~15.                                                  */
  227.                 DrvGPIO_ClrBit(E_GPA,5);
  228.         else
  229.                 DrvGPIO_SetBit(E_GPA,5);
  230. }


  231. int main (void)
  232. {
  233.         uint8_t test = 250;
  234.         
  235.         Init_System();
  236.         
  237.         Init_Uart();

  238.         Init_GPIO();

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

  247.     while(1)
  248.     {
  249.                 LED_FLASH();
  250.     }
  251. }
U灬U 发表于 2011-3-27 16:08 | 显示全部楼层
很黄 很强大
kinbing 发表于 2011-3-27 16:10 | 显示全部楼层
不错.
hotpower 发表于 2011-3-28 01:36 | 显示全部楼层
好!!!
 楼主| Swallow_0322 发表于 2011-3-28 13:34 | 显示全部楼层
辛苦大叔给条裤子!:P
li80328 发表于 2011-3-28 22:42 | 显示全部楼层
不错,学习了。
hotpower 发表于 2011-3-29 02:31 | 显示全部楼层
学习是要鼓励的
 楼主| Swallow_0322 发表于 2011-3-29 13:40 | 显示全部楼层
多谢大叔的鼓励,俺会再接再厉!
weshiluwei6 发表于 2011-3-30 15:19 | 显示全部楼层
以后直接上文件比较好
 楼主| Swallow_0322 发表于 2011-3-31 15:29 | 显示全部楼层
9# weshiluwei6

呵呵!第四贴包含前三贴的所有文件。
tao560532 发表于 2011-8-13 08:46 | 显示全部楼层
高手,做的很好啊
cecwxf 发表于 2011-8-16 16:11 | 显示全部楼层
哈哈 这几天进展慢  得好好规划下
tao560532 发表于 2011-8-17 01:10 | 显示全部楼层
确实很好啊
yjwcom001 发表于 2011-12-19 10:52 | 显示全部楼层
嘿嘿,不错
西行侠客 发表于 2013-2-1 20:54 | 显示全部楼层
不错,学习下,取走试一试
您需要登录后才可以回帖 登录 | 注册

本版积分规则

121

主题

1393

帖子

4

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

121

主题

1393

帖子

4

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