我的9850程序。lz调试的时候可以先关闭6倍频。把9851当50用。程序里两种计算方法,一种用了64bit数,一种用浮点,都是尽量为了获取更精确的频率配置字。我的小板子直接用了125M晶振,所以计算的时候你要根据自己需要修改,你如果要用6倍频改成180M常量就是了。
 
 main.c
int main(void)
{
    RCC_Configuration();
    ad9850_init();
    delayus(1000);
    ad9850_wr_serial(0,15000000.0);
    while (1);
}
ad9850.c
/************************/
/* platform   dependent */
/************************/
#include "stm32f10x.h"
#include "platform_config.h"
#include "core_cm3.h"
#include "bitband.h"
void delayus(__IO uint32_t nTime); 
#define FQUP GPIO_Pin_14
#define SCLK GPIO_Pin_13
#define SDAT GPIO_Pin_12
#define DATA_PORT GPIOB
#define ad9850_bit_data PB12
#define ad9850_w_clk PB13
#define ad9850_fq_up PB14
void ad9850_gpio_init()
{
    GPIO_InitTypeDef GPIO_InitStructure;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
    GPIO_InitStructure.GPIO_Pin = SCLK;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_Init(DATA_PORT, &GPIO_InitStructure);
    GPIO_InitStructure.GPIO_Pin = SDAT;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_Init(DATA_PORT, &GPIO_InitStructure);
    GPIO_InitStructure.GPIO_Pin = FQUP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_Init(DATA_PORT, &GPIO_InitStructure);
}
/************************/
/* platform independent */
/************************/
void ad9850_serial_init()
{
    ad9850_w_clk = 0;
    delayus(1);
    ad9850_w_clk = 1;
    delayus(1);
    ad9850_w_clk = 0;
    delayus(100);
    ad9850_fq_up=0;
    delayus(10);
    ad9850_fq_up=1;
    delayus(10);
    ad9850_fq_up=0;
}
void ad9850_init()
{
    ad9850_gpio_init();
    ad9850_serial_init();
}
#if 1 /* uint64 or double float */
const uint64_t deltaphase = 0xffffffff00000000 / 125000000; 
void ad9850_wr_serial(unsigned char w, uint32_t frequence)
{
    uint32_t i;
    uint32_t M;
    uint64_t delta = deltaphase * frequence;
    M = delta >> 32;        //频率控制字
    ad9850_w_clk = 0;       //初始化
    ad9850_fq_up = 0;
    //写频率控制字
    for(i=0;i<32;i++)
    {
        ad9850_w_clk = 0;
        ad9850_bit_data = ((M>>i)&1);
        ad9850_w_clk = 1;         //上升沿写入数据
    }
    //写相位控制字
    for(i=0;i<8;i++)
    {
        ad9850_w_clk = 0;
        ad9850_bit_data = (w>>i)&1;
        ad9850_w_clk = 1;         //上升沿写入数据
    }
    //移入始能
    ad9850_fq_up = 0;
    ad9850_fq_up = 1;         //上升沿将40位数一次性打入数据寄存器
    ad9850_fq_up = 0;
}
#else
const double deltaphase = 4294967295.0 / 125000000.0; 
void ad9850_wr_serial(unsigned char w, double frequence)
{
    unsigned char i;
    unsigned long int M;
    //计算频率值
    frequence = frequence * deltaphase; 
    M = frequence;        //频率控制字
    ad9850_w_clk = 0;       //初始化
    ad9850_fq_up = 0;
    //写频率控制字
    for(i=0;i<32;i++)
    {
        ad9850_w_clk = 0;
        ad9850_bit_data = ((M>>i)&1);
        ad9850_w_clk = 1;         //上升沿写入数据
    }
    //写相位控制字
    for(i=0;i<8;i++)
    {
        ad9850_w_clk = 0;
        ad9850_bit_data = (w>>i)&1;
        ad9850_w_clk = 1;         //上升沿写入数据
    }
    //移入始能
    ad9850_fq_up = 0;
    ad9850_fq_up = 1;         //上升沿将40位数一次性打入数据寄存器
    ad9850_fq_up = 0;
}
#endif