标题: STM32驱动AD9851的代码有没有特别的啊 还有求求代码 [打印本页]

作者: 3392813517    时间: 2025-7-26 10:55
标题: STM32驱动AD9851的代码有没有特别的啊 还有求求代码
求求代码

作者: wangqibiao51    时间: 2025-7-28 08:03
#include "main.h"
#include "ad9851.h"

/* 函数声明 */
void SystemClock_Config(void);
static void MX_GPIO_Init(void);

int main(void)
{
    /* MCU初始化 */
    HAL_Init();
    SystemClock_Config();
    MX_GPIO_Init();
   
    /* 初始化AD9851 */
    AD9851_Init();
   
    /* 设置AD9851输出频率为10MHz */
    AD9851_SetFrequency(10000000.0, 0);
   
    while (1)
    {
        /* 主循环可以添加其他代码 */
        HAL_Delay(1000);
    }
}

/**
* @brief 系统时钟配置
*/
void SystemClock_Config(void)
{
    RCC_OscInitTypeDef RCC_OscInitStruct = {0};
    RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

    /** 初始化RCC振荡器
     */
    RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
    RCC_OscInitStruct.HSIState = RCC_HSI_ON;
    RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
    RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
    if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
    {
        Error_Handler();
    }
   
    /** 初始化RCC时钟
     */
    RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                                  |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
    RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
    RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
    RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
    RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

    if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
    {
        Error_Handler();
    }
}

/**
* @brief 初始化GPIO
*/
static void MX_GPIO_Init(void)
{
    /* 不需要额外配置,AD9851_Init()中已配置 */
}

/**
* @brief 错误处理函数
*/
void Error_Handler(void)
{
    while(1)
    {
    }
}   
作者: wangqibiao51    时间: 2025-7-28 08:05
#include "ad9851.h"

/* AD9851时钟频率(Hz) */
#define AD9851_CLOCK_FREQ 125000000.0

/**
* @brief 初始化AD9851相关GPIO引脚
*/
void AD9851_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStruct = {0};
   
    /* 使能GPIO时钟 */
    __HAL_RCC_GPIOA_CLK_ENABLE();
   
    /* 配置AD9851控制引脚为输出模式 */
    GPIO_InitStruct.Pin = AD9851_W_CLK_Pin | AD9851_FQ_UD_Pin |
                          AD9851_DATA_Pin | AD9851_RESET_Pin;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
   
    /* 初始化引脚状态 */
    HAL_GPIO_WritePin(AD9851_W_CLK_GPIO_Port, AD9851_W_CLK_Pin, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(AD9851_FQ_UD_GPIO_Port, AD9851_FQ_UD_Pin, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(AD9851_DATA_GPIO_Port, AD9851_DATA_Pin, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(AD9851_RESET_GPIO_Port, AD9851_RESET_Pin, GPIO_PIN_RESET);
   
    /* 复位AD9851 */
    AD9851_Reset();
}

/**
* @brief 复位AD9851
*/
void AD9851_Reset(void)
{
    /* 发送复位脉冲 */
    HAL_GPIO_WritePin(AD9851_RESET_GPIO_Port, AD9851_RESET_Pin, GPIO_PIN_SET);
    HAL_Delay(1);
    HAL_GPIO_WritePin(AD9851_RESET_GPIO_Port, AD9851_RESET_Pin, GPIO_PIN_RESET);
   
    /* 发送W_CLK脉冲 */
    HAL_GPIO_WritePin(AD9851_W_CLK_GPIO_Port, AD9851_W_CLK_Pin, GPIO_PIN_SET);
    HAL_Delay(1);
    HAL_GPIO_WritePin(AD9851_W_CLK_GPIO_Port, AD9851_W_CLK_Pin, GPIO_PIN_RESET);
   
    /* 发送FQ_UD脉冲 */
    HAL_GPIO_WritePin(AD9851_FQ_UD_GPIO_Port, AD9851_FQ_UD_Pin, GPIO_PIN_SET);
    HAL_Delay(1);
    HAL_GPIO_WritePin(AD9851_FQ_UD_GPIO_Port, AD9851_FQ_UD_Pin, GPIO_PIN_RESET);
}

/**
* @brief 向AD9851发送一个字节数据
* @param data 要发送的字节数据
*/
void AD9851_SendByte(uint8_t data)
{
    uint8_t i;
   
    for (i = 0; i < 8; i++)
    {
        /* 设置数据位 */
        if (data & 0x01)
            HAL_GPIO_WritePin(AD9851_DATA_GPIO_Port, AD9851_DATA_Pin, GPIO_PIN_SET);
        else
            HAL_GPIO_WritePin(AD9851_DATA_GPIO_Port, AD9851_DATA_Pin, GPIO_PIN_RESET);
        
        /* 上升沿锁存数据 */
        HAL_GPIO_WritePin(AD9851_W_CLK_GPIO_Port, AD9851_W_CLK_Pin, GPIO_PIN_SET);
        HAL_GPIO_WritePin(AD9851_W_CLK_GPIO_Port, AD9851_W_CLK_Pin, GPIO_PIN_RESET);
        
        data >>= 1;
    }
}

/**
* @brief 设置AD9851输出频率
* @param frequency 要设置的频率值(Hz),范围0-125MHz
* @param powerDown 低功耗模式标志,0-正常工作,1-进入低功耗模式
*/
void AD9851_SetFrequency(double frequency, uint8_t powerDown)
{
    uint32_t freqWord;
    uint8_t controlByte;
    uint8_t i;
   
    /* 计算频率字 */
    freqWord = (uint32_t)((frequency * 4294967296.0) / AD9851_CLOCK_FREQ);
   
    /* 控制字节,D0=0(不使用6倍频),D1=powerDown,D2-D7=0 */
    controlByte = (powerDown << 1);
   
    /* FQ_UD置低 */
    HAL_GPIO_WritePin(AD9851_FQ_UD_GPIO_Port, AD9851_FQ_UD_Pin, GPIO_PIN_RESET);
   
    /* 发送频率字(40位:32位频率字+8位控制字) */
    for (i = 0; i < 4; i++)
    {
        AD9851_SendByte((uint8_t)(freqWord & 0xFF));
        freqWord >>= 8;
    }
   
    /* 发送控制字节 */
    AD9851_SendByte(controlByte);
   
    /* FQ_UD上升沿更新频率 */
    HAL_GPIO_WritePin(AD9851_FQ_UD_GPIO_Port, AD9851_FQ_UD_Pin, GPIO_PIN_SET);
    HAL_GPIO_WritePin(AD9851_FQ_UD_GPIO_Port, AD9851_FQ_UD_Pin, GPIO_PIN_RESET);
}   
作者: wangqibiao51    时间: 2025-7-28 08:05
#ifndef __AD9851_H
#define __AD9851_H

#include "stm32f1xx_hal.h"

/* AD9851引脚定义 */
#define AD9851_W_CLK_Pin GPIO_PIN_0
#define AD9851_W_CLK_GPIO_Port GPIOA
#define AD9851_FQ_UD_Pin GPIO_PIN_1
#define AD9851_FQ_UD_GPIO_Port GPIOA
#define AD9851_DATA_Pin GPIO_PIN_2
#define AD9851_DATA_GPIO_Port GPIOA
#define AD9851_RESET_Pin GPIO_PIN_3
#define AD9851_RESET_GPIO_Port GPIOA

/* 函数声明 */
void AD9851_Init(void);
void AD9851_Reset(void);
void AD9851_SetFrequency(double frequency, uint8_t powerDown);
void AD9851_SendByte(uint8_t data);

#endif /* __AD9851_H */   
作者: wangqibiao51    时间: 2025-7-28 08:06
这套代码实现了 STM32 对 AD9851 的基本驱动,包含三个主要文件:
ad9851.h - 定义了 AD9851 的引脚和函数接口
ad9851.c - 实现了 AD9851 的初始化、复位、数据发送和频率设置等功能
main.c - 提供了一个简单的使用示例,初始化系统并设置 AD9851 输出 10MHz 的频率
使用时需要注意:
确保 STM32 的 GPIO 引脚与 AD9851 正确连接
根据实际使用的 STM32 型号调整 GPIO 时钟和引脚定义
AD9851 的时钟频率默认为 125MHz,如果使用其他频率需要修改代码中的定义
可以通过修改AD9851_SetFrequency()函数的参数来设置不同的输出频率




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1