一、NUC442介绍 NUC442 是一款带有 DSP 和浮点数单元的 Cortex ® -M4F 内核处理器,工作主频可达 84 MHz, 内嵌 256/512K/flash,64K/SRAM。片内具有丰富的外设资源,由于官方给的BSP包太混乱复杂,所
一、NUC442介绍
NUC442 是一款带有 DSP 和浮点数单元的 Cortex ® -M4F 内核处理器,工作主频可达 84 MHz, 内嵌 256/512K/flash,64K/SRAM。片内具有丰富的外设资源,由于官方给的BSP包太混乱复杂,所以研究了一下EADC里的ADC 1。使用的NUC442JI8AE开发板,其PID是0x00044201。
二、关于EADC
NUC442/NUC472系列包含一个12位,带16个外部输入通道和5个内部通道的逐次逼近法模 拟数字转换器 (SAR A/D 转换器) 。 A/D转换器可以通过软件触发、PWM 触发、timer0~3溢 出脉冲触发、ADINT0, ADINT1中断EOC(转换结束)脉冲触发和外部管脚 (STADC) 输入信 号触发转换。
三、模块代码实现
此次引用了库函数,详细梳理了一下使用方法。
(1)首先是ADC1的初始化函数,代码如下:
1 void ADC1_Init(void) 2 { 3 unsigned char i=0; 4 SYS_UnlockReg(); 5 CLK_EnableModuleClock(EADC_MODULE); //使能EADC时钟 6 CLK_SetModuleClock(EADC_MODULE, CLK_CLKSEL1_ADCSEL_PCLK, CLK_CLKDIV0_ADC(5)); 7 //PE8~PE15 ADC1->Channel 0~7 8 SYS->GPE_MFPH = (SYS->GPE_MFPH & ~SYS_GPE_MFPH_PE8MFP_Msk) | SYS_GPE_MFPH_PE8MFP_ADC1_0; 9 SYS->GPE_MFPH = (SYS->GPE_MFPH & ~SYS_GPE_MFPH_PE9MFP_Msk) | SYS_GPE_MFPH_PE9MFP_ADC1_1; 10 SYS->GPE_MFPH = (SYS->GPE_MFPH & ~SYS_GPE_MFPH_PE10MFP_Msk) | SYS_GPE_MFPH_PE10MFP_ADC1_2; 11 SYS->GPE_MFPH = (SYS->GPE_MFPH & ~SYS_GPE_MFPH_PE11MFP_Msk) | SYS_GPE_MFPH_PE11MFP_ADC1_3; 12 SYS->GPE_MFPH = (SYS->GPE_MFPH & ~SYS_GPE_MFPH_PE12MFP_Msk) | SYS_GPE_MFPH_PE12MFP_ADC1_4; 13 SYS->GPE_MFPH = (SYS->GPE_MFPH & ~SYS_GPE_MFPH_PE13MFP_Msk) | SYS_GPE_MFPH_PE13MFP_ADC1_5; 14 SYS->GPE_MFPH = (SYS->GPE_MFPH & ~SYS_GPE_MFPH_PE14MFP_Msk) | SYS_GPE_MFPH_PE14MFP_ADC1_6; 15 SYS->GPE_MFPH = (SYS->GPE_MFPH & ~SYS_GPE_MFPH_PE15MFP_Msk) | SYS_GPE_MFPH_PE15MFP_ADC1_7; 16 PE->DINOFF = PE->DINOFF | (GPIO_DINOFF_DINOFF8_Msk | GPIO_DINOFF_DINOFF9_Msk | GPIO_DINOFF_DINOFF10_Msk | 17 GPIO_DINOFF_DINOFF11_Msk | GPIO_DINOFF_DINOFF12_Msk | GPIO_DINOFF_DINOFF13_Msk | 18 GPIO_DINOFF_DINOFF14_Msk | GPIO_DINOFF_DINOFF15_Msk); //关闭PE8~15数字输入通道 19 20 SYS->VREFCTL = SYS_VREFCTL_VREF_AVDD; //设置参考电压为VDD 21 SYS_LockReg(); 22 //---------------------------------------------------------------------------------- 23 /* Enable the A/D converter */ 24 EADC_Open(EADC,0); //EADC使能; 25 /* Configure the EADC1 sample module 0~7 for analog input channel 0~7 and software trigger source.*/ 26 EADC_ConfigSampleModule(EADC, EADC1_SAMPLE_MODULE0, EADC_SOFTWARE_TRIGGER, EADC1_CH0); 27 EADC_ConfigSampleModule(EADC, EADC1_SAMPLE_MODULE1, EADC_SOFTWARE_TRIGGER, EADC1_CH1); 28 EADC_ConfigSampleModule(EADC, EADC1_SAMPLE_MODULE2, EADC_SOFTWARE_TRIGGER, EADC1_CH2); 29 EADC_ConfigSampleModule(EADC, EADC1_SAMPLE_MODULE3, EADC_SOFTWARE_TRIGGER, EADC1_CH3); 30 EADC_ConfigSampleModule(EADC, EADC1_SAMPLE_MODULE4, EADC_SOFTWARE_TRIGGER, EADC1_CH4); 31 EADC_ConfigSampleModule(EADC, EADC1_SAMPLE_MODULE5, EADC_SOFTWARE_TRIGGER, EADC1_CH5); 32 EADC_ConfigSampleModule(EADC, EADC1_SAMPLE_MODULE6, EADC_SOFTWARE_TRIGGER, EADC1_CH6); 33 EADC_ConfigSampleModule(EADC, EADC1_SAMPLE_MODULE7, EADC_SOFTWARE_TRIGGER, EADC1_CH7); 34 35 EADC_CLR_INT_FLAG(EADC, 0x02); //ADINT1中断标志清0 36 EADC_ENABLE_INT(EADC, 0x02); //使能ADINT1 37 for(i=8;i<16;i++) //AD1SPIE0:AD1SPIE7=[8:15] 38 { 39 EADC_ENABLE_SAMPLE_MODULE_INT(EADC, 1 , 1<<i); //ADC中断1源使能;ADC1-SAMPLE10~17中断使能; 40 } 41 NVIC_EnableIRQ(EADC1_IRQn); 42 }
(2)然后接着就是中断服务函数,如下:
1 void EADC1_IRQHandler(void) //EADC1中断服务函数 2 { 3 EADC1_ConversionFlag = 1; 4 EADC_CLR_INT_FLAG(EADC, 0x02); //清除中断标志 5 }
(4)由于使用的是ADC1,所以还需要配置为EADC;
1 void ADC_Select(ADC_Source source) 2 { 3 SYS_UnlockReg(); 4 if(source == ADC1_Select) //选择EADC1 5 { 6 /* Set to EADC mode */ 7 SYS->VREFCTL = (SYS->VREFCTL & ~SYS_VREFCTL_ADCMODESEL_EADC) | SYS_VREFCTL_ADCMODESEL_EADC; 8 } 9 else //选择ADC0 10 { 11 SYS->VREFCTL = (SYS->VREFCTL & ~SYS_VREFCTL_ADCMODESEL_EADC) | SYS_VREFCTL_ADCMODESEL_ADC; 12 } 13 SYS_LockReg(); 14 }
(5)最后就可以写自己的ADC处理函数啦;
1 unsigned int ADC1_Conversion_Process(ADC1_Channel ch) //EADC1转换处理 2 { 3 unsigned int EADC1_Conversion_Result; 4 EADC_START_CONV(EADC,1<<(ch+8)); //开始转换模块10~17 5 while(!EADC1_ConversionFlag); //等待转换完毕 6 EADC1_ConversionFlag = 0; 7 EADC1_Conversion_Result=EADC1_GET_CONV_DATA(EADC,ch); //读取转换结果; 8 return EADC1_Conversion_Result; 9 }
(6)最后放上头文件吧;
1 #ifndef _MY_EADC_H 2 #define _MY_EADC_H 3 #include "NUC472_442.h" 4 //---------------------------------------------------------------------- 5 #define ADC1_VREF 3300 6 #define ADC0_VREF 3300 7 //---------------------------------------------------------------------- 8 typedef enum _ADC1_Channel{ADC1_CH0,ADC1_CH1,ADC1_CH2,ADC1_CH3,ADC1_CH4,ADC1_CH5,ADC1_CH6,ADC1_CH7}ADC1_Channel; 9 typedef enum _ADC_Source{ADC0_Select,ADC1_Select}ADC_Source; 10 //---------------------------------------------------------------------- 11 void ADC1_Init(void); 12 unsigned int ADC1_Conversion_Process(ADC1_Channel ch); 13 void ADC_Select(ADC_Source source); 14 //---------------------------------------------------------------------- 15 extern unsigned char EADC1_ConversionFlag; 16 //---------------------------------------------------------------------- 17 #endif
(7)本次使用的是软件触发转换,当然也可以使用其他触发方式;
(8)综上,NUC442的使用方法相对于STM32来说更为简单一点,功能也是比较强大的。