#以下所有代码基于STM32G431CBU6和CubeMX联合开发
1.CubeMX配置
1.1打开RCC和SYS
RCC配置为HSE(外部高速时钟)里面的Crystal/Ceramic Resonater(晶振)
时钟树配置
1.2配置TIM2
更改时钟源(clock source)为internal clock,Trigger Event(触发事件)为update Event(更新事件),自动重装载寄存器(ARR)设置为85-1,因为主频170MHZ,170M/85-1+1=2M。选取100个数据点,2M/100为20KHZ的频率
1.3配置DAC和DMA
打开DAC1的OUT1并设置为仅连接到外部引脚,然后在参数设置中将触发(Trigger)改为TIM2输出事件触发,
然后跳转到DMA设置中进行如下配置
注意一定要为循环模式
1.4生成MDK文件或者其他
2.代码编写(写在begin end里面,以防刷新掉)
2.1相关常量宏定义
uint16_t SineWaveTable[100];
#define POINTS 100
2.2生成正弦波数据点函数
void SineWaveGen(uint32_t NPoints, float VMaxRange, uint16_t* SineWaveTable)
{
#ifndef PI
#define PI 3.14159265358979323846
#endif
int i = 0;
double radian = 0; // 弧度
double setup = 0; // 弧度和弧度之间的大小
double voltage = 0; // 输出电压
setup = (2 * PI) / NPoints; // 两点之间的间距
while (i < NPoints)
{
voltage = VMaxRange / 2.0 * (sin(radian) + 1.0); // 计算电压
SineWaveTable[i] = (uint16_t)(voltage * 4096 / 3.3); // 电压转为DAC数值
radian += setup; // 下一个点的弧度
i++;
}
}
2.3主函数中调用
在while(1)循环前面进行开启操作
//产生20KHz,100mV电压的正弦波
HAL_TIM_Base_Start(&htim2);
HAL_DAC_Start(&hdac1, DAC_CHANNEL_1);
SineWaveGen(POINTS,1,SineWaveTable);//无分频,重载值85,170M/85=20M,一周期100点20KMHz
HAL_DAC_Start_DMA(&hdac1, DAC_CHANNEL_1, (uint32_t *)SineWaveTable, POINTS, DAC_ALIGN_12B_R);
//正弦波幅度在函数中进行更改,频率根据时钟树和定时器分频数和自动重装载值进行更改