本帖最后由 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);
}
|