ADC四路采集数据(1s100次)

   //main.c
#include "adc_sample.h"
/**
 * main
 *
 * @param[in]  none
 * @return 0: success, other: error value
 *
 * @brief  
 */
int main(void)
{
    InitDelay();
    InitDebug();     //串口2
	  InitUart1();     //串口1
	  GPIO_LedInit();
    printf("\r\nAC7801x: ADC_Sample\r\n");
    ADC_SampleSoftwareTrigerADC();
}

   // software triger adc.c
#include "adc_sample.h"

/*********<Variable>********/
uint8_t g_dmaFinish = 0;//DMA传输完成
uint8_t g_halfDmaFinish = 0; //DMA传输半完成
uint8_t g_dmaTransError = 0; //DMA传输错误
uint16_t g_ADCValueBuffer[DMA_TRANSFER_NUM+1];     //存放数据  400
             
uint32_t adc_avge[4];    //4个通道存放             实际电压

uint16_t adc_xishu[4];            //一次四个通道系数
uint16_t adc_xiuzheng[4];         //每次修正电压

uint32_t g_timerCnt = 0;
uint16_t g_regularAverageSampleValue = 0; //规则组采样平均值
uint16_t g_injectAverageSampleValue = 0; //注入组采样平均值
uint16_t g_adcInjectValue[4];
uint8_t g_AMOFlag = 0;//模拟看门狗事件标志
/*
注意:EOC标志写0或读取ADC_RDR都会清除该标志位。
在进行debug时,如果有打开memory窗口或打开ADC寄存器。
该标志会被debug清除。
*/
uint8_t g_EOCFlag = 0; //规则组转换结束标志。
uint8_t g_IEOCFlag = 0; //注入组转换结束标志。
/**
 * ADC_DMACallback
 *
 * @param[in] void
 * @return void
 *
 * @brief ADC 中断回调函数。
 */
void ADC_Callback(void *device, uint32_t wpara, uint32_t lpara)
{   
//    if (wpara & ADC_STR_IEOC_Msk)    //注入组中断标志
//    {
//        g_IEOCFlag = 1;
//        g_adcInjectValue[0] = ADC_GetInjectData(ADC0, 0);
//        g_adcInjectValue[1] = ADC_GetInjectData(ADC0, 1);
//        g_adcInjectValue[2] = ADC_GetInjectData(ADC0, 2);
//        g_adcInjectValue[3] = ADC_GetInjectData(ADC0, 3);
//    }
//    if (wpara & ADC_STR_EOC_Msk)    //规则组中断标志
//    {
//        g_EOCFlag = 1;
//    }
//    if (wpara & ADC_STR_AMO_Msk)    //模拟监控中断标志
//    {
//        g_AMOFlag = 1;
//    }
}
/**
 * ADC_DMACallback
 *
 * @param[in]  wpara:dmaChannelStatus 
 *             lpara:0
 * @return 0
 *
 * @brief ADC DMA中断回调函数。
 */

void ADC_DMACallback(void *device, uint32_t wpara, uint32_t lpara)       //四个通道采集完一次在用
{
    /*
     wparam为DMA通道状态,状态含义可参考CHANNELx_STATUS寄存器,
     CHANNELx_STATUS[2] 传输错误
     CHANNELx_STATUS[1] 半传输完成(相对设置的transferNum,如果半传输中断有使能,transferNum设为6,则DATA_TRANS_NUM为3时产生中断,进入回调)
     CHANNELx_STATUS[0] 传输完成
    */
    if ((wpara & 0x01) == 0x1)
    {
        g_dmaFinish = 1;
//				printf("123123\r\n");
    }
					
    if ((wpara & 0x02) == 0x2)
    {
        g_halfDmaFinish = 1;
    }
    if ((wpara & 0x04) == 0x4)
    {
        g_dmaTransError = 1;
				
    }
	   
}
/**
 * ADC_DMAInit
 *
 * @param[in] void
 * @return void
 *
 * @brief ADC DMA初始化,配置DMA相关参数。
 */
void ADC_DMAInit(void)
{
    uint32_t tmpMemStartAddr = (uint32_t)&g_ADCValueBuffer[0];
    uint32_t tmpMemEndAddr = (uint32_t)&g_ADCValueBuffer[DMA_TRANSFER_NUM+1]; ///<Setting memory DMA address
    DMA_ConfigType tmpDMAConfig;
    memset(&tmpDMAConfig, 0x00, sizeof(DMA_ConfigType));
    
    tmpDMAConfig.memStartAddr = tmpMemStartAddr; //设置DMA开始地址
    tmpDMAConfig.memEndAddr = tmpMemEndAddr;//设置DMA结束地址
    tmpDMAConfig.periphStartAddr = (uint32_t)(&(ADC0->RDR)); ///<Move ADC DR to memory
    tmpDMAConfig.channelEn = ENABLE;                     ///<使能DMAx通道
    tmpDMAConfig.finishInterruptEn = ENABLE;                   ///<使能DMA传输完成中断
    tmpDMAConfig.halfFinishInterruptEn = DISABLE;               ///<去能DMA半传输完成中断
    tmpDMAConfig.errorInterruptEn = ENABLE;                    ///<使能DMA传输错误中断
    tmpDMAConfig.channelPriority = DMA_PRIORITY_VERY_HIGH;///<设置DMA通道优先级,0~3 :优先级由低到高
    tmpDMAConfig.circular = DISABLE;                      ///<使能循环模式,如果只想工作一次,设为0即可。
    tmpDMAConfig.direction = DMA_READ_FROM_PERIPH;          //<0: 从外设读取,1:从存储器读取
    tmpDMAConfig.MEM2MEM = DISABLE;                     ///<0:在非存储器与存储器之间传输,1:在存储器与存储器之间传输
    tmpDMAConfig.memByteMode = DMA_MEM_BYTE_MODE_1TIME;  ///<MEM字分割传输数,0:32-bit,1:16-bit[15:0]; 2:16-bit[23:16][7:0];3:8-bit。详情可参考AC781X芯片手册  表20-2 可编程数据宽度&数据对齐 
    tmpDMAConfig.memIncrement = ENABLE;                  ///<1:MEM地址增加
    tmpDMAConfig.periphIncrement = DISABLE;               ///<0:外设地址固定
    tmpDMAConfig.memSize = DMA_MEM_SIZE_16BIT;           //<0:8-bit,1:16-bit,2:32-bit
    tmpDMAConfig.periphSize = DMA_PERIPH_SIZE_16BIT;     //<0:8-bit,1:16-bit,2:32-bit
    tmpDMAConfig.transferNum = DMA_TRANSFER_NUM;                      //<DMA通道传输长度
    tmpDMAConfig.periphSelect = DMA_PEPIRH_ADC0;  //外设选择
    tmpDMAConfig.callBack = ADC_DMACallback; ///<设置DMA中断回调

    DMA_Init(DMA0_CHANNEL0, &tmpDMAConfig);                     ///<ADC 使用DMA1通道,每个模块对应的DMA通道,可参考 AC781X芯片手册 表20-1 DMA请求列表
    NVIC_EnableIRQ(DMA0_CHANNEL0_IRQn);                              ///<使能DMA1中断请求
}

void CTU_Config(void)
{
    CTU_ConfigType ctuConfig;
    memset(&ctuConfig, 0x00, sizeof(ctuConfig));
    ctuConfig.uart0RxFilterEn = DISABLE;  //去能UART0_RX滤波
    ctuConfig.rtcCaptureEn = DISABLE;  //去能RTC捕获
    ctuConfig.acmpCaptureEn = DISABLE;  //去能ACMP捕获
    ctuConfig.uart0RxCaptureEn = DISABLE;  //去能UART0_RX捕获
    ctuConfig.uartTxModulateEn = DISABLE;  //去能UART0_TX调制
    ctuConfig.clkPsc = CTU_CLK_PRESCALER_1;  //分频    
    ctuConfig.adcRegularTriggerSource = CTU_TRIGGER_ADC_TIMER_CH0_OVERFLOW; //Timer0触发ADC规则组采样。
    ctuConfig.delay0Time = 0;  //触发延迟
    CTU_Init(&ctuConfig);
}

/**
 * TIMER_Callback
 *
 * @param[in] timerIndex
 * @return void
 *
 * @brief TIMER中断回调函数
 */
void TIMER_Callback(void *device, uint32_t wpara, uint32_t lpara)     //定时器中断10ms采集一次
{                                                                         //1000ms采集100次
    if (TIMER_CHANNEL0 == device)     //定时器通道
    {
        g_timerCnt++;
			if(g_timerCnt==100)            //累加100次进此程序取平均值
			{
				   g_timerCnt=0;              //清零
			     int i;
			for(i=0;i<100;i++)    //每个通道100次
			{
				adc_avge[0]+=g_ADCValueBuffer[4*i+0];          //累加值        
				adc_avge[1]+=g_ADCValueBuffer[4*i+1];
				adc_avge[2]+=g_ADCValueBuffer[4*i+2];
				adc_avge[3]+=g_ADCValueBuffer[4*i+3];
			}
    		printf("start:\r\n");
				for(i=0;i<4;i++)                //4个通道
				{
        //adc_avge[i]/=100;     存在误差
					printf("Sample%d : %0.2f, ", i+1,(float)adc_avge[i]*4.8f/(4096.0f*100.0f));    //基准电压4.8V
			   	adc_avge[i]=0;               
				}
				  printf("\r\n");
				  printf("end\r\n");
				
			    ADC_DMAInit();   //ADC DMA初始化
      }
	  }
		
}
/**
 * TIMER0_Init
 *
 * @param[in] void
 * @return void
 *
 * @brief TIMER0初始化
 */
void TIMER0_Init(void)
{
    TIMER_ConfigType timerConfig = {0};
    timerConfig.periodValue = Delay10ms;//10ms定时   采集一次
    timerConfig.interruptEn = ENABLE;//使能中断
    timerConfig.linkModeEn = DISABLE;//级联模式去能
    timerConfig.callBack = TIMER_Callback;//设置中断回调函数
    timerConfig.timerEn = ENABLE;//使能定时器
    TIMER_Init(TIMER_CHANNEL0, &timerConfig);
}


/**
 * ADC_init
 *
 * @param[in] void
 * @return void
 *
 * @brief 初始化ADC,配置ADC参数。
 */
void ADC_init()
{
    ADC_ConfigType tempAdcConfig;
    ADC_ConfigType* adcConfig;
    adcConfig = &tempAdcConfig;
    //配置PINMUX
    GPIO_SetFunc(GPIOA, GPIO_PIN11, GPIO_FUN2);///<ADC_IN11 Analog function enable
	  GPIO_SetFunc(GPIOA, GPIO_PIN10, GPIO_FUN2);///<ADC_IN10 Analog function enable
    GPIO_SetFunc(GPIOA, GPIO_PIN9, GPIO_FUN2);///<ADC_IN9 Analog function enable
    GPIO_SetFunc(GPIOA, GPIO_PIN8, GPIO_FUN2);///<ADC_IN8 Analog function enable

    adcConfig->clkPsc = ADC_CLK_PRESCALER_1; ///<Set ADC Clk = 24M/2/(0+1)
    adcConfig->scanModeEn = ENABLE;                   //扫描模式        4个通道     
    adcConfig->continousModeEn = DISABLE;             //连续模式       定时器触发
    adcConfig->regularDiscontinousModeEn = DISABLE;   //1:打开规则组间断转换模式
    adcConfig->injectDiscontinousModeEn = DISABLE;    //1:打开注入组间断转换模式
    adcConfig->injectAutoModeEn = DISABLE;            //1:自动注入模式
    adcConfig->intervalModeEn = DISABLE;              //1:注入组为间隔转换模式
    adcConfig->regularDiscontinousNum = 0;            //
    adcConfig->EOCInterruptEn = ENABLE;              //EOC中断使能
    adcConfig->IEOCInterruptEn = ENABLE;             //IEOC中断使能
    adcConfig->interruptEn = DISABLE;                 //中断使能
    adcConfig->regularDMAEn = ENABLE;                 //使能ADC DMA
    adcConfig->regularTriggerMode = ADC_TRIGGER_EXTERNAL;//ADC触发源,外部触发 TIM
    adcConfig->injectTriggerMode = ADC_TRIGGER_INTERNAL; //ADC触发源,内部触发
    adcConfig->regularSequenceLength = 4;               //规则组长度设为4
    adcConfig->injectSequenceLength = 0;               //注入组长度设为0
    adcConfig->dataAlign = ADC_DATA_ALIGN_RIGHT;       //右对齐
    adcConfig->callBack =  ADC_Callback;               //回调
    adcConfig->powerMode = ADC_POWER_ON;               //上电
    ADC_Init(ADC0, adcConfig);                      //<ADC works Mode Config
    /*
        ADC转换率计算公式:
        转换时间= 采样时间+转换时间+同步时间    采样时间越大,周期越大,通道才能全部转换完
        转换时间= (SPT+12)/ADC模块时钟频率+5/APB时钟频率
        备注:
        1.同步时间为5个APB CLK。
        2.ADC时钟频率 = APB时钟频率 /(分频系数+1)
	*/
    //规则组通道设置
    ADC_SetRegularGroupChannel(ADC0, ADC_CH_0, ADC_SPT_CLK_215, 0);  
    ADC_SetRegularGroupChannel(ADC0, ADC_CH_1, ADC_SPT_CLK_215, 1);  //采样&转换时间= (215+12)/24000000 + 5/24000000 = 1us
    ADC_SetRegularGroupChannel(ADC0, ADC_CH_2, ADC_SPT_CLK_215, 2);  //采样&转换时间= (7+12)/24000000 + 5/24000000 = 1us
    ADC_SetRegularGroupChannel(ADC0, ADC_CH_3, ADC_SPT_CLK_215, 3);  
    //规则组DMA初始化
    ADC_DMAInit();   //ADC DMA初始化
}

//void sampleValueDeal(void)
//{
//		 int i;
//	//ZE03 H2输出
//	for(i = 0; i < UART_RX_BUFF_LENGTH; i++)
//	{
//		if(i == UART_RX_BUFF_LENGTH -1)
//			printf("%x\r\n", g_uartRxDataBuff[i]);
//		else
//			printf("%x ", g_uartRxDataBuff[i]);
//	}
//	printf("gasConc = %d\r\n", gasConcentration);
//	//  ADC_DMAInit();
//}


/**
 * ADC_SampleSoftwareTrigerADC
 *
 * @param[in] void
 * @return void
 *
 * @brief Timer定时触发规则组ADC_CHANNEL0单次采样。
 */
void ADC_SampleSoftwareTrigerADC(void)
{
	  CTU_Config();
    ADC_init();
	  TIMER0_Init();
    while(1)
    {
        //每次转换数据清零
        memset(g_ADCValueBuffer, 0x00, sizeof(g_ADCValueBuffer));

        ADC_SoftwareStartRegularConvert(ADC0);  ///软件触发规则组采样

        udelay(4);//需要采样8个通道,延时8us以保证数据采样完成
        //	sampleValueDeal(); 
			
		LED3_TOGGLE;
		LED2_TOGGLE;
    mdelay(1000);      //延时1s     1000ms
			
    }
	
}
   
  //gpio.c
#include "gpio.h"

/*************<macro>******************/
/*定义按键动作,引脚为低电平为释放状态,引脚为高电平为按下状态.*/
#define KEY_PRESS      		(GPIO_LEVEL_LOW)
#define KEY_RELEASE    		(GPIO_LEVEL_HIGH)

#define GET_KEY6_STS()		(GPIO_GetPinLevel(KEY6_PORT, KEY6_PIN))	
#define GET_KEY7_STS()		(GPIO_GetPinLevel(KEY7_PORT, KEY7_PIN))	


/*************<enum>*******************/


/*************<union>******************/


/*************<struct>*****************/


/*************<variable>***************/
uint8_t 	g_getKey6Sts;		/*KEY6按键状态*/
uint8_t 	g_getKey7Sts;		/*KEY7按键状态*/

uint8_t		g_scanKeyTime;		/*扫描按键间隔时间*/
uint16_t	g_blinkLedTime;		/*LED闪烁频率控制时间*/
uint16_t	g_blinkLedTgtTime;	/*LED目标闪烁频率*/


/*************<prototype>**************/

/**
* @prototype GPIO_LedInit(void)
*
* @param[in] void
* @return	 void
*
* @brief  	 初始化LED引脚.
*/
void GPIO_LedInit(void)
{
	/*初始化引脚功能,如果引脚上电后默认为GPIO,可省略掉初始化步骤.
	  有部分引脚上电默认为非GPIO,则必须选择其功能为GPIO才能作为GPIO使用.*/
	GPIO_SetFunc(LED2_PORT, LED2_PIN, GPIO_FUN0);/*功能复用选择.*/
	GPIO_SetFunc(LED3_PORT, LED3_PIN, GPIO_FUN0);
	
	/*设置LED引脚为GPIO输出.*/
	GPIO_SetDir(LED2_PORT, LED2_PIN, GPIO_OUT);
	GPIO_SetDir(LED3_PORT, LED3_PIN, GPIO_OUT);
	
	/*上电默认LED点亮.*/
	LED2_ON;
	LED3_ON;
	
//	/*初始化控制变量.*/
//	g_blinkLedTime 	  = 0;
//	g_blinkLedTgtTime = BLINK_LED_DFTT;
}

/**
* @prototype GPIO_KeyInit(void)
*
* @param[in] void
* @return	 void
*
* @brief  	 初始化按键引脚.
*/
//void GPIO_KeyInit(void)
//{
//	/*初始化引脚功能,如果引脚上电后默认为GPIO,可省略掉初始化步骤.
//	  有部分引脚上电默认为非GPIO,则必须选择其功能为GPIO才能作为GPIO使用.*/
//	GPIO_SetFunc(KEY6_PORT, KEY6_PIN, GPIO_FUN0);/*功能复用选择.*/
//	GPIO_SetFunc(KEY7_PORT, KEY7_PIN, GPIO_FUN0);
//	
//	/*设置按键引脚为输入,检测按键动作.*/
//	GPIO_SetDir(KEY6_PORT, KEY6_PIN, GPIO_IN);
//	GPIO_SetDir(KEY7_PORT, KEY7_PIN, GPIO_IN);
//	
//	/*使能按键引脚的上拉.*/
//	GPIO_SetPullup(KEY6_PORT, KEY6_PIN, ENABLE);
//	GPIO_SetPullup(KEY7_PORT, KEY7_PIN, ENABLE);
//	
//	/*初始化控制变量.*/
//	g_scanKeyTime = 0;
//	g_getKey6Sts  = KEY_RELEASE;
//	g_getKey7Sts  = KEY_RELEASE;
//}

/**
* @prototype GPIO_ToggleLedPrd(void)
*
* @param[in] void
* @return	 void
*
* @brief  	 周期性闪烁LED.
*/
void GPIO_ToggleLedPrd(void)
{
	/*周期性地检查LED闪烁,LED2和LED3同时闪烁.*/
	if (g_blinkLedTime >= g_blinkLedTgtTime)
	{
		g_blinkLedTime = 0;
		
		/*翻转LED3和LED3.*/
		LED2_TOGGLE;
		LED3_TOGGLE;
	}
}


#ifndef ADC_SAMPLE_H_
#define ADC_SAMPLE_H_
#ifdef __cplusplus
extern "C" {
#endif
#include "string.h"
#include "ac780x_adc.h"
#include "ac780x_adc_reg.h"
#include "ac780x_gpio.h"
#include "ac780x.h"
#include "ac780x_debugout.h"
#include "ac780x_dma.h"
#include "ac780x_ctu.h"
#include "ac780x_timer.h"
#include "ac780x_pwm.h"
#include "gpio.h"


#define Delay5us                      (APB_BUS_FREQ/200000-1)
#define Delay10ms                      (APB_BUS_FREQ/200-1)*2
#define Delay1s                       (APB_BUS_FREQ-1)
#define DMA_TRANSFER_NUM               400
#define UART_RX_BUFF_LENGTH            400
#define HEX_VALUE                    0x1A07F503           //串口发送指令

extern uint8_t g_uartRxDataBuff[UART_RX_BUFF_LENGTH];
void  ADC_DMACallback(void *device, uint32_t wpara, uint32_t lpara);
extern uint16_t g_ADCValueBuffer[DMA_TRANSFER_NUM+1];
extern uint16_t gasConcentration;//气体浓度
void ADC_SampleSoftwareTrigerADC(void);
void InitUart1(void);
#ifdef __cplusplus
}
#endif

#endif


/* Copyright Statement:
*
* This software/firmware and related documentation ("AutoChips Software") are
* protected under relevant copyright laws. The information contained herein is
* confidential and proprietary to AutoChips Inc. and/or its licensors. Without
* the prior written permission of AutoChips inc. and/or its licensors, any
* reproduction, modification, use or disclosure of AutoChips Software, and
* information contained herein, in whole or in part, shall be strictly
* prohibited.
*
* AutoChips Inc. (C) 2020. All rights reserved.
*
* BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("AUTOCHIPS SOFTWARE")
* RECEIVED FROM AUTOCHIPS AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
* ON AN "AS-IS" BASIS ONLY. AUTOCHIPS EXPRESSLY DISCLAIMS ANY AND ALL
* WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
* WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
* NONINFRINGEMENT. NEITHER DOES AUTOCHIPS PROVIDE ANY WARRANTY WHATSOEVER WITH
* RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
* INCORPORATED IN, OR SUPPLIED WITH THE AUTOCHIPS SOFTWARE, AND RECEIVER AGREES
* TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
* RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
* OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN AUTOCHIPS
* SOFTWARE. AUTOCHIPS SHALL ALSO NOT BE RESPONSIBLE FOR ANY AUTOCHIPS SOFTWARE
* RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
* STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND AUTOCHIPS'S
* ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE AUTOCHIPS SOFTWARE
* RELEASED HEREUNDER WILL BE, AT AUTOCHIPS'S OPTION, TO REVISE OR REPLACE THE
* AUTOCHIPS SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
* CHARGE PAID BY RECEIVER TO AUTOCHIPS FOR SUCH AUTOCHIPS SOFTWARE AT ISSUE.
*/

/*!
 * @file ac780x_debugout.c
 *
 * @brief This file provides debug information output integration functions.
 *
*/
/* ===========================================  Includes  =========================================== */
#include "ac780x.h"
#include "ac780x_gpio.h"
#include "ac780x_uart.h"
#include "ac780x_uart_reg.h"
#include "adc_sample.h"
/* ============================================  Define  ============================================ */
#define MAX_DEBUG_BUFF_SIZE 100             /* define uart max receive buffer size */

#define DEBUG_UART           UART2          /* define uart2 for debug output   */
#define DEBUG_UART_IRQ       UART2_IRQn     /* define uart2 interrupt vector   */
#define DEBUG_UART_CLK       CLK_UART2      /* define uart2 ckgen clock value  */
#define DEBUG_UART_SRST      SRST_UART2     /* define uart2 ckgen reset value  */
#define DEBUG_UART_SMP       16.0F
#define DEBUG_UART_BAUDRATE  115200.0F

#define DEBUG_UART_TX     GPIOB,GPIO_PIN9   /* define uart2 tx gpio */
#define DEBUG_UART_RX     GPIOB,GPIO_PIN10  /* define uart2 rx gpio */

/* ============================================  UART1  ============================================ */

#define DEBUG_UART1           UART1          /* define uart1 for debug output   */
#define DEBUG_UART1_IRQ       UART1_IRQn     /* define uart1 interrupt vector   */
#define DEBUG_UART1_CLK       CLK_UART1      /* define uart1 ckgen clock value  */
#define DEBUG_UART1_SRST      SRST_UART1     /* define uart1 ckgen reset value  */
#define DEBUG_UART1_SMP       16.0F
#define DEBUG_UART1_BAUDRATE  9600.0F

//#define DEBUG_UART_TX     GPIOA,GPIO_PIN4   /* define uart1 tx gpio */
//#define DEBUG_UART_RX     GPIOA,GPIO_PIN5   /* define uart1 rx gpio */
/* ===========================================  Typedef  ============================================ */
/* ==========================================  Variables  =========================================== */
/* debug uart receive buf */
//uint8_t g_debugBuff[MAX_DEBUG_BUFF_SIZE] = {0};

uint8_t g_uartRxDataBuff[UART_RX_BUFF_LENGTH]={0};     //接收数组
uint16_t g_uartRxDataIndex;

extern uint16_t adc_xishu[4];        //系数
extern uint16_t adc_xiuzheng[4];    //电压修正值
extern uint32_t adc_avge[4];        //电压采集实际值
	
uint8_t *g_uartTxDataPoint;
uint16_t g_uartTxDataLength;
uint16_t g_uartTxDataIndex;
uint8_t receiveStart;
uint16_t gasConcentration;//气体浓度
float resolution;//分辨率
/* debug init flag */
static uint8_t s_debugInit = 0;

/* define std FILE struct */
struct __FILE
{
    int handle;
};

/* refine stdout,stdin,stderr */
FILE __stdout;
FILE __stdin;
FILE __stderr;
/* ====================================  Functions declaration  ===================================== */

/* ======================================  Functions define  ======================================== */

/*!
* @brief refine _sys_exit
*
* @param[in] x:  no use
* @return always 0
*/
int _sys_exit(int x)
{
    x = x;
    return 0;
}

/*!
* @brief refine _ttywrch
*
* @param[in] x:  no use
* @return always 0
*/
int _ttywrch(int x)
{
    x = x;
    return 0;
}

/*!
* @brief put a char to UART
*
* @param[in] f:  file pointer for the std input
* @param[in] ch: the char to put
* @return return the char of be put
*/
int fputc(int ch, FILE *f)
{
    if (s_debugInit)
    {
        UART_SendData(DEBUG_UART, ch);
    }
    return ch;
}

/*!
* @brief get a char
*
* @param[in] f: file pointer for the std input
* @return -1: not get char,  other: the char get from UART
*/
int fgetc(FILE* f)
{
    int ch = -1;
    if (s_debugInit)
    {
        if (UART_RxIsDataReady(DEBUG_UART))
        {
            ch = UART_ReceiveData(DEBUG_UART);
        }
    }

    return ch;
}

/*!
* @brief set the debug out is invalid
*
* @param[in] none
* @return none
*/
void DeinitDebug(void)
{
    s_debugInit = 0;
}

/*!
* @brief init debug out , and set the debug out is valid
*
* @param[in] none
* @return none
*/
void InitDebug(void)           //串口2
{
#ifdef DEBUG_CMD_INTERRUPT
    NVIC_SetPriority(DEBUG_UART_IRQ, 3);
    NVIC_ClearPendingIRQ(DEBUG_UART_IRQ);
    NVIC_EnableIRQ(DEBUG_UART_IRQ);
#endif

    GPIO_SetFunc(DEBUG_UART_TX, GPIO_FUN3);
    GPIO_SetFunc(DEBUG_UART_RX, GPIO_FUN3);
    CKGEN_Enable(DEBUG_UART_CLK, ENABLE);
    CKGEN_SoftReset(DEBUG_UART_SRST, ENABLE);

    UART_SetDivisor(DEBUG_UART, (float)APB_BUS_FREQ / DEBUG_UART_SMP / DEBUG_UART_BAUDRATE);

    UART_SetDataBits(DEBUG_UART, UART_WORD_LEN_8BIT);
    UART_SetStopBit(DEBUG_UART, UART_STOP_1BIT);
    UART_EnableTX(DEBUG_UART, ENABLE);
    UART_EnableRX(DEBUG_UART, ENABLE);
    UART_Set2ByteFIFO(DEBUG_UART, ENABLE);
	
    UART_SetInterruptEn(DEBUG_UART, 9);
	
    s_debugInit = 1;
}


/**
* UartEventCallback
*
* @param[in] device: UART_Type pointer
* @param[in] wpara: UART lsr0 register
* @param[in] lpara: UART lsr1 register
* @return    none
*
* @brief   uart receive handle
*/
static void UartEventCallback(void *device, uint32_t wpara, uint32_t lpara)       //串口2
{
    uint8_t data = 0;
	   //int  b=1;
    UART_Type *uart_Device = (UART_Type *)device;
    /*rx interrupt*/                                 //接收
    if ((uart_Device->IER & UART_IER_ERXNE_Msk) && (wpara & UART_LSR0_DR_Msk))
    {
//			uart_Device->RBR =g_uartRxDataBuff[g_uartRxDataIndex++];
			//g_uartRxDataBuff[g_uartRxDataIndex++]=UART_ReceiveData(UART2);
		//	printf("g_uartRxDataBuff:%d\r\n",g_uartRxDataBuff[0]);
		
       data = uart_Device->RBR; 	   //接收数据寄存器	
			
//		if(data == 0xff)//接收到起始位
//			receiveStart = 1;
//		if(receiveStart == 1)
			g_uartRxDataBuff[g_uartRxDataIndex++] = data;
        
        if (g_uartRxDataIndex >= UART_RX_BUFF_LENGTH)
        {
            g_uartRxDataIndex = 0;
		      	//receiveStart = 0;
				 if((g_uartRxDataBuff[0] == 0x1A)&&(g_uartRxDataBuff[1] == 0x07)&&
					  (g_uartRxDataBuff[2] == 0xF5)&&(g_uartRxDataBuff[3] == 0x03))
					{
						printf("求系数:");
						for(int a=0;a<4;a++)            //第一次求系数
						{
					  	adc_xishu[a] =100.0f/adc_avge[a];               //1/adc_avge[a]/100
							printf("adc_xishu%d:%0.2f ",a+1,(float)adc_xishu[a]*4.8f/4096.0f);
						}
						  printf("\r\n");
						  printf("系数已求");
						
						for(int i=0;i<4;i++)              //修正电压
						{
						  adc_xiuzheng[i]=adc_avge[i]*adc_xishu[i];          
							printf("adc_xiuzheng%d: %0.2f,\r\n ", i+1,(float)adc_xiuzheng[i]*4.8f/4096.0f);
							if(((float)adc_xiuzheng[i]*4.8f/4096.0f)==4.8)
							printf("tongdao[i+1]:%d,",1);
							if(((float)adc_xiuzheng[i]*4.8f/4096.0f)<4.8)
							printf("tongdao[i+1]:%d,",0);
							printf("\r\n");
					  }
						
//			if(g_uartRxDataBuff[5] == 0x00)
//				resolution = 1;
//			else if(g_uartRxDataBuff[5] == 0x01)
//				resolution = 0.1;
//			else if(g_uartRxDataBuff[5] == 0x02)
//				resolution = 0.2;
//			gasConcentration = (g_uartRxDataBuff[2] * 256 + g_uartRxDataBuff[3] - 200) * resolution;
			//printf("gasConc = %d\r\n", gasConcentration);
        }
    }
				
    /*tx interrupt*/            //串口发送
    if ((uart_Device->IER & UART_IER_ETXE_Msk) && (wpara & UART_LSR0_THRE_Msk)) 
    {
        uart_Device->RBR = g_uartTxDataPoint[g_uartTxDataIndex++];

        if (g_uartTxDataIndex >= g_uartTxDataLength)     //
        {
            UART_SetTXEInterrupt(device, DISABLE);  ///<发送最后一个字节时关闭发送空中断
        }
    }
}
}

void InitUart1(void)            //串口1
{
	  UART_ConfigType  uartConfig = {0};
    
    //set pin mux
    GPIO_SetFunc(GPIOA, GPIO_PIN4, GPIO_FUN3);
    GPIO_SetFunc(GPIOA, GPIO_PIN5, GPIO_FUN3);
    
    uartConfig.baudrate = 9600;
    uartConfig.dataBits = UART_WORD_LEN_8BIT;
    uartConfig.stopBits = UART_STOP_1BIT;
    uartConfig.parity = UART_PARI_NO;
    uartConfig.fifoByteEn = ENABLE;              //<must enable fifoByte when use DMA
    uartConfig.dmaEn = UART_DMA_TXRX_EN;
    uartConfig.callBack = UartEventCallback;    //<uart1 interrupt callback
    UART_Init(UART1, &uartConfig);
    
    UART_SetRXNEInterrupt(UART1, ENABLE);
	
    ///Enable UARTx interrupt
    NVIC_SetPriority(UART1_IRQn, 3);
    NVIC_ClearPendingIRQ(UART1_IRQn);
    NVIC_EnableIRQ(UART1_IRQn);
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值