|
本帖最后由 蓝天白云51 于 2025-7-30 11:21 编辑
玩单片机难在写代码.现在有了AI就不成问题了.本人现在也能"写"出几千行代码了.
这在过去是不可想象的.请看下面stm32驱动AD9851的代码.就是AI写的.
#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);
}
|
|