完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
经过两天的摸索,一个纯小白的成功配置过程。
在淘宝上买的AD9854dds四通道正弦波模块,卖家只提供了STM32F103的库函数历程,本博客实现了hal的移植并在f407上实现。 第一步:打开cube mx,时钟配置及下载方式配置。 第二步:打开所有需要的GPIO口,全部初始设为上拉,推挽输出,速度设为高。 连线如图所示进行连接,线比较多请耐心连接。 第三步配置好时钟。 第四步:配置好输出文件,点击右上角生成即可。 开始进入keil程序 keil中添加AD9854.c文件 #include #include "stm32f407xx.h" //#include "delay.h" unsigned char FreqWord[6]; //6个字节频率控制字 //**********************以下为系统时钟以及其相关变量设置************************** /* 此处根据自己的需要设置系统时钟以及与其相关的因子,一次需且只需开启一个 CLK_Set为时钟倍频设置,可设置4~20倍倍频,但最大不能超过300MHZ Freq_mult_ulong和Freq_mult_doulle均为2的48次方除以系统时钟,一个为长整形,一个为双精度型 */ /* #define CLK_Set 4 const ulong Freq_mult_ulong = 3518437; const double Freq_mult_doulle = 3518437.2088832; */ /* #define CLK_Set 5 const ulong Freq_mult_ulong = 2814750; const double Freq_mult_doulle = 2814749.76710656; */ /* #define CLK_Set 6 const ulong Freq_mult_ulong = 2345625; const double Freq_mult_doulle = 2345624.80592213; */ /* #define CLK_Set 7 const ulong Freq_mult_ulong = 2010536; const double Freq_mult_doulle = 2010535.54793326; */ /* #define CLK_Set 8 const ulong Freq_mult_ulong = 1759219; const double Freq_mult_doulle = 1759218.6044416; */ /* #define CLK_Set 9 const ulong Freq_mult_ulong = 1563750; const double Freq_mult_doulle = 1563749.87061476; */ /* #define CLK_Set 10 const ulong Freq_mult_ulong = 1407375; const double Freq_mult_doulle = 1407374.88355328; */ /* #define CLK_Set 11 const ulong Freq_mult_ulong = 1279432; const double Freq_mult_doulle = 1279431.712321164; */ /* #define CLK_Set 12 const ulong Freq_mult_ulong = 1172812; const double Freq_mult_doulle = 1172812.402961067; */ /* #define CLK_Set 13 const ulong Freq_mult_ulong = 1082596; const double Freq_mult_doulle = 1082596.064271754; */ /* #define CLK_Set 14 const ulong Freq_mult_ulong = 1005268; const double Freq_mult_doulle = 1005267.773966629; */ #define CLK_Set 15 const ulong Freq_mult_ulong = 938250; const double Freq_mult_doulle = 938249.9223688533; //**************************修改硬件时要修改的部分******************************** //**************************以下部分为函数定义******************************** static void AD9854_WR_Byte(uint32_t addr,uint32_t dat); extern void AD9854_Init(void); static void Freq_convert(long Freq); extern void AD9854_SetSine(ulong Freq,uint Shape); static void Freq_double_convert(double Freq); extern void AD9854_SetSine_double(double Freq,uint Shape); extern void AD9854_InitFSK(void); extern void AD9854_SetFSK(ulong Freq1,ulong Freq2); extern void AD9854_InitBPSK(void); extern void AD9854_SetBPSK(uint Phase1,uint Phase2); extern void AD9854_InitOSK(void); extern void AD9854_SetOSK(uchar RateShape); extern void AD9854_InitAM(void); extern void AD9854_SetAM(uint Shape); extern void AD9854_InitRFSK(void); extern void AD9854_SetRFSK(ulong Freq_Low,ulong Freq_High,ulong Freq_Up_Down,ulong FreRate); //void AD9854_IO_Init(void) //{ // GPIO_InitTypeDef GPIO_InitStructure ; // // RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC, ENABLE); //使能PB,PE端口时钟 // GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; // GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz ; // GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ; // GPIO_Init(GPIOB ,&GPIO_InitStructure) ; // // GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6| GPIO_Pin_4| GPIO_Pin_5| GPIO_Pin_8| GPIO_Pin_2; // GPIO_Init(GPIOA ,&GPIO_InitStructure) ; // // GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All^(GPIO_Pin_14| GPIO_Pin_15); // GPIO_Init(GPIOC ,&GPIO_InitStructure) ; //} //==================================================================================== //函数名称:void AD9854_WR_Byte(uchar addr,uchar dat) //函数功能:AD9854并行口写入数据 //入口参数:addr 6位地址 // dat 写入的数据 //出口参数:无 //==================================================================================== uint32_t dat1,dat2; void AD9854_WR_Byte(uint32_t addr,uint32_t dat) { dat1= dat|(addr<<8); AD9854_AdrBus=(dat1&0x3fff)|((dat1^0x3fff)<<16); // AD9854_AdrBus = ((addr&0x3f)<<8) | ((addr^0x3f)<<(16+8)); // AD9854_DataBus = dat|(dat^0xff)<<16; // dat1 = ((addr&0x3f)<<8) | ((addr^0x3f)<<(16+8)); // dat2 = (dat1&0x3fff)|((dat1^0x3fff)<<16); AD9854_WR = 0; AD9854_WR = 1; } //==================================================================================== //函数名称:void AD9854_Init(void) //函数功能:AD9854初始化 //入口参数:无 //出口参数:无 //==================================================================================== void AD9854_Init(void) { AD9854_WR=1;//将读、写控制端口设为无效 AD9854_RD=1; AD9854_UDCLK=0; AD9854_RST=1; //复位AD9854 AD9854_RST=0; AD9854_WR_Byte(0x1d,0x00); //关闭比较器 AD9854_WR_Byte(0x1e,CLK_Set); //设置系统时钟倍频 AD9854_WR_Byte(0x1f,0x00); //设置系统为模式0,由外部更新 AD9854_WR_Byte(0x20,0x60); //设置为可调节幅度,取消插值补偿 AD9854_UDCLK=1; //更新AD9854输出 AD9854_UDCLK=0; } //==================================================================================== //函数名称:void Freq_convert(long Freq) //函数功能:正弦信号频率数据转换 //入口参数:Freq 需要转换的频率,取值从0~SYSCLK/2 //出口参数:无 但是影响全局变量FreqWord[6]的值 //说明: 该算法位多字节相乘算法,有公式FTW = (Desired Output Frequency × 2N)/SYSCLK // 得到该算法,其中N=48,Desired Output Frequency 为所需要的频率,即Freq,SYSCLK // 为可编程的系统时钟,FTW为48Bit的频率控制字,即FreqWord[6] //==================================================================================== void Freq_convert(long Freq) { ulong FreqBuf; ulong Temp=Freq_mult_ulong; uchar Array_Freq[4]; //将输入频率因子分为四个字节 Array_Freq[0]=(uchar)Freq; Array_Freq[1]=(uchar)(Freq>>8); Array_Freq[2]=(uchar)(Freq>>16); Array_Freq[3]=(uchar)(Freq>>24); FreqBuf=Temp*Array_Freq[0]; FreqWord[0]=FreqBuf; FreqBuf>>=8; FreqBuf+=(Temp*Array_Freq[1]); FreqWord[1]=FreqBuf; FreqBuf>>=8; FreqBuf+=(Temp*Array_Freq[2]); FreqWord[2]=FreqBuf; FreqBuf>>=8; FreqBuf+=(Temp*Array_Freq[3]); FreqWord[3]=FreqBuf; FreqBuf>>=8; FreqWord[4]=FreqBuf; FreqWord[5]=FreqBuf>>8; } //==================================================================================== //函数名称:void AD9854_SetSine(ulong Freq,uint Shape) //函数功能:AD9854正弦波产生程序 //入口参数:Freq 频率设置,取值范围为0~(1/2)*SYSCLK // Shape 幅度设置. 为12 Bit,取值范围为(0~4095) ,取值越大,幅度越大 //出口参数:无 //==================================================================================== void AD9854_SetSine(ulong Freq,uint Shape) { uchar count; uchar Adress; Adress = 0x04; //选择频率控制字地址的初值 Freq_convert(Freq); //频率转换 for(count=6;count>0;) //写入6字节的频率控制字 { AD9854_WR_Byte(Adress++,FreqWord[--count]); } AD9854_WR_Byte(0x21,Shape>>8); //设置I通道幅度 AD9854_WR_Byte(0x22,(uchar)(Shape&0xff)); AD9854_WR_Byte(0x23,Shape>>8); //设置Q通道幅度 AD9854_WR_Byte(0x24,(uchar)(Shape&0xff)); AD9854_UDCLK=1; //更新AD9854输出 AD9854_UDCLK=0; } //==================================================================================== //函数名称:void Freq_doublt_convert(double Freq) //函数功能:正弦信号频率数据转换 //入口参数:Freq 需要转换的频率,取值从0~SYSCLK/2 //出口参数:无 但是影响全局变量FreqWord[6]的值 //说明: 有公式FTW = (Desired Output Frequency × 2N)/SYSCLK得到该函数, // 其中N=48,Desired Output Frequency 为所需要的频率,即Freq,SYSCLK // 为可编程的系统时钟,FTW为48Bit的频率控制字,即FreqWord[6] //注意: 该函数与上面函数的区别为该函数的入口参数为double,可使信号的频率更精确 // 建议在100HZ以下用本函数,在高于100HZ的情况下用函数void Freq_convert(long Freq) //==================================================================================== void Freq_double_convert(double Freq) { ulong Low32; uint High16; double Temp=Freq_mult_doulle; //23ca99为2的48次方除以120M Freq*=(double)(Temp); // 1 0000 0000 0000 0000 0000 0000 0000 0000 = 4294967295 High16 =(int)(Freq/4294967295); //2^32 = 4294967295 Freq -= (double)High16*4294967295; Low32 = (ulong)Freq; FreqWord[0]=Low32; FreqWord[1]=Low32>>8; FreqWord[2]=Low32>>16; FreqWord[3]=Low32>>24; FreqWord[4]=High16; FreqWord[5]=High16>>8; } //==================================================================================== //函数名称:void AD9854_SetSine_double(double Freq,uint Shape) //函数功能:AD9854正弦波产生程序 //入口参数:Freq 频率设置,取值范围为0~1/2*SYSCLK // Shape 幅度设置. 为12 Bit,取值范围为(0~4095) //出口参数:无 //==================================================================================== void AD9854_SetSine_double(double Freq,uint Shape) { uchar count=0; uchar Adress; Adress=0x04; //选择频率控制字1地址的初值 Freq_double_convert(Freq); //频率转换 for(count=6;count>0;) //写入6字节的频率控制字 { AD9854_WR_Byte(Adress++,FreqWord[--count]); } AD9854_WR_Byte(0x21,Shape>>8); //设置I通道幅度 AD9854_WR_Byte(0x22,(uchar)(Shape&0xff)); AD9854_WR_Byte(0x23,Shape>>8); //设置Q通道幅度 AD9854_WR_Byte(0x24,(uchar)(Shape&0xff)); AD9854_UDCLK=1; //更新AD9854输出 AD9854_UDCLK=0; } //==================================================================================== //函数名称:void AD9854_InitFSK(void) //函数功能:AD9854的FSK初始化 //入口参数:无 //出口参数:无 //==================================================================================== void AD9854_InitFSK(void) { AD9854_WR=1; //将读、写控制端口设为无效 AD9854_RD=1; AD9854_UDCLK=0; AD9854_RST=1; //复位AD9854 AD9854_RST=0; AD9854_WR_Byte(0x1d,0x00); //关闭比较器 AD9854_WR_Byte(0x1e,CLK_Set); //设置系统时钟倍频 AD9854_WR_Byte(0x1f,0x02); //设置系统为模式1,由外部更新 AD9854_WR_Byte(0x20,0x60); //设置为可调节幅度,取消插值补偿 AD9854_UDCLK=1; //更新AD9854输出 AD9854_UDCLK=0; } //==================================================================================== //函数名称:void AD9854_SetFSK(ulong Freq1,ulong Freq2) //函数功能:AD9854的FSK设置 //入口参数:Freq1 FSK频率1 // Freq2 FSK频率2 //出口参数:无 //==================================================================================== void AD9854_SetFSK(ulong Freq1,ulong Freq2) { uchar count=6; uchar Adress1,Adress2; const uint Shape=4000; //幅度设置. 为12 Bit,取值范围为(0~4095) Adress1=0x04; //选择频率控制字1地址的初值 Adress2=0x0a; //选择频率控制字2地址的初值 Freq_convert(Freq1); //频率转换1 for(count=6;count>0;) //写入6字节的频率控制字 { AD9854_WR_Byte(Adress1++,FreqWord[--count]); } Freq_convert(Freq2); //频率转换2 for(count=6;count>0;) //写入6字节的频率控制字 { AD9854_WR_Byte(Adress2++,FreqWord[--count]); } AD9854_WR_Byte(0x21,Shape>>8); //设置I通道幅度 AD9854_WR_Byte(0x22,(uchar)(Shape&0xff)); AD9854_WR_Byte(0x23,Shape>>8); //设置Q通道幅度 AD9854_WR_Byte(0x24,(uchar)(Shape&0xff)); AD9854_UDCLK=1; //更新AD9854输出 AD9854_UDCLK=0; } //==================================================================================== //函数名称:void AD9854_InitBPSK(void) //函数功能:AD9854的BPSK初始化 //入口参数:无 //出口参数:无 //==================================================================================== void AD9854_InitBPSK(void) { AD9854_WR=1; //将读、写控制端口设为无效 AD9854_RD=1; AD9854_UDCLK=0; AD9854_RST=1; //复位AD9854 AD9854_RST=0; AD9854_WR_Byte(0x1d,0x00); //打开比较器,输出方波 AD9854_WR_Byte(0x1e,CLK_Set); //设置系统时钟倍频 AD9854_WR_Byte(0x1f,0x08); //设置系统为模式4,由外部更新 AD9854_WR_Byte(0x20,0x60); //设置为可调节幅度,取消插值补偿 AD9854_UDCLK=1; //更新AD9854输出 AD9854_UDCLK=0; } //==================================================================================== //函数名称:void AD9854_SetBPSK(uint Phase1,uint Phase2) //函数功能:AD9854的BPSK设置 //入口参数:Phase1 调制相位1 // Phase2 调制相位2 //出口参数:无 //说明: 相位为14Bit,取值从0~16383,建议在用本函数的时候将Phase1设置为0, // 将Phase1设置为8192,180°相位 //==================================================================================== void AD9854_SetBPSK(uint Phase1,uint Phase2) { uchar count; const ulong Freq=60000; const uint Shape=4000; uchar Adress; Adress=0x04; //选择频率控制字1地址的初值 AD9854_WR_Byte(0x00,Phase1>>8); //设置相位1 AD9854_WR_Byte(0x01,(uchar)(Phase1&0xff)); AD9854_WR_Byte(0x02,Phase2>>8); //设置相位2 AD9854_WR_Byte(0x03,(uchar)(Phase2&0xff)); Freq_convert(Freq); //频率转换 for(count=6;count>0;) //写入6字节的频率控制字 { AD9854_WR_Byte(Adress++,FreqWord[--count]); } AD9854_WR_Byte(0x21,Shape>>8); //设置I通道幅度 AD9854_WR_Byte(0x22,(uchar)(Shape&0xff)); AD9854_WR_Byte(0x23,Shape>>8); //设置Q通道幅度 AD9854_WR_Byte(0x24,(uchar)(Shape&0xff)); AD9854_UDCLK=1; //更新AD9854输出 AD9854_UDCLK=0; } //==================================================================================== //函数名称:void AD9854_InitOSK(void) //函数功能:AD9854的OSK初始化 //入口参数:无 //出口参数:无 //==================================================================================== void AD9854_InitOSK(void) { AD9854_WR=1; //将读、写控制端口设为无效 AD9854_RD=1; AD9854_UDCLK=0; AD9854_RST=1; //复位AD9854 AD9854_RST=0; AD9854_WR_Byte(0x1d,0x00); //关闭比较器 AD9854_WR_Byte(0x1e,CLK_Set); //设置系统时钟倍频 AD9854_WR_Byte(0x1f,0x00); //设置系统为模式0,由外部更新 AD9854_WR_Byte(0x20,0x70); //设置为可调节幅度,取消插值补偿,通断整形内部控制 AD9854_UDCLK=1; //更新AD9854输出 AD9854_UDCLK=0; } //==================================================================================== //函数名称:void AD9854_SetOSK(uchar RateShape) //函数功能:AD9854的OSK设置 //入口参数: RateShape OSK斜率,取值为4~255,小于4则无效 //出口参数:无 //==================================================================================== void AD9854_SetOSK(uchar RateShape) { uchar count; const ulong Freq=60000; //设置载频 const uint Shape=4000; //幅度设置. 为12 Bit,取值范围为(0~4095) uchar Adress; Adress=0x04; //选择频率控制字地址的初值 Freq_convert(Freq); //频率转换 for(count=6;count>0;) //写入6字节的频率控制字 { AD9854_WR_Byte(Adress++,FreqWord[--count]); } AD9854_WR_Byte(0x21,Shape>>8); //设置I通道幅度 AD9854_WR_Byte(0x22,(uchar)(Shape&0xff)); AD9854_WR_Byte(0x23,Shape>>8); //设置Q通道幅度 AD9854_WR_Byte(0x24,(uchar)(Shape&0xff)); AD9854_WR_Byte(0x25,RateShape); //设置OSK斜率 AD9854_UDCLK=1; //更新AD9854输出 AD9854_UDCLK=0; } //==================================================================================== //函数名称:void AD9854_InitAM(void) //函数功能:AD9854的AM初始化 //入口参数:无 //出口参数:无 //==================================================================================== void AD9854_InitAM(void) { uchar count; const ulong Freq=60000; //设置载频 uchar Adress; Adress=0x04; //选择频率控制字地址的初值 AD9854_WR=1; //将读、写控制端口设为无效 AD9854_RD=1; AD9854_UDCLK=0; AD9854_RST=1; //复位AD9854 AD9854_RST=0; AD9854_WR_Byte(0x1d,0x00); //关闭比较器 AD9854_WR_Byte(0x1e,CLK_Set); //设置系统时钟倍频 AD9854_WR_Byte(0x1f,0x00); //设置系统为模式0,由外部更新 AD9854_WR_Byte(0x20,0x60); //设置为可调节幅度,取消插值补偿 Freq_convert(Freq); //频率转换 for(count=6;count>0;) //写入6字节的频率控制字 { AD9854_WR_Byte(Adress++,FreqWord[--count]); } AD9854_UDCLK=1; //更新AD9854输出 AD9854_UDCLK=0; } //==================================================================================== //函数名称:void AD9854_SetAM(uchar Shape) //函数功能:AD9854的AM设置 //入口参数:Shape 12Bit幅度,取值从0~4095 //出口参数:无 //==================================================================================== void AD9854_SetAM(uint Shape) { AD9854_WR_Byte(0x21,Shape>>8); //设置I通道幅度 AD9854_WR_Byte(0x22,(uchar)(Shape&0xff)); AD9854_WR_Byte(0x23,Shape>>8); //设置Q通道幅度 AD9854_WR_Byte(0x24,(uchar)(Shape&0xff)); AD9854_UDCLK=1; //更新AD9854输出 AD9854_UDCLK=0; } //==================================================================================== //函数名称:void AD9854_InitRFSK(void) //函数功能:AD9854的RFSK初始化 //入口参数:无 //出口参数:无 //==================================================================================== void AD9854_InitRFSK(void) { AD9854_WR=1; //将读、写控制端口设为无效 AD9854_RD=1; AD9854_UDCLK=0; AD9854_RST=1; //复位AD9854 AD9854_RST=0; AD9854_WR_Byte(0x1d,0x00); //关闭比较器 AD9854_WR_Byte(0x1e,CLK_Set); //设置系统时钟倍频 AD9854_WR_Byte(0x1f,0x24); //设置系统为模式2,由外部更新,使能三角波扫频功能 AD9854_WR_Byte(0x20,0x60); //设置为可调节幅度,取消插值补偿 AD9854_UDCLK=1; //更新AD9854输出 AD9854_UDCLK=0; } //==================================================================================== //函数名称:void AD9854_SetRFSK(void) //函数功能:AD9854的RFSK设置 //入口参数:Freq_Low RFSK低频率 48Bit // Freq_High RFSK高频率 48Bit // Freq_Up_Down 步进频率 48Bit // FreRate 斜率时钟控制 20Bit //出口参数:无 //注: 每两个脉冲之间的时间周期用下式表示(FreRate +1)*(System Clock ),一个脉冲, // 频率 上升或者下降 一个步进频率 //==================================================================================== void AD9854_SetRFSK(ulong Freq_Low,ulong Freq_High,ulong Freq_Up_Down,ulong FreRate) { uchar count=6; uchar Adress1,Adress2,Adress3; const uint Shape=4000; //幅度设置. 为12 Bit,取值范围为(0~4095) Adress1=0x04; //选择频率控制字地址的初值 Adress2=0x0a; Adress3=0x10; Freq_convert(Freq_Low); //频率1转换 for(count=6;count>0;) //写入6字节的频率控制字 { AD9854_WR_Byte(Adress1++,FreqWord[--count]); } Freq_convert(Freq_High); //频率2转换 for(count=6;count>0;) //写入6字节的频率控制字 { AD9854_WR_Byte(Adress2++,FreqWord[--count]); } Freq_convert(Freq_Up_Down); //步进频率转换 for(count=6;count>0;) //写入6字节的频率控制字 { AD9854_WR_Byte(Adress3++,FreqWord[--count]); } AD9854_WR_Byte(0x1a,(uchar)((FreRate>>16)&0x0f)); //设置斜升速率 AD9854_WR_Byte(0x1b,(uchar)(FreRate>>8)); AD9854_WR_Byte(0x1c,(uchar)FreRate); AD9854_WR_Byte(0x21,Shape>>8); //设置I通道幅度 AD9854_WR_Byte(0x22,(uchar)(Shape&0xff)); AD9854_WR_Byte(0x23,Shape>>8); //设置Q通道幅度 AD9854_WR_Byte(0x24,(uchar)(Shape&0xff)); AD9854_UDCLK=1; //更新AD9854输出 AD9854_UDCLK=0; } //测试正弦波,采用120MHZ SYSCLK时,出来10MHZ波形,波形很好,测试成功 //当采用300MHZ SYSCLK时,测试50MHZ波形时,DDS发热厉害,且波形衰减严重,幅度在35mV左右 // //int main() //{ // AD9854_Init(); // AD9854_SetSine(80000000,4095); // while(1); //} //测试正弦波,采用120MHZ SYSCLK时,出来87.697HZ波形,波形很好,测试成功 // //int main() //{ // AD9854_Init(); // AD9854_SetSine_double(87.697,4000); // while(1); //} //测试FSK,采用120MHZ SYSCLK,1K和6K,测试成功,结果对应"FSK波形.bmp" //int main() //{ // AD9854_InitFSK(); // AD9854_SetFSK(1000,6000); // while(1) // { // AD9854_FDATA = 1; // delay_us(30000); //延时时间长,便于观察 // AD9854_FDATA = 0; // delay_us(30000); // } //} //测试BPSK,采用120MHZ SYSCLK,测试成功 //int main() //{ // AD9854_InitBPSK(); // AD9854_SetBPSK(0,8192); // while(1) // { // AD9854_FDATA = 1; // delay_us(10); // AD9854_FDATA = 0; // delay_us(10); // } //} //测试OSK,采用120MHZ SYSCLK,测试成功 //int main() //{ // AD9854_InitOSK(); // AD9854_SetOSK(10); // while(1) // { // AD9854_OSK=1; // delay_us(30); // AD9854_OSK=0; // delay_us(30); // } //} //测试AM,采用120MHZ SYSCLK,测试成功 //int main() //{ // AD9854_InitAM(); // while(1) // { // AD9854_SetAM(2000); // delay_us(10); // AD9854_SetAM(4000); // delay_us(10); // } //} // //测试RFSK,采用120MHZ SYSCLK,测试成功 //int main() //{ // AD9854_InitRFSK(); // AD9854_SetRFSK(1000,60000,100,30); // while(1) // { // AD9854_FDATA = 1; // delay_us(30000); //延时时间长,便于观察 // AD9854_FDATA = 0; // delay_us(30000); // } //} 添加AD9854.h文件 #ifndef __AD9854_H #define __AD9854_H #include "sys.h" #define AD9854_RST PAout(6) //AD9854复位端口 #define AD9854_UDCLK PAout(4) //AD9854更新时钟 #define AD9854_WR PAout(5) //AD9854写使能,低有效 #define AD9854_RD PAout(8) //AD9854读使能,低有效 #define AD9854_OSK PAout(2) //AD9854 OSK控制端 #define AD9854_FDATA PBout(10) //AD9854 FSK,PSK控制 #define AD9854_DataBus GPIOC->BSRR #define AD9854_AdrBus GPIOC->BSRR #define uint unsigned int #define uchar unsigned char #define ulong unsigned long extern void AD9854_Init(void); static void Freq_convert(long Freq); extern void AD9854_SetSine(ulong Freq,uint Shape); static void Freq_double_convert(double Freq); extern void AD9854_SetSine_double(double Freq,uint Shape); extern void AD9854_InitFSK(void); extern void AD9854_SetFSK(ulong Freq1,ulong Freq2); extern void AD9854_InitBPSK(void); extern void AD9854_SetBPSK(uint Phase1,uint Phase2); extern void AD9854_InitOSK(void); extern void AD9854_SetOSK(uchar RateShape); extern void AD9854_InitAM(void); extern void AD9854_SetAM(uint Shape); extern void AD9854_InitRFSK(void); extern void AD9854_SetRFSK(ulong Freq_Low,ulong Freq_High,ulong Freq_Up_Down,ulong FreRate); #endif 添加sys.c文件 __asm void WFI_SET(void) { WFI; } //关闭所有中断(但是不包括fault和NMI中断) __asm void INTX_DISABLE(void) { CPSID I BX LR } //开启所有中断 __asm void INTX_ENABLE(void) { CPSIE I BX LR } //设置栈顶地址 //addr:栈顶地址 __asm void MSR_MSP(uint32_t addr) { MSR MSP, r0 //set Main Stack value BX r14 } 添加sys.h文件 #ifndef __SYS_H #define __SYS_H #include "stm32f4xx.h" #define SYSTEM_SUPPORT_OS 0 //定义系统文件夹是否支持UCOS //位带操作,实现51类似的GPIO控制功能 //具体实现思想,参考< //IO口操作宏定义 #define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2)) #define MEM_ADDR(addr) *((volatile unsigned long *)(addr)) #define BIT_ADDR(addr, bitnum) MEM_ADDR(BITBAND(addr, bitnum)) //IO口地址映射 #define GPIOA_ODR_Addr (GPIOA_BASE+20) //0x40020014 #define GPIOB_ODR_Addr (GPIOB_BASE+20) //0x40020414 #define GPIOC_ODR_Addr (GPIOC_BASE+20) //0x40020814 #define GPIOD_ODR_Addr (GPIOD_BASE+20) //0x40020C14 #define GPIOE_ODR_Addr (GPIOE_BASE+20) //0x40021014 #define GPIOF_ODR_Addr (GPIOF_BASE+20) //0x40021414 #define GPIOG_ODR_Addr (GPIOG_BASE+20) //0x40021814 #define GPIOH_ODR_Addr (GPIOH_BASE+20) //0x40021C14 #define GPIOI_ODR_Addr (GPIOI_BASE+20) //0x40022014 #define GPIOA_IDR_Addr (GPIOA_BASE+16) //0x40020010 #define GPIOB_IDR_Addr (GPIOB_BASE+16) //0x40020410 #define GPIOC_IDR_Addr (GPIOC_BASE+16) //0x40020810 #define GPIOD_IDR_Addr (GPIOD_BASE+16) //0x40020C10 #define GPIOE_IDR_Addr (GPIOE_BASE+16) //0x40021010 #define GPIOF_IDR_Addr (GPIOF_BASE+16) //0x40021410 #define GPIOG_IDR_Addr (GPIOG_BASE+16) //0x40021810 #define GPIOH_IDR_Addr (GPIOH_BASE+16) //0x40021C10 #define GPIOI_IDR_Addr (GPIOI_BASE+16) //0x40022010 //IO口操作,只对单一的IO口! //确保n的值小于16! #define PAout(n) BIT_ADDR(GPIOA_ODR_Addr,n) //输出 #define PAin(n) BIT_ADDR(GPIOA_IDR_Addr,n) //输入 #define PBout(n) BIT_ADDR(GPIOB_ODR_Addr,n) //输出 #define PBin(n) BIT_ADDR(GPIOB_IDR_Addr,n) //输入 #define PCout(n) BIT_ADDR(GPIOC_ODR_Addr,n) //输出 #define PCin(n) BIT_ADDR(GPIOC_IDR_Addr,n) //输入 #define PDout(n) BIT_ADDR(GPIOD_ODR_Addr,n) //输出 #define PDin(n) BIT_ADDR(GPIOD_IDR_Addr,n) //输入 #define PEout(n) BIT_ADDR(GPIOE_ODR_Addr,n) //输出 #define PEin(n) BIT_ADDR(GPIOE_IDR_Addr,n) //输入 #define PFout(n) BIT_ADDR(GPIOF_ODR_Addr,n) //输出 #define PFin(n) BIT_ADDR(GPIOF_IDR_Addr,n) //输入 #define PGout(n) BIT_ADDR(GPIOG_ODR_Addr,n) //输出 #define PGin(n) BIT_ADDR(GPIOG_IDR_Addr,n) //输入 #define PHout(n) BIT_ADDR(GPIOH_ODR_Addr,n) //输出 #define PHin(n) BIT_ADDR(GPIOH_IDR_Addr,n) //输入 #define PIout(n) BIT_ADDR(GPIOI_ODR_Addr,n) //输出 #define PIin(n) BIT_ADDR(GPIOI_IDR_Addr,n) //输入 //以下为汇编函数 void WFI_SET(void); //执行WFI指令 void INTX_DISABLE(void);//关闭所有中断 void INTX_ENABLE(void); //开启所有中断 void MSR_MSP(uint32_t addr); //设置堆栈地址 #endif 添加完成如图所示 到这里恭喜你已经配置完成了下面就开始简单的使用它。如图所示添加 /* USER CODE BEGIN 2 */ AD9854_Init(); /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { AD9854_SetSine(10000,2040); while(1); 实现频率为10k,ad值为2040的输出;正弦波与方波接线及效果如图所示 结果的峰峰值会有一定的衰减,想要在进行放大可以进行外接功放即可。 到这里就完了,希望你们都是配置成功呀。 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1618 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1545 浏览 1 评论
979 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
683 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1597 浏览 2 评论
1864浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
646浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
516浏览 3评论
532浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
505浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-23 01:03 , Processed in 1.229810 second(s), Total 76, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号