标题:
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