一、开发环境
硬件:STM32F407 核心开发板
单片机:STM32F407ZGT6
Keil版本:5.24.2.0
STM32CubeMX版本:6.12.0
二、配置CubeMX
1. 选择时钟源
2. 配置时钟
3. 使能Debug功能:Serial Wire
4. HAL库时基选择:SysTick
5. GPIO配置:如图。
6. 配置工程参数:在Project标签页中,配置项目名称和位置,选择工具链MDK-ARM。
7. 生成代码:在Code Generator标签页中,配置工程外设文件与HAL库,勾选头文件.c和.h文件分开,然后点击Project > Generate Code生成代码。
三、代码实现与部署
1. 添加 dac8550.c 和 dac8550.h 文件(忘了在哪儿找的资源)
dac8550.c
#include "DAC8550.h"
#include "stm32f4xx_hal.h"
#include "main.h"
#include "gpio.h"
// 芯片手册显示存在:±2mV~±12mV的零码误差,模块本身4倍放大,误差为:±8mV~±48mV
// 零码误差测量,使ZeroCode_Error = 0,模块输出0V,如果测量为-5mV,即将ZeroCode_Error幅值为5
int16_t ZeroCode_Error = 0;
//-----------------------------------------------------------------
// void DAC8550_GPIO_Init(void)
//-----------------------------------------------------------------
//
// 函数功能: DAC8550引脚初始化
// 入口参数: 无
// 返回参数: 无
// 全局变量: 无
//
//-----------------------------------------------------------------
void DAC8550_GPIO_Init(void)
{
// GPIO_InitTypeDef GPIO_InitStructure;
// RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); // 开启GPIOB时钟
// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_15;
// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 设置为上拉输入
// GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 时钟50MHz
// GPIO_Init(GPIOB,&GPIO_InitStructure); // 初始化
DAC8550_SYNC_H;
}
//-----------------------------------------------------------------
// void DAC8550_Write_Reg(uint32_t data)
//-----------------------------------------------------------------
//
// 函数功能: DAC8550写数据
// 入口参数: 无
// 返回参数: 无
// 全局变量: 无
//
//-----------------------------------------------------------------
void DAC8550_Write_Reg(uint32_t data)
{
uint8_t i;
DAC8550_SYNC_L;
for(i=0;i<24;i++)
{
DAC8550_SCLK_H;
if(data&0x800000)
{
DAC8550_DIN_H;
}
else
{
DAC8550_DIN_L;
}
DAC8550_SCLK_L;
data<<=1;
}
DAC8550_SYNC_H;
}
//-----------------------------------------------------------------
// void DAC8550_Set_Volatile(float Vol)
//-----------------------------------------------------------------
//
// 函数功能: 设置DAC8550的输出电压
// 入口参数: data:输出电压的数字量
// 返回参数: 无
// 全局变量: 无
//
//-----------------------------------------------------------------
void DAC8550_Set_Volatile(float Vol)
{
float buff;
int16_t Digital;
buff = Vol + ZeroCode_Error;
if(buff>5000)
{
buff=5000;
}
else if(buff<-5000)
{
buff=-5000;
}
Digital = buff/10000*65535;
DAC8550_Write_Reg((uint32_t)((uint16_t)Digital));
}
//-----------------------------------------------------------------
// End Of File
//-----------------------------------------------------------------
dac8550.h
#ifndef _DAC8550_H_
#define _DAC8550_H_
#include "stm32f4xx_hal.h"
#include "main.h"
#include "gpio.h"
//-----------------------------------------------------------------
// 引脚声明
//-----------------------------------------------------------------
#define DAC8550_SYNC_L HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_RESET)
#define DAC8550_SYNC_H HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_SET)
#define DAC8550_SCLK_L HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, GPIO_PIN_RESET)
#define DAC8550_SCLK_H HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, GPIO_PIN_SET)
#define DAC8550_DIN_L HAL_GPIO_WritePin(GPIOB, GPIO_PIN_15, GPIO_PIN_RESET)
#define DAC8550_DIN_H HAL_GPIO_WritePin(GPIOB, GPIO_PIN_15, GPIO_PIN_SET)
//-----------------------------------------------------------------
// 外部函数声明
//-----------------------------------------------------------------
extern void DAC8550_GPIO_Init(void);
extern void DAC8550_Write_Reg(uint32_t data);
extern void DAC8550_Set_Volatile(float Vol);
#endif
//-----------------------------------------------------------------
// End Of File
//-----------------------------------------------------------------
2. main.c增加代码:添加头文件 #include "dac8550.h",然后就可以调用函数输出电压啦。
#include "dac8550.h"
DAC8550_Set_Volatile(-5000); //输出-5000mV