3796|1

1144

帖子

17

TA的资源

纯净的硅(高级)

楼主
 

【国民技术N32G457评测】三、ADC及串口功能测试 [复制链接]

  本帖最后由 fxyc87 于 2022-1-21 16:47 编辑

我的相关历史贴子:

 【国民技术N32G457评测】一、资料准备

 【国民技术N32G457评测】二、开箱+点灯 


测试ADC时,搞了半天,原因就是没有接VREF+,VREF-两个引脚,开发板上这两个引脚是悬空的,

怎么测试读取出的AD值都不对,直接接GND上读的是0,接VCC上是4095,接可变电阻上也是这两个值,

后来万用表测试AD参考电压才发现不对头

先上代码,再上照片

我是用的PC0引脚读取的一个可调电阻上的分压。


主程序

static uint16_t adc_value=0;
static double adc_v=0;

int main(){

    BspInit();

	printf("app runing...\r\n");
	printf("CPU clock=%d\r\n",SystemCoreClock);
    //点亮指示灯    
    while(1){
        Delay(100);
        LED(1,Bit_SET);
        LED(2,Bit_SET);
        LED(3,Bit_SET);
        Delay(100);
        LED(1,Bit_RESET);
        LED(2,Bit_RESET);
        LED(3,Bit_RESET);
		ADC_ClearFlag(ADC1,ADC_FLAG_ENDC);
		ADC_EnableSoftwareStartConv(ADC1,ENABLE);
		while(ADC_GetFlagStatus(ADC1,ADC_FLAG_ENDC)==RESET);
		adc_value=ADC_GetDat(ADC1);
		adc_v=(double)adc_value/(double)4095*3.3;
		printf("PC0 Volt=%0.2f\r\n",adc_v);
    }
    
}

BSP初始化程序


#include <n32g45x.h>
#include <n32g45x_gpio.h>
#include <bsp.h>
#include <stdio.h>

static uint32_t Tick=0;

void BspInit(void){
    //SystemInit();         .s中已调用,此处无需调用
    SystemCoreClockUpdate();
    SysTick_Config(SystemCoreClock/1000);
    GpioInit();
    USART1_Config();
    AdcInit();
}
void GpioInit(void){    //GPIO初始化,包括LED
    //开启IO时钟  GPIOA,B,afio
    RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_GPIOA|RCC_APB2_PERIPH_GPIOB|RCC_APB2_PERIPH_AFIO,ENABLE);
    
    //PB4默认是JW-RESET 需要用该功能,见手册101页
    GPIO_ConfigPinRemap(GPIO_RMP_SW_JTAG_NO_NJTRST,ENABLE);

    //初始化IO
    GPIO_InitType gpio;
    
    gpio.Pin=GPIO_PIN_5|GPIO_PIN_4;        //LED3,LED2
    gpio.GPIO_Mode=GPIO_Mode_Out_PP;
    gpio.GPIO_Speed=GPIO_Speed_50MHz;
    
    GPIO_InitPeripheral(GPIOB,&gpio);
    
    gpio.Pin=GPIO_PIN_8;        //LED1
    gpio.GPIO_Mode=GPIO_Mode_Out_PP;
    gpio.GPIO_Speed=GPIO_Speed_50MHz;
    
    GPIO_InitPeripheral(GPIOA,&gpio);
}

void AdcInit(void){
	//adc pll=72mhz
	RCC_ConfigAdcPllClk(RCC_ADCPLLCLK_DIV2,ENABLE);
	//adc hclk/2=72mhz
	RCC_ConfigAdcHclk(RCC_ADCHCLK_DIV2);
	//adc 1m时钟
	RCC_ConfigAdc1mClk(RCC_ADC1MCLK_SRC_HSI,RCC_ADC1MCLK_DIV8);
	//AD1时钟开启
	RCC_EnableAHBPeriphClk(RCC_AHB_PERIPH_ADC1,ENABLE);
	
	//AD输入引脚配置
	//GPIOC 
    RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_GPIOC,ENABLE);
    //PC0 AD12-IN6
	GPIO_InitType gpio;
    gpio.Pin=GPIO_PIN_6;
    gpio.GPIO_Mode=GPIO_Mode_AIN;
    gpio.GPIO_Speed=GPIO_INPUT;
    GPIO_InitPeripheral(GPIOC,&gpio);
	
	//
	ADC_InitType adc;
	adc.WorkMode=ADC_WORKMODE_INDEPENDENT;		//独立模式
	adc.MultiChEn=DISABLE;						//单一模式
	adc.ContinueConvEn=DISABLE;					//非连续
	adc.ExtTrigSelect=ADC_EXT_TRIGCONV_NONE;	//外部触发选择,软件手动触发
	adc.DatAlign=ADC_DAT_ALIGN_R;				//右对齐
	adc.ChsNumber=1;							//组合通道数
	
	ADC_Init(ADC1,&adc);						//初始化ADC1
	
	ADC_Enable(ADC1,ENABLE);					//开启并转换
	
	ADC_StartCalibration(ADC1);					//校准
	
	while(ADC_GetCalibrationStatus(ADC1)==SET);	//等待校准完成
	
	//通道配置
	ADC_ConfigRegularChannel(ADC1,ADC_CH_6,1,ADC_SAMP_TIME_1CYCLES5);

}


void LED(int number,Bit_OperateType val){       //点亮LED number:1-3  val:Bit_SET/Bit_RESET
    switch(number){
        case 1:
            GPIO_WriteBit(GPIOA,GPIO_PIN_8,val);
            break;
        case 2:
            GPIO_WriteBit(GPIOB,GPIO_PIN_4,val);
            break;
        case 3:
            GPIO_WriteBit(GPIOB,GPIO_PIN_5,val);
            break;
    }
}

void SysTick_Handler(void){
    Tick++;
}
void Delay(uint32_t ms){
    SysTick->VAL=0;
    Tick=0;
    while(Tick<ms);
}

void USART1_Config(void)
{
	GPIO_InitType GPIO_InitStructure;
	USART_InitType USART_InitStructure;
	
	/* USART1  时钟*/
	RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_USART1 | RCC_APB2_PERIPH_GPIOA, ENABLE);
	
	/* USART1 GPIO 配置 */
	/* USART1 Tx (PA.09) 复用输出+上拉 */
	GPIO_InitStructure.Pin = GPIO_PIN_9;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitPeripheral(GPIOA, &GPIO_InitStructure);    
	/* USART1 Rx (PA.10)输入模式 */
	GPIO_InitStructure.Pin = GPIO_PIN_10;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	GPIO_InitPeripheral(GPIOA, &GPIO_InitStructure);
	  
	/* USART1 工作模式*/
	USART_InitStructure.BaudRate = 115200;
	USART_InitStructure.WordLength = USART_WL_8B;
	USART_InitStructure.StopBits = USART_STPB_1;
	USART_InitStructure.Parity = USART_PE_NO ;
	USART_InitStructure.HardwareFlowControl = USART_HFCTRL_NONE;
	USART_InitStructure.Mode = USART_MODE_RX | USART_MODE_TX;
	USART_Init(USART1, &USART_InitStructure); 
	USART_Enable(USART1, ENABLE);
}

/* printf要用 */
int fputc(int ch, FILE* f)
{
    USART_SendData(USART1, (uint8_t)ch);
    while (USART_GetFlagStatus(USART1, USART_FLAG_TXDE) == RESET)
        ;
    return (ch);
}

//end

 

串口接收效果照片:

 

开发板接线图:

把开发板上的VREFN接到GND,把VREFP接到3.3V

然后焊可20K的可调电阻,2端分别接VCC,GND,OUT接到PC0引脚,

 

注意,开发板默认这两个VREF引脚 悬空,一定要接参考。我都翻车在这个位置上。

LED点灯相关我上个贴子已发过了,

点赞 关注
 
 

回复
举报

1144

帖子

17

TA的资源

纯净的硅(高级)

沙发
 

ADC的难点就是时钟初始化

这款MCU用ADC竟然需要三路时钟,我第一次听说这么复杂的ADC,

其它的对着手册没啥问题,还有就是硬件了。

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表