STM32 中重定向printf 和 scanf

2023-05-16

uart.c

  如果使用#pragma import(__use_no_semihosting),则在MDK中不勾选use Microlib。当前代码直接重定向没使用#pragma import(__use_no_semihosting),故需要选择use Microlib。

  

#include "usart.h"
#include <stdio.h>
#include <string.h>
#include "ad5592.h"
#include "ad5766.h"
#include "ad7699.h"
// 	
#define SELF_CHECK_CMD_R    			0x01
#define SELF_CHECK_CMD_T    			0x02
#define LASER_CMD_R         			0x03
#define LASER_CMD_T         			0x04
#define LASER_PARAMETER_CMD_R     0x05
#define LASER_PARAMETER_CMD_T     0x06
#define TEC_PARAMETER_CMD_R       0x07
#define TEC_PARAMETER_CMD_T       0x08
#define MODULATOR_CMD_R           0x09
#define MODULATOR_CMD_T           0x0A
#define FFT_CMD_R                 0x0B
#define FFT_CMD_T                 0x0C


//如果使用os,则包括下面的头文件即可.
#if SYSTEM_SUPPORT_OS
#include "includes.h"					//os 使用	  
#endif
	  UART_HandleTypeDef UART1_Handler; //UART句柄
//加入以下代码,支持printf函数,而不需要选择use MicroLIB	  
//#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)	
#if 0
#pragma import(__use_no_semihosting)             
//标准库需要的支持函数                 
struct __FILE 
{ 
	int handle; 
}; 

FILE __stdout;       
//定义_sys_exit()以避免使用半主机模式    
void _sys_exit(int x) 
{ 
	x = x; 
} 
//重定义fputc函数 
int fputc(int ch, FILE *f)
{ 	
	while((USART1->ISR&0X40)==0);//循环发送,直到发送完毕   
	USART1->TDR=(u8)ch;      
	return ch;
}
#endif 

#if 1
	//重定义fputc函数 
int fputc(int ch, FILE *f)
{ 	
	while((USART1->ISR&0X40)==0);//循环发送,直到发送完毕   
	//USART1->RQR |= USART_RQR_TXFRQ;
	USART1->TDR=(u8)ch;      
	return ch;
}

int fgetc(FILE *f)
{
	while((USART1->ISR & UART_FLAG_RXNE) == RESET);
	//USART1->RQR |= USART_RQR_RXFRQ;
	return (int)(USART1->RDR);

}


#endif



#if EN_USART1_RX   //如果使能了接收
//串口1中断服务程序
//注意,读取USARTx->SR能避免莫名其妙的错误   	
u8 USART_RX_BUF[USART_REC_LEN];     //接收缓冲,最大USART_REC_LEN个字节.
//接收状态
//bit15,	接收完成标志
//bit14,	接收到0x0d
//bit13~0,	接收到的有效字节数目
u16 USART_RX_STA=0;       //接收状态标记	
u16 gUsartOneReceiveFlag = 0;      //接收到一帧数据标志
u8 aRxBuffer[RXBUFFERSIZE];       //HAL库使用的串口接收缓冲
u8 gFrameInfo[RXBUFFERSIZE];
u16 gADC5767_ADCVal[8];

u8 FFT_Flag = 0;                  //FFT实时数据上报标志
extern ad5766_dev *dev;


typedef struct{
	uint16_t Head;
	uint8_t  SourceID;
	uint8_t  DestinationID;
	uint8_t  Command;
	uint8_t  Data[9];
	uint16_t Tail;
}FrameInfo_TypeDef;



//初始化IO 串口1 
//bound:波特率
void uart_init(u32 bound)
{	
	//UART 初始化设置
	UART1_Handler.Instance=USART1;					            //USART1
	UART1_Handler.Init.BaudRate=bound;				          //波特率
	UART1_Handler.Init.WordLength=UART_WORDLENGTH_8B;   //字长为8位数据格式
	UART1_Handler.Init.StopBits=UART_STOPBITS_1;	      //一个停止位
	UART1_Handler.Init.Parity=UART_PARITY_NONE;		      //无奇偶校验位
	UART1_Handler.Init.HwFlowCtl=UART_HWCONTROL_NONE;   //无硬件流控
	UART1_Handler.Init.Mode=UART_MODE_TX_RX;		        //收发模式
	HAL_UART_Init(&UART1_Handler);					            //HAL_UART_Init()会使能UART1
	
	//HAL_UART_Receive_IT(&UART1_Handler, (u8 *)aRxBuffer, RXBUFFERSIZE);//该函数会开启接收中断:标志位UART_IT_RXNE,并且设置接收缓冲以及接收缓冲接收最大数据量
  
} 

//UART底层初始化,时钟使能,引脚配置,中断配置
//此函数会被HAL_UART_Init()调用
//huart:串口句柄

void HAL_UART_MspInit(UART_HandleTypeDef *huart)
{
    //GPIO端口设置
	GPIO_InitTypeDef GPIO_Initure;
	
	if(huart->Instance==USART1)//如果是串口1,进行串口1 MSP初始化
	{
		__HAL_RCC_GPIOA_CLK_ENABLE();			//使能GPIOA时钟
		__HAL_RCC_GPIOB_CLK_ENABLE();			//使能GPIOA时钟
		__HAL_RCC_USART1_CLK_ENABLE();			//使能USART1时钟
	  
		#if 1
		GPIO_Initure.Pin=GPIO_PIN_9;			//PA9
		GPIO_Initure.Mode=GPIO_MODE_AF_PP;		//复用推挽输出
		GPIO_Initure.Pull=GPIO_PULLUP;			//上拉
		GPIO_Initure.Speed=GPIO_SPEED_FAST;		//高速
		GPIO_Initure.Alternate=GPIO_AF7_USART1;	//复用为USART1
		HAL_GPIO_Init(GPIOA,&GPIO_Initure);	   	//初始化PA9

		GPIO_Initure.Pin=GPIO_PIN_10;			//PA10
		HAL_GPIO_Init(GPIOA,&GPIO_Initure);	   	//初始化PA10
		#endif
		
		#if 0
		GPIO_Initure.Pin=GPIO_PIN_6;			       //PB6
		GPIO_Initure.Mode=GPIO_MODE_AF_PP;		   //复用推挽输出
		GPIO_Initure.Pull=GPIO_PULLUP;			     //上拉
		GPIO_Initure.Speed=GPIO_SPEED_FAST;		   //高速
		GPIO_Initure.Alternate=GPIO_AF7_USART1;	 //复用为USART1
		HAL_GPIO_Init(GPIOB,&GPIO_Initure);	   	 //初始化PB6

		GPIO_Initure.Pin=GPIO_PIN_7;			       //PB7
		HAL_GPIO_Init(GPIOB,&GPIO_Initure);	   	//初始化PB7
		#endif
#if EN_USART1_RX
		HAL_NVIC_EnableIRQ(USART1_IRQn);				    //使能USART1中断通道
		HAL_NVIC_SetPriority(USART1_IRQn,0,0);			//抢占优先级3,子优先级3
#endif	
	}

}

//接收完成处理回调函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	if(huart->Instance==USART1)//如果是串口1
	{
//		if((USART_RX_STA&0x8000)==0)//接收未完成
//		{
//			if(USART_RX_STA&0x4000)//接收到了0x0d
//			{
//				if(aRxBuffer[0]!=0x0a)USART_RX_STA=0;//接收错误,重新开始
//				else USART_RX_STA|=0x8000;	//接收完成了 
//			}
//			else //还没收到0X0D
//			{	
//				if(aRxBuffer[0]==0x0d)USART_RX_STA|=0x4000;
//				else
//				{
//					USART_RX_BUF[USART_RX_STA&0X3FFF]=aRxBuffer[0] ;
//					USART_RX_STA++;
//					if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收	  
//				}		 
//			}
		   memset(gFrameInfo, 0, RXBUFFERSIZE);	
			 memcpy(gFrameInfo, aRxBuffer, RXBUFFERSIZE);
		   gUsartOneReceiveFlag = 1; //接收一帧数据标志,待处理
		   HAL_UART_Receive_IT(&UART1_Handler,(u8 *)aRxBuffer, RXBUFFERSIZE);
		  //}

	}
}

#if 0
//串口1中断服务程序
void USART1_IRQHandler(void)                	
{ 
	u32 timeout=0;
    u32 maxDelay=0x1FFFF;
#if SYSTEM_SUPPORT_OS	 	//使用OS
	OSIntEnter();    
#endif
	
	HAL_UART_IRQHandler(&UART1_Handler);	//调用HAL库中断处理公用函数
	
	timeout=0;
  while (HAL_UART_GetState(&UART1_Handler)!=HAL_UART_STATE_READY)//等待就绪
	{
        timeout++;超时处理
        if(timeout>maxDelay) break;		
	}
     
	timeout=0;
	while(HAL_UART_Receive_IT(&UART1_Handler,(u8 *)aRxBuffer, RXBUFFERSIZE)!=HAL_OK)//一次处理完成之后,重新开启中断并设置RxXferCount为1
	{
        timeout++; //超时处理
        if(timeout>maxDelay) break;	
	}
#if SYSTEM_SUPPORT_OS	 	//使用OS
	OSIntExit();  											 
#endif
} 
#endif	//end of //串口1中断服务程序

#endif// end of EN_USART1_RX


#if 1
//串口1中断服务程序
void USART1_IRQHandler(void)    
{
	u8 res;
#if SYSTEM_SUPPORT_OS	 	//使用OS
	OSIntEnter();    
#endif
//	if(__HAL_UART_GET_FLAG(&UART1_Handler, UART_FLAG_RXNE)!=RESET)
//	{
//		HAL_UART_Receive(&UART1_Handler, &res, 1, 1000);
//		if((USART_RX_STA&0x8000)==0)//接收未完成
//		{
//			if(USART_RX_STA&0x4000)//接收到了0x0d
//			{
//				if(res!=0x0a)USART_RX_STA=0;//接收错误,重新开始
//				else USART_RX_STA|=0x8000;	//接收完成了 
//			}
//			else //还没收到0X0D
//			{	
//				if(res==0x0d)USART_RX_STA|=0x4000;
//				else
//				{
//					USART_RX_BUF[USART_RX_STA&0X3FFF]=res ;
//					USART_RX_STA++;
//					if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收	  
//				}		 
//			}
//		}
//	}
	HAL_UART_IRQHandler(&UART1_Handler);	//调用HAL库中断处理公用函数
	#if SYSTEM_SUPPORT_OS //使用OS
		OSIntExit();
	#endif
	
}

#endif














/*下面代码我们直接把中断控制逻辑写在中断服务函数内部。*/
/*

//串口1中断服务程序
void USART1_IRQHandler(void)                	
{ 
	u8 Res;
#if SYSTEM_SUPPORT_OS	 	//使用OS
	OSIntEnter();    
#endif
	if((__HAL_UART_GET_FLAG(&UART1_Handler,UART_FLAG_RXNE)!=RESET))  //接收中断(接收到的数据必须是0x0d 0x0a结尾)
	{
        HAL_UART_Receive(&UART1_Handler,&Res,1,1000); 
		if((USART_RX_STA&0x8000)==0)//接收未完成
		{
			if(USART_RX_STA&0x4000)//接收到了0x0d
			{
				if(Res!=0x0a)USART_RX_STA=0;//接收错误,重新开始
				else USART_RX_STA|=0x8000;	//接收完成了 
			}
			else //还没收到0X0D
			{	
				if(Res==0x0d)USART_RX_STA|=0x4000;
				else
				{
					USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
					USART_RX_STA++;
					if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收	  
				}		 
			}
		}   		 
	}
	HAL_UART_IRQHandler(&UART1_Handler);	
#if SYSTEM_SUPPORT_OS	 	//使用OS
	OSIntExit();  											 
#endif
} 
#endif	
*/

 /**----------------------------------------------------------------------------
** @Function:		   FrameInfoProcess
**
** @Descriptions:	   	
**
** @parameters:			
**                  
**                  
**                  
** @Returned: none
** 
** @Author:  MCU Application Team
**
** @Date: 2017-11-16
**
-------------------------------------------------------------------------------*/
 void FrameInfoProcess(void)
 {
	 
	 u8 RxBuffer[RXBUFFERSIZE]; 
	 FrameInfo_TypeDef* sFrameInfo = (FrameInfo_TypeDef*)RxBuffer;
//	  uint16_t FrameHead = 0;
//	  uint8_t SourceID = 0, DestinationID = 0;
	  memcpy(RxBuffer, gFrameInfo, RXBUFFERSIZE);
//	  FrameHead = RxBuffer[0] + (RxBuffer[1]<<8);
//	  SourceID = RxBuffer[2];
//	  DestinationID = RxBuffer[3];
//	  sFrameInfo = (FrameInfo_TypeDef*)&RxBuffer;
	  if(sFrameInfo->Head == 0x7E7E)
		{
			if((sFrameInfo->SourceID == 1)&&(sFrameInfo->DestinationID == 81))
			{
					switch(sFrameInfo->Command)
					{
						/*		
						#define SELF_CHECK_CMD_R    			0x01
						#define SELF_CHECK_CMD_T    			0x02
						#define LASER_CMD_R         			0x03
						#define LASER_CMD_T         			0x04
						#define LASER_PARAMETER_CMD_R     0x05
						#define LASER_PARAMETER_CMD_T     0x06
						#define TEC_PARAMETER_CMD_R       0x07
						#define TEC_PARAMETER_CMD_T       0x08
						#define MODE_CMD_R                0x09
						#define MODE_CMD_T                0x0A
						#define FFT_CMD_R                 0x0B
						#define FFT_CMD_T                 0x0C
						*/
						case SELF_CHECK_CMD_R:           //自检状态下发
						{
							FFT_Flag = 0;
							HAL_UART_Transmit(&UART1_Handler, (uint8_t*)RxBuffer, RXBUFFERSIZE, 50);
							break;
						}
						case SELF_CHECK_CMD_T:           //自检状态上报
						{
							FFT_Flag = 0;
							break;
						}
						case LASER_CMD_R:                //激光器命令下发
						{
							FFT_Flag = 0;
							break;
						}
						case LASER_CMD_T:                //激光器命令上报
						{
							
              FFT_Flag = 0;
							break;
						}
						case LASER_PARAMETER_CMD_R:      //激光器参数下发
						{
							FFT_Flag = 0;
							break;
						}
						case LASER_PARAMETER_CMD_T:      //激光器参数上报
						{
							FFT_Flag = 0;
							break;
						}
						case TEC_PARAMETER_CMD_R:        //TEC参数下发
						{
							FFT_Flag = 0;
							break;
						}
						case TEC_PARAMETER_CMD_T:        //TEC参数上报
						{
							FFT_Flag = 0;
							break;
						}
						case MODULATOR_CMD_R:                 //调制器参数下发
						{
							FFT_Flag = 0;
							break;
						}
						case MODULATOR_CMD_T:                 //调制器参数上报
						{
							FFT_Flag = 0;
							break;
						}
						case FFT_CMD_R:                  //FFT实时数据状态下发
						{
							FFT_Flag = 1;
							break;
						}
						case FFT_CMD_T:                  //FFT实时数据上报
						{
							break;
						}
						default:break;
						
					}
			}
		}
	  
	  
 
 }

 
 
 void SelfCheck(uint8_t *rData)
 {
		
 }
 
 /*----------------------------------------------------------------------------
** Function name:		LaserCMDReciveProcess
**
** Descriptions:		激光器命令下发处理
**
** parameters:		  rData:接收到的数据	
**                  
**                  
**                  
** Returned value:		none
** 
** Author:  MCU Application Team
**
** Date:2017-11-18
**
-------------------------------------------------------------------------------*/
 void LaserCmdReciveProcess(uint8_t* rData)
 {
		uint8_t temp[8];
	  uint8_t ChannelCtl = 0;
	  memcpy(temp, &rData[5], 9);
	  ChannelCtl = temp[0]&0x0f;
	  if(ChannelCtl&0x0E) //LD1_ALS
		{
			HAL_GPIO_WritePin(GPIOG, GPIO_PIN_4 , GPIO_PIN_RESET);
		}
		if(ChannelCtl&0x0D) //LD2_ALS
		{
			HAL_GPIO_WritePin(GPIOG, GPIO_PIN_5 , GPIO_PIN_RESET);
		}
		if(ChannelCtl&0x0B) //LD3_ALS
		{
			HAL_GPIO_WritePin(GPIOG, GPIO_PIN_6 , GPIO_PIN_RESET);
		}
		if(ChannelCtl&0x07) //LD4_ALS
		{
			HAL_GPIO_WritePin(GPIOG, GPIO_PIN_7 , GPIO_PIN_RESET);
		}
 }
 
/*----------------------------------------------------------------------------
** Function name:		LaserCMDTransmitProcess
**
** Descriptions:		激光器上报命令处理
**
 ** parameters:			rData:接收到的数据
**                  
**                  
**                  
** Returned value:		none
** 
** Author:  MCU Application Team
**
** Date:2017-11-18
**
-------------------------------------------------------------------------------*/
 void LaserCmdTransmitProcess(uint8_t* rData)
 {
		uint8_t temp[RXBUFFERSIZE];
	  FrameInfo_TypeDef *sFrameInfo = (FrameInfo_TypeDef *)&temp;
	  memcpy(temp, rData, RXBUFFERSIZE);
	  sFrameInfo->Head = 0x7e7e;
		sFrameInfo->Command = 0x04;
		sFrameInfo->SourceID = 0x51;
		sFrameInfo->DestinationID = 0x01;
		sFrameInfo->Tail = 0xFDFD;
	  HAL_UART_Transmit(&UART1_Handler, (uint8_t*)temp, RXBUFFERSIZE, 50);
 }
 
 
/*----------------------------------------------------------------------------
** Function name:		LaserParameterCmdReciveProcess
**
** Descriptions:		激光参数下发命令处理
**
 ** parameters:			rData:接收到的数据
**                  
**                  
**                  
** Returned value:		none
** 
** Author:  MCU Application Team
**
** Date:2017-11-18
**
-------------------------------------------------------------------------------*/
 void LaserParameterCmdReciveProcess(uint8_t* rData)
 {
		uint8_t temp[RXBUFFERSIZE];
	  uint8_t ChannelCtl = 0;
	  uint16_t ADC_Val = 0;
	  memcpy(temp, &rData[5], 9); //只复制数据内容
	  ChannelCtl = temp[0]&0x0f;
	  if(ChannelCtl&0x0E) //
		{
			ADC_Val = (temp[2]&0x0F)*256 + temp[1];	
	    AD5592_DAC_Set(ADDR_DAC4, ADC_Val);			
		}
		if(ChannelCtl&0x0D) //
		{
			ADC_Val = (temp[3]&0x0F)*256 + temp[4];	
	    AD5592_DAC_Set(ADDR_DAC5, ADC_Val);
		}
		if(ChannelCtl&0x0B) //
		{
			ADC_Val = (temp[5]&0x0F)*256 + temp[6];	
	    AD5592_DAC_Set(ADDR_DAC6, ADC_Val);
		}
		if(ChannelCtl&0x07) //
		{
			ADC_Val = (temp[7]&0x0F)*256 + temp[8];	
	    AD5592_DAC_Set(ADDR_DAC7, ADC_Val);
		}
    
 }
 
 
 
 /*----------------------------------------------------------------------------
** Function name:		LaserParameterCmdReciveProcess
**
** Descriptions:		激光参数上报命令处理
**
 ** parameters:			rData:接收到的数据
**                  
**                  
**                  
** Returned value:		none
** 
** Author:  MCU Application Team
**
** Date:2017-11-18
**
-------------------------------------------------------------------------------*/ 
 void LaserParameterCmdTransmitProcess(uint8_t* rData)
 {
		uint8_t temp[RXBUFFERSIZE];
	  FrameInfo_TypeDef *sFrameInfo = (FrameInfo_TypeDef *)&temp;
	  memcpy(temp, rData, RXBUFFERSIZE);
	  sFrameInfo->Head = 0x7e7e;
		sFrameInfo->Command = 0x06;
		sFrameInfo->SourceID = 0x51;
		sFrameInfo->DestinationID = 0x01;
		sFrameInfo->Tail = 0xFDFD;
	  HAL_UART_Transmit(&UART1_Handler, (uint8_t*)temp, RXBUFFERSIZE, 50);	
 }	 
 
 
 /*----------------------------------------------------------------------------
** Function name:		TECCmdReciveProcess
**
** Descriptions:		TEC下发命令处理
**
 ** parameters:			rData:接收到的数据
**                  
**                  
**                  
** Returned value:		none
** 
** Author:  MCU Application Team
**
** Date:2017-11-19
**
-------------------------------------------------------------------------------*/
 void TECCmdReciveProcess(uint8_t* rData)
 {
		uint8_t temp[RXBUFFERSIZE];
	  uint8_t ChannelCtl = 0;
	  uint16_t ADC_Val = 0;
	  memcpy(temp, &rData[5], 9); //只复制数据内容
	  ChannelCtl = temp[0]&0x0f;
	  if(ChannelCtl&0x0E) //
		{
			ADC_Val = (temp[1]&0x0F)*256 + temp[2];	
	    AD5592_DAC_Set(ADDR_DAC0, ADC_Val);			
		}
		if(ChannelCtl&0x0D) //
		{
			ADC_Val = (temp[3]&0x0F)*256 + temp[4];	
	    AD5592_DAC_Set(ADDR_DAC1, ADC_Val);
		}
		if(ChannelCtl&0x0B) //
		{
			ADC_Val = (temp[5]&0x0F)*256 + temp[6];	
	    AD5592_DAC_Set(ADDR_DAC2, ADC_Val);
		}
		if(ChannelCtl&0x07) //
		{
			ADC_Val = (temp[7]&0x0F)*256 + temp[8];	
	    AD5592_DAC_Set(ADDR_DAC3, ADC_Val);
		}
 
 }

/*----------------------------------------------------------------------------
** Function name:		TECCmdTransmitProcess
**
** Descriptions:		TEC上报命令处理
**
 ** parameters:			rData:接收到的数据
**                  
**                  
**                  
** Returned value:		none
** 
** Author:  MCU Application Team
**
** Date:2017-11-18
**
-------------------------------------------------------------------------------*/
 void TECCmdTransmitProcess(uint8_t* rData)
 {
		uint8_t temp[RXBUFFERSIZE];
	  FrameInfo_TypeDef *sFrameInfo = (FrameInfo_TypeDef *)&temp;
	  memcpy(temp, rData, RXBUFFERSIZE);
	  sFrameInfo->Head = 0x7e7e;
		sFrameInfo->Command = 0x08;
		sFrameInfo->SourceID = 0x51;
		sFrameInfo->DestinationID = 0x01;
		sFrameInfo->Tail = 0xFDFD;
	  HAL_UART_Transmit(&UART1_Handler, (uint8_t*)temp, RXBUFFERSIZE, 50);
 }
 
 /*----------------------------------------------------------------------------
** Function name:		ModulatorCmdReciveProcess
**
** Descriptions:		调制参数下发命令处理
**
 ** parameters:			rData:接收到的数据
**                  
**                  
**                  
** Returned value:		none
** 
** Author:  MCU Application Team
**
** Date:2017-11-18
**
-------------------------------------------------------------------------------*/
 void ModulatorCmdReciveProcess(uint8_t* rData)
 {
		uint8_t temp[RXBUFFERSIZE];
	  uint8_t ChannelCtl = 0;
	  uint16_t ADC_Val = 0;
	  memcpy(temp, &rData[5], 9); //只复制数据内容
	  ChannelCtl = temp[0]&0x0f;
	  if(ChannelCtl&0x10) //第5位为高为被控工作模式
		{
			if(ChannelCtl&0x0E) //
			{
				ADC_Val = (temp[1]&0x0F)*256 + temp[2];	
				gADC5767_ADCVal[0] = ADC_Val;
				ad5766_set_dac_reg(dev, AD5766_DAC_0, ADC_Val);		
			}
			if(ChannelCtl&0x0D) //
			{
				ADC_Val = (temp[3]&0x0F)*256 + temp[4];	
				gADC5767_ADCVal[1] = ADC_Val;
				ad5766_set_dac_reg(dev, AD5766_DAC_1, ADC_Val);		
			}
			if(ChannelCtl&0x0B) //
			{
				ADC_Val = (temp[5]&0x0F)*256 + temp[6];	
				gADC5767_ADCVal[2] = ADC_Val;
				ad5766_set_dac_reg(dev, AD5766_DAC_2, ADC_Val);		
			}
			if(ChannelCtl&0x07) //
			{
				ADC_Val = (temp[7]&0x0F)*256 + temp[8];	
				gADC5767_ADCVal[3] = ADC_Val;
				ad5766_set_dac_reg(dev, AD5766_DAC_3, ADC_Val);		
			}
	  }
		else//自主模式
		{
		
		
		}
 
 }

/*----------------------------------------------------------------------------
** Function name:		ModulatorCmdTansmitProcess
**
** Descriptions:		调制参数上报命令处理
**
 ** parameters:			rData:接收到的数据
**                  
**                  
**                  
** Returned value:		none
** 
** Author:  MCU Application Team
**
** Date:2017-11-18
**
-------------------------------------------------------------------------------*/
 void ModulatorCmdTansmitProcess(uint8_t* rData)
 {
		uint8_t temp[RXBUFFERSIZE];
	  uint32_t adcval = 0;
	  uint32_t WriteData = 0;
	  FrameInfo_TypeDef *sFrameInfo = (FrameInfo_TypeDef *)&temp;
	  memcpy(temp, &rData, RXBUFFERSIZE);
	  sFrameInfo->Head = 0x7e7e;
		sFrameInfo->Command = 0x0C;
		sFrameInfo->SourceID = 0x51;
		sFrameInfo->DestinationID = 0x01;
		sFrameInfo->Tail = 0xFDFD;
	  /*
			IN0,IN2,IN4,IN6:直流数据
	  */
	  sFrameInfo->Data[0] = 0x00;
	  WriteData = CFG_OVERWRITE | INCC_UNIPOLAR_TO_GND | IN0 | BW_FULL | REF_IN_4V096 | SEQ_DISABLE | RB_DISABLE;
	  adcval = AD7699_data_write_and_read(WriteData);
	  sFrameInfo->Data[1] = (adcval&0xff00) >> 8;
	  sFrameInfo->Data[2] = (adcval&0x00ff);
	  WriteData = CFG_OVERWRITE | INCC_UNIPOLAR_TO_GND | IN2 | BW_FULL | REF_IN_4V096 | SEQ_DISABLE | RB_DISABLE;
	  adcval = AD7699_data_write_and_read(WriteData);
	  sFrameInfo->Data[3] = (adcval&0xff00) >> 8;
	  sFrameInfo->Data[4] = (adcval&0x00ff);
	  WriteData = CFG_OVERWRITE | INCC_UNIPOLAR_TO_GND | IN4 | BW_FULL | REF_IN_4V096 | SEQ_DISABLE | RB_DISABLE;
	  adcval = AD7699_data_write_and_read(WriteData);
	  sFrameInfo->Data[5] = (adcval&0xff00) >> 8;
	  sFrameInfo->Data[6] = (adcval&0x00ff);
	 	WriteData = CFG_OVERWRITE | INCC_UNIPOLAR_TO_GND | IN6 | BW_FULL | REF_IN_4V096 | SEQ_DISABLE | RB_DISABLE;
	  adcval = AD7699_data_write_and_read(WriteData);
	  sFrameInfo->Data[7] = (adcval&0xff00) >> 8;
	  sFrameInfo->Data[8] = (adcval&0x00ff);
	  HAL_UART_Transmit(&UART1_Handler, (uint8_t*)temp, RXBUFFERSIZE, 50);
	  /*
			IN1,IN3,IN5,IN7 交流数据
	  */
	  sFrameInfo->Data[0] = 0x00;
	  WriteData = CFG_OVERWRITE | INCC_UNIPOLAR_TO_GND | IN1 | BW_FULL | REF_IN_4V096 | SEQ_DISABLE | RB_DISABLE;
	  adcval = AD7699_data_write_and_read(WriteData);
	  sFrameInfo->Data[1] = (adcval&0xff00) >> 8;
	  sFrameInfo->Data[2] = (adcval&0x00ff);
	  WriteData = CFG_OVERWRITE | INCC_UNIPOLAR_TO_GND | IN3 | BW_FULL | REF_IN_4V096 | SEQ_DISABLE | RB_DISABLE;
	  adcval = AD7699_data_write_and_read(WriteData);
	  sFrameInfo->Data[3] = (adcval&0xff00) >> 8;
	  sFrameInfo->Data[4] = (adcval&0x00ff);
	  WriteData = CFG_OVERWRITE | INCC_UNIPOLAR_TO_GND | IN5 | BW_FULL | REF_IN_4V096 | SEQ_DISABLE | RB_DISABLE;
	  adcval = AD7699_data_write_and_read(WriteData);
	  sFrameInfo->Data[5] = (adcval&0xff00) >> 8;
	  sFrameInfo->Data[6] = (adcval&0x00ff);
	 	WriteData = CFG_OVERWRITE | INCC_UNIPOLAR_TO_GND | IN7 | BW_FULL | REF_IN_4V096 | SEQ_DISABLE | RB_DISABLE;
	  adcval = AD7699_data_write_and_read(WriteData);
	  sFrameInfo->Data[7] = (adcval&0xff00) >> 8;
	  sFrameInfo->Data[8] = (adcval&0x00ff);
	  HAL_UART_Transmit(&UART1_Handler, (uint8_t*)temp, RXBUFFERSIZE, 50);
 }
 
 /*----------------------------------------------------------------------------
** Function name:		FFTCmdReciveProcess
**
** Descriptions:		FFT实时数据状态下发命令处理
**
 ** parameters:			rData:接收到的数据
**                  
**                  
**                  
** Returned value:		none
** 
** Author:  MCU Application Team
**
** Date:2017-11-18
**
-------------------------------------------------------------------------------*/
void FFTCmdReciveProcess(uint8_t* rData)
{
	  
		uint8_t temp[RXBUFFERSIZE];
	  uint32_t adcval = 0;
	  uint32_t WriteData = 0;
	  if(FFT_Flag == 0) //不实时上报FFT数据
		{
			return;
		}
		else{
//	  FrameInfo_TypeDef *sFrameInfo = (FrameInfo_TypeDef *)&temp;
//	  memcpy(temp, &rData, RXBUFFERSIZE);
//		sFrameInfo->Head = 0x7e7e;
//		sFrameInfo->Command = 0x0C;
//		sFrameInfo->SourceID = 0x51;
//		sFrameInfo->DestinationID = 0x01;
//		sFrameInfo->Tail = 0xFDFD;
//	  /*第一通道*/
//	  
//	  //直流电压
//	  WriteData = CFG_OVERWRITE | INCC_UNIPOLAR_TO_GND | IN0 | BW_FULL | REF_IN_4V096 | SEQ_DISABLE | RB_DISABLE;
//	  adcval = AD7699_data_write_and_read(WriteData);
//	  sFrameInfo->Data[1] = (adcval&0xff00) >> 8;
//	  sFrameInfo->Data[2] = (adcval&0x00ff);
//	  //交流电压
//	  WriteData = CFG_OVERWRITE | INCC_UNIPOLAR_TO_GND | IN1 | BW_FULL | REF_IN_4V096 | SEQ_DISABLE | RB_DISABLE;
//	  adcval = AD7699_data_write_and_read(WriteData);
//	  sFrameInfo->Data[3] = (adcval&0xff00) >> 8;
//	  sFrameInfo->Data[4] = (adcval&0x00ff);
//		//FFT主杂比
//		//待写
//		sFrameInfo->Data[7] = (gADC5767_ADCVal[0]&0xff00) >> 8;
//		sFrameInfo->Data[8] = (gADC5767_ADCVal[0]&0x00ff);
//	 
//	 	/*第二通道*/
//	 
//	  //直流电压
//	  WriteData = CFG_OVERWRITE | INCC_UNIPOLAR_TO_GND | IN2 | BW_FULL | REF_IN_4V096 | SEQ_DISABLE | RB_DISABLE;
//	  adcval = AD7699_data_write_and_read(WriteData);
//	  sFrameInfo->Data[1] = (adcval&0xff00) >> 8;
//	  sFrameInfo->Data[2] = (adcval&0x00ff);
//	  //交流电压
//	  WriteData = CFG_OVERWRITE | INCC_UNIPOLAR_TO_GND | IN3 | BW_FULL | REF_IN_4V096 | SEQ_DISABLE | RB_DISABLE;
//	  adcval = AD7699_data_write_and_read(WriteData);
//	  sFrameInfo->Data[3] = (adcval&0xff00) >> 8;
//	  sFrameInfo->Data[4] = (adcval&0x00ff);
//		//FFT主杂比
//		//待写
//		sFrameInfo->Data[7] = (gADC5767_ADCVal[1]&0xff00) >> 8;
//		sFrameInfo->Data[8] = (gADC5767_ADCVal[1]&0x00ff);
//	 
//	 	/*第三通道*/
//	 
//	  //直流电压
//	  WriteData = CFG_OVERWRITE | INCC_UNIPOLAR_TO_GND | IN4 | BW_FULL | REF_IN_4V096 | SEQ_DISABLE | RB_DISABLE;
//	  adcval = AD7699_data_write_and_read(WriteData);
//	  sFrameInfo->Data[1] = (adcval&0xff00) >> 8;
//	  sFrameInfo->Data[2] = (adcval&0x00ff);
//	  //交流电压
//	  WriteData = CFG_OVERWRITE | INCC_UNIPOLAR_TO_GND | IN5 | BW_FULL | REF_IN_4V096 | SEQ_DISABLE | RB_DISABLE;
//	  adcval = AD7699_data_write_and_read(WriteData);
//	  sFrameInfo->Data[3] = (adcval&0xff00) >> 8;
//	  sFrameInfo->Data[4] = (adcval&0x00ff);
//		//FFT主杂比
//		//待写
//		sFrameInfo->Data[7] = (gADC5767_ADCVal[2]&0xff00) >> 8;
//		sFrameInfo->Data[8] = (gADC5767_ADCVal[2]&0x00ff);
//	 
//	 	/*第四通道*/
//	  
//	  //直流电压
//	  WriteData = CFG_OVERWRITE | INCC_UNIPOLAR_TO_GND | IN6 | BW_FULL | REF_IN_4V096 | SEQ_DISABLE | RB_DISABLE;
//	  adcval = AD7699_data_write_and_read(WriteData);
//	  sFrameInfo->Data[1] = (adcval&0xff00) >> 8;
//	  sFrameInfo->Data[2] = (adcval&0x00ff);
//	  //交流电压
//	  WriteData = CFG_OVERWRITE | INCC_UNIPOLAR_TO_GND | IN7 | BW_FULL | REF_IN_4V096 | SEQ_DISABLE | RB_DISABLE;
//	  adcval = AD7699_data_write_and_read(WriteData);
//	  sFrameInfo->Data[3] = (adcval&0xff00) >> 8;
//	  sFrameInfo->Data[4] = (adcval&0x00ff);
//	 //FFT主杂比
//	 //待写
//	 sFrameInfo->Data[7] = (gADC5767_ADCVal[3]&0xff00) >> 8;
//	 sFrameInfo->Data[8] = (gADC5767_ADCVal[3]&0x00ff);
	}
}

 /*----------------------------------------------------------------------------
** Function name:		FFT_DataRealReport
**
** Descriptions:		FFT实时数据上报
**
 ** parameters:			rData:接收到的数据
**                  
**                  
**                  
** Returned value:		none
** 
** Author:  MCU Application Team
**
** Date:2017-11-18
**
-------------------------------------------------------------------------------*/
void FFT_DataRealReport(void)
{
		uint8_t temp[RXBUFFERSIZE];
	  uint32_t adcval = 0;
	  uint32_t WriteData = 0;
	  if(FFT_Flag == 0) //不实时上报FFT数据
		{
			return;
		}
		else{
	  FrameInfo_TypeDef *sFrameInfo = (FrameInfo_TypeDef *)&temp;
		sFrameInfo->Head = 0x7e7e;
		sFrameInfo->Command = 0x0C;
		sFrameInfo->SourceID = 0x51;
		sFrameInfo->DestinationID = 0x01;
		sFrameInfo->Tail = 0xFDFD;
	  /*第一通道*/
	  
	  //直流电压
	  WriteData = CFG_OVERWRITE | INCC_UNIPOLAR_TO_GND | IN0 | BW_FULL | REF_IN_4V096 | SEQ_DISABLE | RB_DISABLE;
	  adcval = AD7699_data_write_and_read(WriteData);
	  sFrameInfo->Data[1] = (adcval&0xff00) >> 8;
	  sFrameInfo->Data[2] = (adcval&0x00ff);
	  //交流电压
	  WriteData = CFG_OVERWRITE | INCC_UNIPOLAR_TO_GND | IN1 | BW_FULL | REF_IN_4V096 | SEQ_DISABLE | RB_DISABLE;
	  adcval = AD7699_data_write_and_read(WriteData);
	  sFrameInfo->Data[3] = (adcval&0xff00) >> 8;
	  sFrameInfo->Data[4] = (adcval&0x00ff);
		//FFT主杂比
		//待写
		sFrameInfo->Data[7] = (gADC5767_ADCVal[0]&0xff00) >> 8;
		sFrameInfo->Data[8] = (gADC5767_ADCVal[0]&0x00ff);
	 
	 	/*第二通道*/
	 
	  //直流电压
	  WriteData = CFG_OVERWRITE | INCC_UNIPOLAR_TO_GND | IN2 | BW_FULL | REF_IN_4V096 | SEQ_DISABLE | RB_DISABLE;
	  adcval = AD7699_data_write_and_read(WriteData);
	  sFrameInfo->Data[1] = (adcval&0xff00) >> 8;
	  sFrameInfo->Data[2] = (adcval&0x00ff);
	  //交流电压
	  WriteData = CFG_OVERWRITE | INCC_UNIPOLAR_TO_GND | IN3 | BW_FULL | REF_IN_4V096 | SEQ_DISABLE | RB_DISABLE;
	  adcval = AD7699_data_write_and_read(WriteData);
	  sFrameInfo->Data[3] = (adcval&0xff00) >> 8;
	  sFrameInfo->Data[4] = (adcval&0x00ff);
		//FFT主杂比
		//待写
		sFrameInfo->Data[7] = (gADC5767_ADCVal[1]&0xff00) >> 8;
		sFrameInfo->Data[8] = (gADC5767_ADCVal[1]&0x00ff);
	 
	 	/*第三通道*/
	 
	  //直流电压
	  WriteData = CFG_OVERWRITE | INCC_UNIPOLAR_TO_GND | IN4 | BW_FULL | REF_IN_4V096 | SEQ_DISABLE | RB_DISABLE;
	  adcval = AD7699_data_write_and_read(WriteData);
	  sFrameInfo->Data[1] = (adcval&0xff00) >> 8;
	  sFrameInfo->Data[2] = (adcval&0x00ff);
	  //交流电压
	  WriteData = CFG_OVERWRITE | INCC_UNIPOLAR_TO_GND | IN5 | BW_FULL | REF_IN_4V096 | SEQ_DISABLE | RB_DISABLE;
	  adcval = AD7699_data_write_and_read(WriteData);
	  sFrameInfo->Data[3] = (adcval&0xff00) >> 8;
	  sFrameInfo->Data[4] = (adcval&0x00ff);
		//FFT主杂比
		//待写
		sFrameInfo->Data[7] = (gADC5767_ADCVal[2]&0xff00) >> 8;
		sFrameInfo->Data[8] = (gADC5767_ADCVal[2]&0x00ff);
	 
	 	/*第四通道*/
	  
	  //直流电压
	  WriteData = CFG_OVERWRITE | INCC_UNIPOLAR_TO_GND | IN6 | BW_FULL | REF_IN_4V096 | SEQ_DISABLE | RB_DISABLE;
	  adcval = AD7699_data_write_and_read(WriteData);
	  sFrameInfo->Data[1] = (adcval&0xff00) >> 8;
	  sFrameInfo->Data[2] = (adcval&0x00ff);
	  //交流电压
	  WriteData = CFG_OVERWRITE | INCC_UNIPOLAR_TO_GND | IN7 | BW_FULL | REF_IN_4V096 | SEQ_DISABLE | RB_DISABLE;
	  adcval = AD7699_data_write_and_read(WriteData);
	  sFrameInfo->Data[3] = (adcval&0xff00) >> 8;
	  sFrameInfo->Data[4] = (adcval&0x00ff);
	 //FFT主杂比
	 //待写
	 sFrameInfo->Data[7] = (gADC5767_ADCVal[3]&0xff00) >> 8;
	 sFrameInfo->Data[8] = (gADC5767_ADCVal[3]&0x00ff);
	}
}

main.c

/**
* Copyright(C) 2017, 
* ALL rights reserved.
*
* @file    main.c
* @author   MCU Application Team
* @version V0.1   MDK version:4.70.0.0
* @date    9-June-2015
* @brief   Project for WangChangXi
*
*/

/*--------------------------Includes---------------------------------*/
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "adc.h"
#include "dac.h"
#include "timer.h"
#include "dma.h"
#include "timer.h"
#include "spi.h"
#include "ad5766.h"
#include "ad7699.h"
#include "ad5592.h"
#include "arm_math.h"
#include "arm_const_structs.h"
#include "arm_const_structs.h"
#include "FIR_user.h"
#include <stdlib.h>
#include <stdio.h>
/*--------------------------Private define---------------------------*/
#define SIN_ON              1
#define SIN_OFF

#define DELTA               0.00005f   //误差值
#define FFT_LENGTH		      4096 		//FFT长度,默认是1024点FFT

float fft_inputbuf[FFT_LENGTH*2];	//FFT输入数组
float fft_outputbuf[FFT_LENGTH];	//FFT输出数组
arm_cfft_radix4_instance_f32 scfft;
float time;
extern u16 gUsartOneReceiveFlag;    //接收到一帧数据标志
extern u8 FFT_Flag;                 //FFT实时数据上报标志
extern float32_t testOutput[FFT_LENGTH];               /* 滤波后的输出 */
 ad5766_dev *dev;
/*--------------------------Private volitale------------------------*/
 ad5766_init_param default_init_param = {
//		/* SPI */
//		0,					// spi_chip_select
//		SPI_MODE_1,			// spi_mode
//		SPI_ENGINE,			// spi_type
//		0,					// spi_device_id
//		/* GPIO */
//		PS7_GPIO,			// gpio_type
//		GPIO_DEVICE_ID,		// gpio_device_id
//		GPIO_RESET,			// gpio_reset
		/* Device Settings */
		AD5766_DISABLE,		// daisy_chain_en 禁止菊花链
		AD5766_ZERO,		// clr 上电后保持零电平,中间电平,还是满量程。
		AD5766_M_10V_TO_P_10V,	// span 输出电压范围-10 ~ +10
	  0xfff0,					// pwr_dac_setting :DAC0-DAC4输出通道开启
		0xfff0,					// pwr_dither_setting:DAC0-DAC4输出通道关断
	  0x0000000f,			// dither_signal_setting:DAC0-DAC4 use N0 dither
		0,					    // inv_dither_setting
		0,					   // dither_scale_setting
	};
 
	
	
u8 timeout;
	
extern uint16_t ADC1_ConvertData[2];
/*--------------------------Function declare-------------------------*/
void SinWave(uint8_t flag);
void DeviceInit(void);
void DSP_BasicMatchTest(void);
void SignalGenerate(void);
void FFT_Test(void);
/**----------------------------------------------------------------------------
** @Function:		   main
**
** @Descriptions:	   	
**
** @parameters:			
**                  
**                  
**                  
** @Returned: none
** 
** @Author:  MCU Application Team
**
** @Date: 2017-09-19
**
-------------------------------------------------------------------------------*/


int main(void)
{
	  u16 dacval = 0;
	  u16 adcval = 0;
	  int8_t input = 0;
    uint8_t str[100];
    float fVal = 0;
   //char *str = "hellowankui!\r\n";
	 
	  float temp;
    DeviceInit();
	  printf("Scanf test....\r\n");
//	  printf("\r\n================Choose================\r\n\r\n");
//    printf("\r\n 1:ADN8810 S1\r\n");
//    printf("\r\n 2:ADN8810 S2\r\n");
//    printf("\r\n 3:ADN8810 S3\r\n");
//		printf("\r\n 4:ADN8810 S4\r\n");
//    printf("\r\n======================================\r\n\r\n");
	  //arm_cfft_radix4_init_f32(&scfft,FFT_LENGTH,0,1);//初始化scfft结构体,设定FFT相关参数
    while(1)
    {   
			;
			#if 0
			  //SinWave(SIN_ON);
        HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_RESET); //LED0对应引脚PB1拉低,亮,等同于LED0(0)
       // HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_SET);   //LED1对应引脚PB0拉高,灭,等同于LED1(1)
        delay_ms(100);										//延时500ms
		    printf("Led0 turn on, led1 turn off.\r\n");
        HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_SET);   //LED0对应引脚PB1拉高,灭,等同于LED0(1)
       // HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_RESET); //LED1对应引脚PB0拉低,亮,等同于LED1(0)
		    printf("Led1 turn on, led0 turn off.\r\n");
        delay_ms(100);                                      //延时500ms 
			#endif
			
			#if 0
			  dacval = 3103;
			  HAL_DAC_SetValue(&DAC1_Handler,DAC_CHANNEL_1,DAC_ALIGN_12B_R,dacval);//设置DAC值
        delay_ms(10);
		    adcval = HAL_DAC_GetValue(&DAC1_Handler,DAC_CHANNEL_1);//读取前面设置DAC的值
			  temp=(float)adcval*(3.3/4096);			    //得到DAC电压值
			  printf("The DAC Output voltage is: %.3f\r\n", temp);
		 #endif
			
			#if 0
			  adcval=Get_Adc_Average(ADC_CHANNEL_5,10);     //得到ADC转换值	
			  temp=(float)adcval*(3.3/4096);			    //得到DAC电压值
			  printf("The ADC Sample voltage is: %.3f\r\n", temp);
				
			#endif
			if(gUsartOneReceiveFlag == YES)
			{
				gUsartOneReceiveFlag = NO;
				FrameInfoProcess();
			}
		//	FFT_DataRealReport();
		//	HAL_UART_Transmit(&UART1_Handler, (uint8_t*)str, strlen(str)+1, 50);
			//DSP_BasicMatchTest();
			//ADC_DMA_test();
		  //FFT_Test();
		//	printf("Hello world!\r\n");
			//scanf("%s", str);
			//gets((char *)&str);
			printf("\r\n================Choose================\r\n\r\n");
			printf("\r\n 1:ADN8810 S1\r\n");
			printf("\r\n 2:ADN8810 S2\r\n");
			printf("\r\n 3:ADN8810 S3\r\n");
			printf("\r\n 4:ADN8810 S4\r\n");
			printf("\r\n======================================\r\n\r\n");
			gets((char *)&input);
			switch(input)
			{
				case'1':
				{
					printf("ADN8810 S1 Setting\r\n\r\n");
					gets((char *)&str);
					fVal = atof((char *)&str);
					printf("fval = %.5f\r\n\r\n", fVal);
					break;
				}
				case'2':
				{
					printf("ADN8810 S2 Setting\r\n\r\n");
					gets((char *)&str);
					fVal = atof((char *)&str);
					printf("fval = %.5f\r\n\r\n", fVal);
					break;
				}
				case'3':
				{
					printf("ADN8810 S3 Setting\r\n\r\n");
					gets((char *)&str);
					fVal = atof((char *)&str);
					printf("fval = %.5f\r\n\r\n", fVal);
					break;
				}
				case'4':
				{
					printf("ADN8810 S4 Setting\r\n\r\n");
					gets((char *)&str);
					fVal = atof((char *)&str);
					printf("fval = %.5f\r\n\r\n", fVal);
					break;
				}
				default:break;
			}
			//printf("%s\r\n", str);
			//delay_ms(1000);	
		}
}



/*----------------------------------------------------------------------------
** Function name:		SinWave
**
** Descriptions:		
**
** parameters:			
**                  
**                  
**                  
** Returned value:		none
** 
** Author:  MCU Application Team
**
** Date:2017-09-21
**
-------------------------------------------------------------------------------*/
void SinWave(uint8_t flag)
{

	int i =0;
	if(flag == SIN_ON)
	{
		for(; i<256; i++)
		{
		//	DAC_SetChannel2Data(DAC_Align_12b_R, SinSheet[i]); //DAC_SetChannel2Data(DAC_Align_12b_R, gtemp);
		//	HAL_DAC_SetValue(&DAC1_Handler, DAC_CHANNEL_1, DAC_ALIGN_12B_R, Sin[i]);//设置DAC值
			delay_ms(10);
		}
	}
	else
	{   
			
		//DAC_SetChannel2Data(DAC_Align_12b_R, 0);
	}
}


void DeviceInit(void)
{
    Cache_Enable();                 //打开L1-Cache
    HAL_Init();				              //初始化HAL库
    Stm32_Clock_Init(432,25,2,9);   //设置时钟,216Mhz 
    delay_init(216);                //延时初始化
	  uart_init(115200);		          //串口初始化
    LED_Init();  
    GPIO_Init();	
	 // MY_ADC_Init();
	  //ADC_DMA_Config(DMA2_Stream0, DMA_CHANNEL_0); 
	 // DAC1_Init();
	 // DAC_DMA_Config(DMA1_Stream5, DMA_CHANNEL_7);
	  TIM3_Init(65535,10800-1);        //10Khz计数频率,最大计时6.5秒超出
	 // TIM2_Init(540-1, 2-1);               //定时器2初始化,定时器时钟为108M,分频系数为2-1,
                                         //所以定时器2的频率为108M/2 =54MHz,自动重装载为180-1.
																				 //那么定时器频率为:54MHz/180 = 300KHz,去触发DAC转换。
	                                       //由于正弦波波表100个点,故300KHz/100 = 3KHz。
	 // TIM4_Init(90-1 , 2-1);
	
	  SPI_Init();
	  //FIR_Test();
    //FFT_Test();
	 // ad5766_setup(&dev, default_init_param);
	 // ad5766_set_dac_reg(dev, AD5766_DAC_0|AD5766_DAC_1|AD5766_DAC_2|AD5766_DAC_3, 0xfff); //输出10V Vout={spanxD/N}+Vmin = (10-(-10)x1-10=10V
	 // ad5766_set_pwr_dac(dev, 0x000f);   //
	  //HAL_DAC_SetValue(&DAC1_Handler,DAC_CHANNEL_1,DAC_ALIGN_12B_R,0);//初始值为0
	  
}
/*使用寄存器操作实现跑马灯
int main(void)
{ 
    Cache_Enable();                 //打开L1-Cache
    HAL_Init();				        //初始化HAL库
    Stm32_Clock_Init(432,25,2,9);   //设置时钟,216Mhz 
    delay_init(216);                //延时初始化
	uart_init(115200);		        //串口初始化
    LED_Init();      
	while(1)
	{
      GPIOB->BSRR=GPIO_PIN_1;      //LED0亮
	  GPIOB->BSRR=GPIO_PIN_0<<16;  //LED1灭
	  delay_ms(500);               //延时500ms
      GPIOB->BSRR=GPIO_PIN_1<<16;  //LED0灭
	  GPIOB->BSRR=GPIO_PIN_0;      //LED1亮
	  delay_ms(500);               //延时500ms
	 }
 }	

*/

//sin cos测试
//angle:起始角度
//times:运算次数
//mode:0,不使用DSP库;1,使用DSP库
//返回值:0,成功;0XFF,出错
u8 sin_cos_test(float angle,u32 times,u8 mode)
{
	float sinx,cosx;
	float result;
	u32 i=0;
	if(mode==0)
	{
		for(i=0;i<times;i++)
		{
			cosx=cosf(angle);			//不使用DSP优化的sin,cos函数
			sinx=sinf(angle);
			result=sinx*sinx+cosx*cosx; //计算结果应该等于1  
			result=fabsf(result-1.0f);	//对比与1的差值
			if(result>DELTA)return 0XFF;//判断失败 
			angle+=0.001f;				//角度自增
		}
	}else
	{
		for(i=0;i<times;i++)
		{
            
			cosx=arm_cos_f32(angle);	//使用DSP优化的sin,cos函数
			sinx=arm_sin_f32(angle);
			result=sinx*sinx+cosx*cosx; //计算结果应该等于1  
			result=fabsf(result-1.0f);	//对比与1的差值
			if(result>DELTA)return 0XFF;//判断失败 
			angle+=0.001f;				//角度自增
		}
	}
	return 0;//任务完成
} 


/*----------------------------------------------------------------------------
** Function name:		DSP_BasicMatchTest
**
** Descriptions:		
**
** parameters:			
**                  
**                  
**                  
** Returned value:		none
** 
** Author:  MCU Application Team
**
** Date:2017-09-21
**
-------------------------------------------------------------------------------*/
void DSP_BasicMatchTest(void)
{
	 	float time; 
		u8 buf[50];
		u8 res;
	 	//不使用DSP优化
    __HAL_TIM_SET_COUNTER(&TIM3_Handler,0);//重设TIM3定时器的计数器值
		timeout=0;
		res=sin_cos_test(PI/6,200000,0);
    time=__HAL_TIM_GET_COUNTER(&TIM3_Handler)+(u32)timeout*65536;
	  if(res==0)printf("Not Use DSP test time is:%0.1fms\r\n", time/10);
	  else printf("Not Use DSP test ERROR!\r\n");

		//使用DSP优化		
		__HAL_TIM_SET_COUNTER(&TIM3_Handler,0);//重设TIM3定时器的计数器值
		timeout=0;
		res=sin_cos_test(PI/6,200000,1);
		time=__HAL_TIM_GET_COUNTER(&TIM3_Handler)+(u32)timeout*65536;
	
		if(res==0)printf("Use DSP test time is:%0.1fms\r\n", time/10);
	  else printf("Use DSP test ERROR!\r\n");
		LED0_Toggle;

}



void SignalGenerate(void)
{
	int i;
  float temp = 0;
//		for(i=0; i<ADC_DMA_LEN; i++)
//		{
//			temp=(float)ADC1_ConvertData[i]*(3.3/4096);
//			printf("The ADC1_ConvertData[%d]= %x, vol = %.3f\r\n", i, ADC1_ConvertData[i], temp);
//			delay_ms(100);
//		}
	#if 0
	SCB_DisableDCache();	
	for(i=0;i<FFT_LENGTH;i++)//生成信号序列
	{
//		 fft_inputbuf[2*i]=100+
//											 10*arm_sin_f32(2*PI*i/FFT_LENGTH)+
//							 30*arm_sin_f32(2*PI*i*4/FFT_LENGTH)+
//											 50*arm_cos_f32(2*PI*i*8/FFT_LENGTH);	//生成输入信号实部
		 temp=(float)ADC1_ConvertData[i]*(3.3/4096.0);
		 printf("Temp[%d] = %.3f\r\n", i, temp);
		 fft_inputbuf[2*i] = temp;
		//fft_inputbuf[2*i+1]= 3.3*arm_sin_f32(2*PI*i/FFT_LENGTH);
		fft_inputbuf[2]=0;//虚部全部为0
	}
	SCB_EnableDCache();
	#endif
	for(i=0;i<FFT_LENGTH;i++)//生成信号序列
	{
		 fft_inputbuf[2*i] = testOutput[i];
		 fft_inputbuf[2]=0;//虚部全部为0
	 }

}

void FFT_Test(void)
{
	  
	   int i = 0;
	   float temp;
	   SignalGenerate();
			__HAL_TIM_SET_COUNTER(&TIM3_Handler,0);//重设TIM3定时器的计数器值
			timeout=0;
			//arm_cfft_radix4_f32(&scfft,fft_inputbuf);	//FFT计算(基4)
      
	
	    /* CFFT变换 */ 
			arm_cfft_f32(&arm_cfft_sR_f32_len4096, fft_inputbuf, 0, 1);
			time=__HAL_TIM_GET_COUNTER(&TIM3_Handler)+(u32)timeout*65536;//计算所用时间
//			sprintf((char*)buf,"%0.3fms\r\n",time/1000);	
//			LCD_ShowString(30+12*8,160,100,16,16,buf);	//显示运行时间	
      printf("\r\n------------------Start of FFT Test-------------------------\r\n");
			arm_cmplx_mag_f32(fft_inputbuf,fft_outputbuf,FFT_LENGTH);	//把运算结果复数求模得幅值 
			printf("\r\n%d point FFT runtime:%0.3fms\r\n",FFT_LENGTH,time/1000);
			printf("FFT Result:\r\n");
	    printf("\r\n------------------End of FFT Test-------------------------\r\n");
			for(i=0;i<FFT_LENGTH;i++)
			{
				printf("%.5f,",fft_outputbuf[i]);
				delay_ms(2);	
			}
			printf("\r\n------------------End of FFT Test-------------------------\r\n");
		
	
}
	

实验效果:




本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32 中重定向printf 和 scanf 的相关文章

  • PWM DMA 到整个 GPIO

    我有一个 STM32F4 我想对一个已与掩码进行 或 运算的 GPIO 端口进行 PWM 处理 所以 也许我们想要 PWM0b00100010一段时间为 200khz 但随后 10khz 后 我们现在想要 PWM0b00010001 然后
  • C/C++ 中两个 INT_MAX 数字的乘积不正确

    就我而言 两个 INT MAX 数字的乘积是296447233 这是不正确的 long long int product 0 product 2137483647 2137483647 printf product lli n produc
  • C 读取带空格的字符串

    我正在尝试读取一个可能包含或不包含空格的字符串 你好世界 通过对用户输入的数字选择菜单执行以下操作 这只是我正在尝试做的事情的一个小复制品 include
  • 正则表达式精确单词匹配

    我需要匹配行中的单词 例如 The blue bird is dancing Yellow card is drawn The day is perfect rainy blue bird is eating 这四行位于文本文件中l2 我想
  • 如何使用 printf 打印字符串而不打印尾随换行符

    I m trying to print some strings using printf but they are null terminated having trailing newline and that messes with
  • C 中 scanf 函数的格式说明符中 %c 规范之前的空格

    当我之间不包含空格时 d and c格式字符串中的规范scanf 在以下程序中运行函数 并在运行时输入 4 h 则输出为 Integer 4 and Character 究竟如何可变 c 在这种情况下接受输入 如果我在之间包含空格 会有什么
  • printf 命令导致段错误? [复制]

    这个问题在这里已经有答案了 当我尝试初始化一个大型的二维字符数组时 它工作得很好 但是当我添加一个简单的打印命令时 它给了我一个分段错误 关于为什么会发生这种情况有什么想法吗 include
  • C 中的类型转换会变得香蕉吗? [关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 看来 C 和我对这里的预期输出存在分歧 I have struct r struct int r i float r f
  • printf 类型提升和符号扩展

    我对 printf 和一般情况下类型提升如何发生感到困惑 我尝试了以下代码 unsigned char uc 255 signed char sc 128 printf unsigned char value d n uc printf s
  • 从 .txt C 读取

    我在C语言方面遇到了一些麻烦 我有一个 txt 文件 其中包含以下形式的各行 F 65 S 4 1 139 56 3704 26 和我的程序 p fopen dados txt r if p NULL printf n nNao foi p
  • 使用 ncurses 处理转义序列? printf 是否处理转义序列?

    我的程序从网络读取一些文本数据 例如 Hello 033 1 34mworld 033 0m and bla bla bla n 当程序使用prinf输出该字符串时 world 一词是蓝色的 但是当我将 ncurses 接口与 wprint
  • scanf 的四边形和参数类型

    我用
  • 在没有正确原型的情况下调用 printf 是否会引发未定义的行为?

    这个看起来无辜的程序是否会调用未定义的行为 int main void printf d n 1 return 0 是的 调用printf 没有适当的原型 来自标准头
  • 如何读取长度未知的输入字符串?

    如果我不知道这个词有多长 我就无法写char m 6 这个词的长度可能有十到二十长 我该如何使用scanf从键盘获取输入 include
  • 当端点和 PMA 地址均更改时,CubeMX 生成的 USB HID 设备发送错误数据

    我正在调试我正在创建的复合设备的问题 并在新生成的仅 CubeMX 代码中重新创建了该问题 以使其更容易解决 我添加了少量代码main 让我发送 USB HID 鼠标点击 并在按下蓝色按钮时使 LED 闪烁 uint8 t click re
  • scanf 被跳过[重复]

    这个问题在这里已经有答案了 我正在尝试为一个类制作一个简单的 C 程序 其中一个要求是我需要使用scanf printf对于所有输入和输出 我的问题是为什么我的scanf在 main 中的 for 循环被跳过并且程序刚刚终止之后 这是我的代
  • Java中printf左对齐

    当我运行该程序时 阶乘值右对齐 有没有办法让它左对齐 同时保持中间 50 个空格 public class Exercise 5 13 public static void main String args int numbers 1 2
  • scanf 和 doubles 的问题[重复]

    这个问题在这里已经有答案了 我无法理解为什么会发生这种情况 使用以下代码 include
  • 用 C 更快地读取文件

    嗯 我想知道是否有一种比使用 fscanf 更快地读取文件的方法 例如假设我有这个文本 4 55 k 52 o 24 l 523 i 首先 我想读取第一个数字 它给出了接下来的行数 令这个数称为N N 之后 我想读取 N 行 其中有一个整数
  • stm32l0: 执行MI命令失败。使用 vFlashErase 数据包擦除闪存时出错

    我正在使用 Nucleo STM32L031 和 AC6 STM32 工作台 eclipse 我编写应用程序并进入调试模式 一切正常 直到我在应用程序中添加另一个功能 我注意到当我删除 评论 新函数 软件可以再次进入调试模式 但是当我添加

随机推荐

  • 中国嵌入式高端ARM开发板的江湖故事——详细分析国内各家ARM11 S3C6410 开发板的选型以及竞争格局

    Topic xff1a 中国嵌入式高端ARM开发板的江湖故事 详细分析国内各家ARM11 S3C6410 开发板的选型以及竞争格局 作者 xff1a gooogleman 版权 xff1a gooogleman 邮箱 gooogleman
  • 分析各家2440开发板的性价比(初学者如何选择开发板)

    分析各家2440开发板的性价比 xff08 初学者如何选择开发板 xff09 作者 xff1a gooogleman 邮箱 xff1a gooogleman 64 foxmail com 地址 xff1a http blog csdn ne
  • 一个机械专业小混混(gooogleman)学习嵌入式ARM的真实经历

    我记得在我毕业一周年的时候 xff0c 写过一篇文章 xff0c 大概是讲我学习嵌入式wince驱动的经历 xff08 http topic csdn net u 20090704 01 43492b64 f7bf 4953 a31f db
  • 是时候想想再上一个台阶的时候了

    刚才 xff0c 被一个蚊子吵醒 xff0c 脑子里就想着一件事 xff1a 我这些年也是过的够淡定的了 xff0c 不管旁边发生任何事情 xff0c 我也不去做什么得失比较 xff0c 我乐于享受目前的现状 xff0c 一台还算稳定的国产
  • 关于wince6.0 升级全年包的注意事项(作者:gooogleman)

    作者 xff1a gooogleman Email xff1a gooogleman 64 foxmail com 最近在S5pv210 wince6 0 系统定制上更新了几个包 xff0c 发现了一些微软更新补丁包的问题 xff0c 现在
  • 二级域名绑定二级目录的两种方法

    当用WordPress建站后 xff0c WordPress位于二级目录 xff08 v ar www html xff09 下 xff0c 进行域名解析时如何把域名解析到二级目录下 xff0c 网络上一般有两种方法 xff0c 一是利用接
  • PMP 真的没用吗?

    最近在备考2018 3 24 的pmp 认证考试 xff0c 有不少收获 xff0c 此前我曾在群里邀请大家一起备考 xff0c 一些人跳出来就说考这些有啥用 xff1f 干技术的把技术干好就行了 xff0c 技术人员最烦这些没点技术的项目
  • 一个嵌入式产品的从研发到量产的流程(作者:gooogleman@foxmail.com)

    作者 xff1a gooogleman 64 foxmail com 一个嵌入式产品的开发流程是 1 了解清楚客户需求 2 模具开发 3 硬件工程师准备硬件 xff0c 物料选型 xff0c 原理图 xff0c PCB和模具工程师商议PCB
  • 【电赛国赛备赛笔记】【赛题经验分享会】

    存在的问题 光流问题 起飞后定不住飞行过程中方向太偏光照度对飞行稳定性的影响纹理变化对飞行稳定性的影响 目前还没有很好的解决办法 xff0c 但如果不限制使用器材的话 xff0c 用双目摄像头可能可以解决问题 赛题准备 视觉方面的算法和代码
  • APM32f003替换STM32进行低成本系统开发

    STM32F003是基于Arm Cortex M0内核的32位MCU xff0c 工作电压为2 4 3 6V xff0c 主频48MHz xff0c 内置16KB Flash 定时器 ADC 通信接口 APM32F003系列主频与STM32
  • 【VSCode】Windows 下搭建 C++ 环境

    文章目录 Part I 预备知识Part II 搭建过程Part III 安装较高版本的MinGW Part I 预备知识 MinGW 提供了一套简单方便的Windows下的基于GCC 程序开发环境 MinGW 收集了一系列免费的Windo
  • 路由器开发————概念理解

    区别 xff1a 静态ip 可以直接使用Internet上网的IP xff08 相当于公网IP xff09 pppoe 从运营商那里动态获取的静态IP的过程就是PPPOE 运营商为了提高他手上拥有的静态IP的利用率 xff0c 而做出的动态
  • 干了三年java外包,我转AI了....

    谈及到程序员外包这件事 xff0c 我想我是比较有发言权的一个 xff0c 即使我现在已经从一个外包公司的JAVA开发转行做人工智能算法 我是2018年毕业的 xff0c 一毕业找的第一份工作就是一家外包公司 xff0c 主要做的是承接甲方
  • 人工智能的算法有哪些?AI常用算法

    人工智能 xff08 AI xff09 是一个非常广泛的领域 xff0c 其中包含许多不同的算法和技术 以下是一些常见的人工智能算法 xff1a 人工智能的算法有哪些 xff1f 机器学习 xff08 Machine Learning xf
  • 卡尔曼滤波五个公式各个参数的意义

    卡尔曼滤波五个公式各个参数的意义 wccsu1994 2018 11 30 10 49 33 45928 收藏 218 分类专栏 xff1a 卡尔曼滤波 版权 系统的状态方程为 xff1a 这个状态方程是根据上一时刻的状态和控制变量来推测此
  • FutureTask 示例

    1 简单示例 2 泡茶 1 简单示例 创建 FutureTask FutureTask lt Integer gt futureTask 61 new FutureTask lt gt gt 1 43 2 创建并启动线程 Thread t1
  • Centos6.5下进行PHP版本升级

    统计插件 WP Statistics 要求PHP5 4以上 xff0c 可本机PHP为5 3 3 xff0c 无奈只有对服务器PHP进行升级 xff0c 遂写下本文 Step1 xff1a 查看安装服务器当前安装版本 php V Step2
  • 一段日子的结束, 也是一段日子的开始

    一个朋友说的 xff0c 一段日子的结束 xff0c 也是另一段日子的开始 也正是我现在的状态 xff0c 我结束了一段往事 xff0c 也因此开始了一段日子 xff0c 曾经的曾经已离我远去 昨天和好朋友聊天到很晚 xff0c 谈了很多
  • 岁月静好

    不是说马年会马上转运的 xff0c 是不是蛇年的时候前半年太幸福了 xff0c 用了太多的好人品 xff0c 各种奖学金 xff0c 各种申请中标 xff0c 各种荣誉 xff0c 然后我要还了 小猴子说我开始会依赖人了 xff0c 哈哈
  • STM32 中重定向printf 和 scanf

    uart c 如果使用 pragma import use no semihosting 则在MDK中不勾选use Microlib 当前代码直接重定向没使用 pragma import use no semihosting 故需要选择us