[应用方案] 八月新唐+面向IOT的NUC472实现功能设计

[复制链接]
1875|5
 楼主| jinglixixi 发表于 2017-8-10 18:52 | 显示全部楼层 |阅读模式
本帖最后由 jinglixixi 于 2017-8-13 15:02 编辑

前段时间有机会接触了新唐面向IOT所推出的NuMaker-PFM-NUC472开发板,这块开发板与前期推出的黑色开发板NuTiny-SDK-NUC472有很大的不同,它在外设方面又增添了许多新的功能模块,其外观如图1所示。
图片1.png
    图1 NuMaker-PFM-NUC472开发板

该开发板的基本配置为:主频72MHz、512KB Flash、64KB SRAMMCU176引脚的NUC472HI8AE
在上电后,从电脑上会发现有虚拟的UMBED和串口COM11,如图2所示。
       图片2.png
    图2 虚拟串口

本想在网上找些相关的例程来辅助学习,无奈却没有找到,所以只好参考NuTiny-SDK-NUC472开发板的资源来作为参考。
在进行程序下载时,需用到编译所生成的*.bin文件,并将其复制到虚拟UMBED中。若想进行串行通讯,则需要用USBTTL串行通讯模块来连接板上的串行通讯口UART0,如图3所示。通过串口助手即可查看活动所要实现的制作效果,参见图4所示。
       图片3.png
    图3 串口连接

       图片4.png
    图4 制作效果

    实现制作效果的程序如下,它是通过串行通讯函数、A/D转换中断函数及主函数等组成的。
  1. #include <stdio.h>
  2. #include "NUC472_442.h"
  3. #define PLLCON_SETTING      CLK_PLLCTL_84MHz_HXT
  4. #define PLL_CLOCK           84000000
  5. int n=0;
  6. long int delay_1us(void)
  7. {
  8.         long int count=2;
  9.         while(count--);
  10.         return 0;
  11. }

  12. void delay_ms(unsigned int nms)
  13. {         
  14.   unsigned int n,m;        
  15.         n=nms;
  16.         while(n)
  17.         {
  18.         for(m=0;m<1000;m++) delay_1us();
  19.         n--;        
  20.         }              
  21. }   

  22. void ADC_IRQHandler(void)
  23. {
  24.      uint32_t u32Flag;
  25.       float u;
  26.       // Get ADC conversion finish interrupt flag
  27.       u32Flag = ADC_GET_INT_FLAG(ADC, ADC_ADF_INT);
  28.       if(n<3)
  29.           {
  30.             if(u32Flag & ADC_ADF_INT)
  31.                         {
  32.             uint32_t u32Result;
  33.         u32Result = ADC_GET_CONVERSION_DATA(ADC, 0);
  34.                         u=3.3*u32Result/0xfff;      
  35.                         if(n==0)  printf("#1 = %4.2F V;\r\n",u);
  36.             u32Result = ADC_GET_CONVERSION_DATA(ADC, 1);
  37.                         u=3.3*u32Result/0xfff;
  38.             if(n==1)  printf("#2 = %4.2F V;\r\n",u);
  39.             u32Result = ADC_GET_CONVERSION_DATA(ADC, 2);
  40.                         u=3.3*u32Result/0xfff;
  41.             if(n==2)  printf("#3 = %4.2F V.\r\n",u);   
  42.       }
  43.       //NVIC_DisableIRQ(ADC_IRQn);//
  44.                 ADC_STOP_CONV(ADC);
  45.                 delay_ms(500);  
  46.                 ADC_START_CONV(ADC);
  47.         ADC_CLR_INT_FLAG(ADC, u32Flag);
  48.                 n++;
  49.           }
  50.                 if(n==3)
  51.                 {
  52.                 ADC_STOP_CONV(ADC);
  53.                 printf("MyID:jinglixixi \r\n");
  54.                 }
  55. }

  56. void SYS_Init(void)
  57. {
  58.     /*---------------------------------------------------------------------------------------------------------*/
  59.     /* Init System Clock */
  60.     /*---------------------------------------------------------------------------------------------------------*/
  61.     /* Unlock protected registers */
  62.     SYS_UnlockReg();
  63.     /* Enable External XTAL (4~24 MHz) */
  64.     CLK_EnableXtalRC(CLK_PWRCTL_HXTEN_Msk);
  65.     /* Waiting for 12MHz clock ready */
  66.     CLK_WaitClockReady( CLK_STATUS_HXTSTB_Msk);
  67.     /* Switch HCLK clock source to HXT */
  68.     CLK_SetHCLK(CLK_CLKSEL0_HCLKSEL_HXT,CLK_CLKDIV0_HCLK(1));
  69.     /* Set PLL to power down mode and PLL_STB bit in CLKSTATUS register will be cleared by hardware.*/
  70.     CLK->PLLCTL|= CLK_PLLCTL_PD_Msk;
  71.     /* Set PLL frequency */
  72.     CLK->PLLCTL = PLLCON_SETTING;
  73.     /* Waiting for clock ready */
  74.     CLK_WaitClockReady(CLK_STATUS_PLLSTB_Msk);
  75.     /* Switch HCLK clock source to PLL */
  76.     CLK_SetHCLK(CLK_CLKSEL0_HCLKSEL_PLL,CLK_CLKDIV0_HCLK(1));
  77.     /* Enable IP clock */
  78.     CLK_EnableModuleClock(UART0_MODULE);
  79.     CLK_EnableModuleClock(ADC_MODULE);
  80.     /* Select IP clock source */
  81.     CLK_SetModuleClock(UART0_MODULE,CLK_CLKSEL1_UARTSEL_HXT,CLK_CLKDIV0_UART(1));
  82.     CLK_SetModuleClock(ADC_MODULE,CLK_CLKSEL1_ADCSEL_PCLK,CLK_CLKDIV0_ADC(5));
  83.     /* Update System Core Clock */
  84.     /* User can use SystemCoreClockUpdate() to calculate SystemCoreClock. */
  85.     SystemCoreClockUpdate();
  86.     /*---------------------------------------------------------------------------------------------------------*/
  87.     /* Init I/O Multi-function                                      */
  88.     /*---------------------------------------------------------------------------------------------------------*/
  89.     /* Set GPG multi-function pins for UART0 RXD and TXD */
  90.     SYS->GPG_MFPL = SYS_GPG_MFPL_PG1MFP_UART0_RXD | SYS_GPG_MFPL_PG2MFP_UART0_TXD ;
  91.     /* Set GPG multi-function pins for CKO */
  92.     SYS->GPC_MFPL = (SYS->GPC_MFPL & ~SYS_GPC_MFPL_PC5MFP_Msk) | SYS_GPC_MFPL_PC5MFP_CLK_O ;
  93.     /* Configure analog input pins ADC0~ADC2 (GPE0~GPE2) */
  94.     SYS->GPE_MFPL = SYS_GPE_MFPL_PE0MFP_ADC0_0 | SYS_GPE_MFPL_PE1MFP_ADC0_1 | SYS_GPE_MFPL_PE2MFP_ADC0_2;
  95.     /* Disable the digital input path */
  96.     PE->DINOFF = PE->DINOFF | (GPIO_DINOFF_DINOFF0_Msk|GPIO_DINOFF_DINOFF1_Msk|GPIO_DINOFF_DINOFF2_Msk);
  97.     /* Reset ADC */
  98.     SYS_ResetModule(ADC_RST);
  99.     /* Vref connect to AVDD */
  100.     SYS->VREFCTL |= SYS_VREFCTL_VREF_AVDD;
  101.     /* Lock protected registers */
  102.     SYS_LockReg();
  103. }

  104. void UART0_Init(void)
  105. {
  106.     /*---------------------------------------------------------------------------------------------------------*/
  107.     /* Init UART                                          */
  108.     /*---------------------------------------------------------------------------------------------------------*/
  109.     /* Reset IP */
  110.     SYS_ResetModule(UART0_RST);
  111.     /* Configure UART0 and set UART0 Baudrate */
  112.     UART0->LINE |=0x07;
  113.     UART0->BAUD = 0x30000066;   /* 12MHz reference clock input, for 115200 */
  114. }


  115. int32_t main (void)
  116. {
  117.     SYS_Init();
  118.     /* Init UART0 for printf */
  119.     UART0_Init();
  120.         printf("八月,新唐你好!\r\n");
  121.     printf("Hello, 21ic.com ! \r\n");
  122.         printf("ADC test: \r\n");
  123.         // Enable channel 0,1,2
  124.     ADC_Open(ADC, ADC_INPUT_MODE_SINGLE_END, ADC_OPERATION_MODE_CONTINUOUS, (ADC_CH_0_MASK | ADC_CH_1_MASK | ADC_CH_2_MASK));
  125.     // Power on ADC
  126.     ADC_POWER_ON(ADC);
  127.     // Enable ADC ADC_IF interrupt
  128.     ADC_EnableInt(ADC, ADC_ADF_INT);
  129.     NVIC_EnableIRQ(ADC_IRQn);
  130.     ADC_START_CONV(ADC);
  131.     while(1);
  132.         }
t.jpg


天灵灵地灵灵 发表于 2017-8-10 19:16 | 显示全部楼层
要求的应该是手写ID吧。。。
天灵灵地灵灵 发表于 2017-8-10 19:17 | 显示全部楼层
楼主的板子高大上啊。
 楼主| jinglixixi 发表于 2017-8-11 10:00 | 显示全部楼层
天灵灵地灵灵 发表于 2017-8-10 19:17
楼主的板子高大上啊。

比较新,正不断掌握新功能的使用。
 楼主| jinglixixi 发表于 2017-8-11 10:01 | 显示全部楼层
天灵灵地灵灵 发表于 2017-8-10 19:16
要求的应该是手写ID吧。。。

回来再补一张。
wanduzi 发表于 2017-8-12 16:37 | 显示全部楼层
楼主牛叉,这板子给力。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

521

主题

2950

帖子

39

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