本帖最后由 jinglixixi 于 2017-8-13 15:02 编辑
前段时间有机会接触了新唐面向IOT所推出的NuMaker-PFM-NUC472开发板,这块开发板与前期推出的黑色开发板NuTiny-SDK-NUC472有很大的不同,它在外设方面又增添了许多新的功能模块,其外观如图1所示。 图1 NuMaker-PFM-NUC472开发板
该开发板的基本配置为:主频72MHz、512KB Flash、64KB SRAM,MCU为176引脚的NUC472HI8AE。 在上电后,从电脑上会发现有虚拟的U盘MBED和串口COM11,如图2所示。 图2 虚拟串口
本想在网上找些相关的例程来辅助学习,无奈却没有找到,所以只好参考NuTiny-SDK-NUC472开发板的资源来作为参考。 在进行程序下载时,需用到编译所生成的*.bin文件,并将其复制到虚拟U盘MBED中。若想进行串行通讯,则需要用USB转TTL串行通讯模块来连接板上的串行通讯口UART0,如图3所示。通过串口助手即可查看活动所要实现的制作效果,参见图4所示。 图3 串口连接
图4 制作效果
实现制作效果的程序如下,它是通过串行通讯函数、A/D转换中断函数及主函数等组成的。 - #include <stdio.h>
- #include "NUC472_442.h"
- #define PLLCON_SETTING CLK_PLLCTL_84MHz_HXT
- #define PLL_CLOCK 84000000
- int n=0;
- long int delay_1us(void)
- {
- long int count=2;
- while(count--);
- return 0;
- }
- void delay_ms(unsigned int nms)
- {
- unsigned int n,m;
- n=nms;
- while(n)
- {
- for(m=0;m<1000;m++) delay_1us();
- n--;
- }
- }
- void ADC_IRQHandler(void)
- {
- uint32_t u32Flag;
- float u;
- // Get ADC conversion finish interrupt flag
- u32Flag = ADC_GET_INT_FLAG(ADC, ADC_ADF_INT);
- if(n<3)
- {
- if(u32Flag & ADC_ADF_INT)
- {
- uint32_t u32Result;
- u32Result = ADC_GET_CONVERSION_DATA(ADC, 0);
- u=3.3*u32Result/0xfff;
- if(n==0) printf("#1 = %4.2F V;\r\n",u);
- u32Result = ADC_GET_CONVERSION_DATA(ADC, 1);
- u=3.3*u32Result/0xfff;
- if(n==1) printf("#2 = %4.2F V;\r\n",u);
- u32Result = ADC_GET_CONVERSION_DATA(ADC, 2);
- u=3.3*u32Result/0xfff;
- if(n==2) printf("#3 = %4.2F V.\r\n",u);
- }
- //NVIC_DisableIRQ(ADC_IRQn);//
- ADC_STOP_CONV(ADC);
- delay_ms(500);
- ADC_START_CONV(ADC);
- ADC_CLR_INT_FLAG(ADC, u32Flag);
- n++;
- }
- if(n==3)
- {
- ADC_STOP_CONV(ADC);
- printf("MyID:jinglixixi \r\n");
- }
- }
- void SYS_Init(void)
- {
- /*---------------------------------------------------------------------------------------------------------*/
- /* Init System Clock */
- /*---------------------------------------------------------------------------------------------------------*/
- /* Unlock protected registers */
- SYS_UnlockReg();
- /* Enable External XTAL (4~24 MHz) */
- CLK_EnableXtalRC(CLK_PWRCTL_HXTEN_Msk);
- /* Waiting for 12MHz clock ready */
- CLK_WaitClockReady( CLK_STATUS_HXTSTB_Msk);
- /* Switch HCLK clock source to HXT */
- CLK_SetHCLK(CLK_CLKSEL0_HCLKSEL_HXT,CLK_CLKDIV0_HCLK(1));
- /* Set PLL to power down mode and PLL_STB bit in CLKSTATUS register will be cleared by hardware.*/
- CLK->PLLCTL|= CLK_PLLCTL_PD_Msk;
- /* Set PLL frequency */
- CLK->PLLCTL = PLLCON_SETTING;
- /* Waiting for clock ready */
- CLK_WaitClockReady(CLK_STATUS_PLLSTB_Msk);
- /* Switch HCLK clock source to PLL */
- CLK_SetHCLK(CLK_CLKSEL0_HCLKSEL_PLL,CLK_CLKDIV0_HCLK(1));
- /* Enable IP clock */
- CLK_EnableModuleClock(UART0_MODULE);
- CLK_EnableModuleClock(ADC_MODULE);
- /* Select IP clock source */
- CLK_SetModuleClock(UART0_MODULE,CLK_CLKSEL1_UARTSEL_HXT,CLK_CLKDIV0_UART(1));
- CLK_SetModuleClock(ADC_MODULE,CLK_CLKSEL1_ADCSEL_PCLK,CLK_CLKDIV0_ADC(5));
- /* Update System Core Clock */
- /* User can use SystemCoreClockUpdate() to calculate SystemCoreClock. */
- SystemCoreClockUpdate();
- /*---------------------------------------------------------------------------------------------------------*/
- /* Init I/O Multi-function */
- /*---------------------------------------------------------------------------------------------------------*/
- /* Set GPG multi-function pins for UART0 RXD and TXD */
- SYS->GPG_MFPL = SYS_GPG_MFPL_PG1MFP_UART0_RXD | SYS_GPG_MFPL_PG2MFP_UART0_TXD ;
- /* Set GPG multi-function pins for CKO */
- SYS->GPC_MFPL = (SYS->GPC_MFPL & ~SYS_GPC_MFPL_PC5MFP_Msk) | SYS_GPC_MFPL_PC5MFP_CLK_O ;
- /* Configure analog input pins ADC0~ADC2 (GPE0~GPE2) */
- SYS->GPE_MFPL = SYS_GPE_MFPL_PE0MFP_ADC0_0 | SYS_GPE_MFPL_PE1MFP_ADC0_1 | SYS_GPE_MFPL_PE2MFP_ADC0_2;
- /* Disable the digital input path */
- PE->DINOFF = PE->DINOFF | (GPIO_DINOFF_DINOFF0_Msk|GPIO_DINOFF_DINOFF1_Msk|GPIO_DINOFF_DINOFF2_Msk);
- /* Reset ADC */
- SYS_ResetModule(ADC_RST);
- /* Vref connect to AVDD */
- SYS->VREFCTL |= SYS_VREFCTL_VREF_AVDD;
- /* Lock protected registers */
- SYS_LockReg();
- }
- void UART0_Init(void)
- {
- /*---------------------------------------------------------------------------------------------------------*/
- /* Init UART */
- /*---------------------------------------------------------------------------------------------------------*/
- /* Reset IP */
- SYS_ResetModule(UART0_RST);
- /* Configure UART0 and set UART0 Baudrate */
- UART0->LINE |=0x07;
- UART0->BAUD = 0x30000066; /* 12MHz reference clock input, for 115200 */
- }
- int32_t main (void)
- {
- SYS_Init();
- /* Init UART0 for printf */
- UART0_Init();
- printf("八月,新唐你好!\r\n");
- printf("Hello, 21ic.com ! \r\n");
- printf("ADC test: \r\n");
- // Enable channel 0,1,2
- ADC_Open(ADC, ADC_INPUT_MODE_SINGLE_END, ADC_OPERATION_MODE_CONTINUOUS, (ADC_CH_0_MASK | ADC_CH_1_MASK | ADC_CH_2_MASK));
- // Power on ADC
- ADC_POWER_ON(ADC);
- // Enable ADC ADC_IF interrupt
- ADC_EnableInt(ADC, ADC_ADF_INT);
- NVIC_EnableIRQ(ADC_IRQn);
- ADC_START_CONV(ADC);
- while(1);
- }
|