本人在做stm32f407控制ad9851产生正弦波,程序如下,调试后不显示波形,求指导
时间:10-02
整理:3721RD
点击:
#include"stm32f4xx.h"
#define ad9851_rest_l GPIO_ResetBits(GPIOC,GPIO_Pin_0)
#define ad9851_rest_h GPIO_SetBits(GPIOC,GPIO_Pin_0)
#define ad9851_fq_up_l GPIO_ResetBits(GPIOC,GPIO_Pin_1)
#define ad9851_fq_up_h GPIO_SetBits(GPIOC,GPIO_Pin_1)
#define ad9851_w_clk_l GPIO_ResetBits(GPIOC,GPIO_Pin_2)
#define ad9851_w_clk_h GPIO_SetBits(GPIOC,GPIO_Pin_2)
#define ad9851_data_l GPIO_ResetBits(GPIOC,GPIO_Pin_3)
#define ad9851_data_h GPIO_SetBits(GPIOC,GPIO_Pin_3)
/*
void RCC_HSE_Configuration(void)
{
RCC_DeInit();//将外设RCC寄存器重设为缺省值
RCC_HSEConfig(RCC_HSE_ON);//设置外部高速晶振HSEHSE晶振打开ON
if(RCC_WaitForHSEStartUp()==SUCCESS)//等待HSE起振SUCCESSHSE晶振稳定且就绪
{
RCC_HCLKConfig(RCC_SYSCLK_Div1);//设置AHB时钟HCLK
//RCC_SYSCLK_Div1--AHB时钟=系统时钟
RCC_PCLK2Config(RCC_HCLK_Div1);//设置高速AHB时钟PCLK2
//RCC_HCLK_Div1--APB2时钟=HCLK
RCC_PCLK1Config(RCC_HCLK_Div2);//设置低速AHB时钟PCLK1
//RCC_HCLK_Div2--APB1时钟=HCLK/2
FLASH_PrefetchBufferCmd(ENABLE);//选 择FLASH预取指缓存的模预取指缓存使能
FLASH_SetLatency(FLASH_Latency_2);//设置FLASH存储器延时时钟周期数FLASH_LATENCY_2 2延时周期
RCC_PLLConfig(RCC_PLLSource_HSE,63,192,2,4);//设置PLL时钟源及倍频系数
RCC_PLLCmd(ENABLE);//PLL使能
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET);//检查指定的RCC标志位PLL准备好标志设置与否
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//设置系统时钟SYSCLK
while(RCC_GetSYSCLKSource()!= 0x08);//0x08:PLL作为系统时钟
}
}
*/
void AD9851_GPIOC_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC,ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;
GPIO_Init(GPIOC,&GPIO_InitStructure);
}
void AD9851_GPIOF_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF,ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;
GPIO_Init(GPIOF,&GPIO_InitStructure);
}
void ad9851_reset_parrel()
{
ad9851_w_clk_l;
ad9851_fq_up_l;
//rest信号
ad9851_rest_l;
ad9851_rest_h;
ad9851_rest_l;
}
//并行输出
void ad9851_wr_parrel(u8 w0,u32 frequence)
{
u8 w;
frequence=frequence*4294967296/180000000;
//写w0数据
w=w0;
GPIO_Write(GPIOF,w); //w0
ad9851_w_clk_h;
ad9851_w_clk_l;
//写w1数据
w=(frequence>>24);
GPIO_Write(GPIOF,w); //w1
ad9851_w_clk_h;
ad9851_w_clk_l;
//写w2数据
w=(frequence>>16);
GPIO_Write(GPIOF,w); //w2
ad9851_w_clk_h;
ad9851_w_clk_l;
//写w3数据
w=(frequence>>8);
GPIO_Write(GPIOF,w); //w3
ad9851_w_clk_h;
ad9851_w_clk_l;
//写w4数据
w=(frequence>>=0);
GPIO_Write(GPIOF,w); //w4
ad9851_w_clk_h;
ad9851_w_clk_l;
//移入始能
ad9851_fq_up_h;
ad9851_fq_up_l;
}
//
//void ad9851_wr_parrel(u8 w0,u32 frequence)
//{
// u8 i,w;
// frequence=(long int)frequence*4294967296/180000000;
////写w4数据
// w=(frequence>>=0);
// for(i=0;i<8;i++)
// { if((w>>i)&0x01)
// ad9851_data_h;
// else
// ad9851_data_l;
// ad9851_w_clk_h;
// ad9851_w_clk_l;
// }
////写w3数据
// w=(frequence>>8);
// for(i=0;i<8;i++)
// { if((w>>i)&0x01)
// ad9851_data_h;
// else
// ad9851_data_l;
// ad9851_w_clk_h;
// ad9851_w_clk_l;
// }
//
////写w2数据
// w=(frequence>>16);
// for(i=0;i<8;i++)
// { if((w>>i)&0x01)
// ad9851_data_h;
// else
// ad9851_data_l;
// ad9851_w_clk_h;
// ad9851_w_clk_l;
// }
//
////写w1数据
// w=(frequence>>24);
// for(i=0;i<8;i++)
// { if((w>>i)&0x01)
// ad9851_data_h;
// else
// ad9851_data_l;
// ad9851_w_clk_h;
// ad9851_w_clk_l;
// }
////写w0数据
// w=w0;
// for(i=0;i<8;i++)
// { if((w>>i)&0x01)
// ad9851_data_h;
// else
// ad9851_data_l;
// ad9851_w_clk_h;
// ad9851_w_clk_l;
// }
// //移入始能
// ad9851_fq_up_h;
// ad9851_fq_up_l;
//}
int main()
{
//RCC_HSE_Configuration();
AD9851_GPIOC_Configuration();
AD9851_GPIOF_Configuration();
GPIO_Write(GPIOC,0x0000);
GPIO_Write(GPIOF,0x0000);
//串行写1000Hz程序
ad9851_reset_parrel();
ad9851_wr_parrel(0x01,1000000);
while(1);
}
#define ad9851_rest_l GPIO_ResetBits(GPIOC,GPIO_Pin_0)
#define ad9851_rest_h GPIO_SetBits(GPIOC,GPIO_Pin_0)
#define ad9851_fq_up_l GPIO_ResetBits(GPIOC,GPIO_Pin_1)
#define ad9851_fq_up_h GPIO_SetBits(GPIOC,GPIO_Pin_1)
#define ad9851_w_clk_l GPIO_ResetBits(GPIOC,GPIO_Pin_2)
#define ad9851_w_clk_h GPIO_SetBits(GPIOC,GPIO_Pin_2)
#define ad9851_data_l GPIO_ResetBits(GPIOC,GPIO_Pin_3)
#define ad9851_data_h GPIO_SetBits(GPIOC,GPIO_Pin_3)
/*
void RCC_HSE_Configuration(void)
{
RCC_DeInit();//将外设RCC寄存器重设为缺省值
RCC_HSEConfig(RCC_HSE_ON);//设置外部高速晶振HSEHSE晶振打开ON
if(RCC_WaitForHSEStartUp()==SUCCESS)//等待HSE起振SUCCESSHSE晶振稳定且就绪
{
RCC_HCLKConfig(RCC_SYSCLK_Div1);//设置AHB时钟HCLK
//RCC_SYSCLK_Div1--AHB时钟=系统时钟
RCC_PCLK2Config(RCC_HCLK_Div1);//设置高速AHB时钟PCLK2
//RCC_HCLK_Div1--APB2时钟=HCLK
RCC_PCLK1Config(RCC_HCLK_Div2);//设置低速AHB时钟PCLK1
//RCC_HCLK_Div2--APB1时钟=HCLK/2
FLASH_PrefetchBufferCmd(ENABLE);//选 择FLASH预取指缓存的模预取指缓存使能
FLASH_SetLatency(FLASH_Latency_2);//设置FLASH存储器延时时钟周期数FLASH_LATENCY_2 2延时周期
RCC_PLLConfig(RCC_PLLSource_HSE,63,192,2,4);//设置PLL时钟源及倍频系数
RCC_PLLCmd(ENABLE);//PLL使能
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET);//检查指定的RCC标志位PLL准备好标志设置与否
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//设置系统时钟SYSCLK
while(RCC_GetSYSCLKSource()!= 0x08);//0x08:PLL作为系统时钟
}
}
*/
void AD9851_GPIOC_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC,ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;
GPIO_Init(GPIOC,&GPIO_InitStructure);
}
void AD9851_GPIOF_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF,ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;
GPIO_Init(GPIOF,&GPIO_InitStructure);
}
void ad9851_reset_parrel()
{
ad9851_w_clk_l;
ad9851_fq_up_l;
//rest信号
ad9851_rest_l;
ad9851_rest_h;
ad9851_rest_l;
}
//并行输出
void ad9851_wr_parrel(u8 w0,u32 frequence)
{
u8 w;
frequence=frequence*4294967296/180000000;
//写w0数据
w=w0;
GPIO_Write(GPIOF,w); //w0
ad9851_w_clk_h;
ad9851_w_clk_l;
//写w1数据
w=(frequence>>24);
GPIO_Write(GPIOF,w); //w1
ad9851_w_clk_h;
ad9851_w_clk_l;
//写w2数据
w=(frequence>>16);
GPIO_Write(GPIOF,w); //w2
ad9851_w_clk_h;
ad9851_w_clk_l;
//写w3数据
w=(frequence>>8);
GPIO_Write(GPIOF,w); //w3
ad9851_w_clk_h;
ad9851_w_clk_l;
//写w4数据
w=(frequence>>=0);
GPIO_Write(GPIOF,w); //w4
ad9851_w_clk_h;
ad9851_w_clk_l;
//移入始能
ad9851_fq_up_h;
ad9851_fq_up_l;
}
//
//void ad9851_wr_parrel(u8 w0,u32 frequence)
//{
// u8 i,w;
// frequence=(long int)frequence*4294967296/180000000;
////写w4数据
// w=(frequence>>=0);
// for(i=0;i<8;i++)
// { if((w>>i)&0x01)
// ad9851_data_h;
// else
// ad9851_data_l;
// ad9851_w_clk_h;
// ad9851_w_clk_l;
// }
////写w3数据
// w=(frequence>>8);
// for(i=0;i<8;i++)
// { if((w>>i)&0x01)
// ad9851_data_h;
// else
// ad9851_data_l;
// ad9851_w_clk_h;
// ad9851_w_clk_l;
// }
//
////写w2数据
// w=(frequence>>16);
// for(i=0;i<8;i++)
// { if((w>>i)&0x01)
// ad9851_data_h;
// else
// ad9851_data_l;
// ad9851_w_clk_h;
// ad9851_w_clk_l;
// }
//
////写w1数据
// w=(frequence>>24);
// for(i=0;i<8;i++)
// { if((w>>i)&0x01)
// ad9851_data_h;
// else
// ad9851_data_l;
// ad9851_w_clk_h;
// ad9851_w_clk_l;
// }
////写w0数据
// w=w0;
// for(i=0;i<8;i++)
// { if((w>>i)&0x01)
// ad9851_data_h;
// else
// ad9851_data_l;
// ad9851_w_clk_h;
// ad9851_w_clk_l;
// }
// //移入始能
// ad9851_fq_up_h;
// ad9851_fq_up_l;
//}
int main()
{
//RCC_HSE_Configuration();
AD9851_GPIOC_Configuration();
AD9851_GPIOF_Configuration();
GPIO_Write(GPIOC,0x0000);
GPIO_Write(GPIOF,0x0000);
//串行写1000Hz程序
ad9851_reset_parrel();
ad9851_wr_parrel(0x01,1000000);
while(1);
}
你好,看了你的回复,感觉你这方面应该很强,我也知道是逻辑上出现了问题,我仔细检查了ad9851的时序,觉得是没问题的,能多多指教我下嘛