一、平台新建项目(以STM32H750VBxx系列为例)
二、配置
1、确认时钟源
进入工程后打开 RCC 选项,选择 Crystal/Ceramic Resonator,即使用外部晶振作为 HSE 的时钟源。
2、配置系统时钟
3、配置仿真和调试方式
4、DAC的配置
首先打开DAC OUT2通道,
触发方式设置为TIM6事件触发,
输出缓冲Output Buffer建议关闭。DAC的输出缓存可以用来减小输出阻抗,无需外部运放即可直接驱动外部负载。但输出不能达到0(会出现底部失真),不推荐开启。具体参考官方手册,缓冲器打开时低端的DAC输出电压大概0.2V(不同型号可能不同,暂未考证)
接着打开DAC的DMA,DMA的方式可以减轻CPU的负担,配置如下,需要注意的是工作Mode配置为Circular(循环模式):
5、TIM6配置
触发事件选择为更新事件
由于TIM6是挂载在APB1LENR时钟线上,在前边步骤2系统时钟的配置,所以TIM6我们设为了240M
计数周期为(38+1),触发频率为240M/39≈6153.8kHz。定时器的配置决定了输出的正弦波的频率。
三、代码生成
1、工程项目的命名、选择MDK-ARM编译环境
2、生成代码的配置
3、最后一步生成代码
四、添加代码
前边我们定时器时钟已经设为240M。
正弦波的频率=主频 /(TIM_Prescaler+1)/(TIM_Period+1)/ 点数
我们选80个点
f=240M/(0+1)/(38+1)/80≈76.9kHz.
打开我们的代码工程
1、编写一个正弦波生成函数,将一个周期的正弦波数据存储在数组中,这里一个周期为80个点。
uint16_t Dat[80];
void SineWave()
{
uint16_t i;
for( i=0;i<80;i++)
{
Dat[i]=(uint16_t)((2047*sin(i*2*3.14159/80))+2048);
}
}
2、在主函数中调用相关函数,产生周期的正弦波:
SineWave();//生成正弦数据
HAL_TIM_Base_Start(&htim6);//打开定时器6
HAL_DAC_Start_DMA(&hdac1,DAC_CHANNEL_2,(uint32_t *)Dat,80,DAC_ALIGN_12B_R);//开启DMA-DAC
添加完代码,编译通过后烧录至板子
3、用示波器观察PA5
如下,频率为76.9kHz的正弦波: