细说STM32单片机用定时器触发DAC输出三角波并通过串口观察波形的方法
目录
一、 工程配置
1、时钟、DEBUG、USART2、Project Manager Code Generater
2、DAC1
(1)Mode
(2) DAC out1 Settings
3、TIM3
4、NVIC
二、软件设计
三、下载运行
1、串口助手收到的一段三角波数据
2、示波器显示的三角波
采用定时器TIM3的TRGO信号作为DAC1的触发信号,DAC1在触发信号驱动下输出三角波。通过或示波器观察三角波的波形。
使用的硬件开发板及其它资源,可以参考本文作者的文章:细说STM32单片机DAC基础及软件启动DAC触发并通过串口观察数据的方法-CSDN博客 https://wenchm.blog.csdn.net/article/details/144127805。
一、 工程配置
1、时钟、DEBUG、USART2、Project Manager Code Generater
与参考文章相同。
2、DAC1
(1)Mode
DAC1有2个通道:out1 mode、out2 mode,☐External Trigger。
- out1 mode,选择Connected to external pin only;
- out2 mode,Disable;
- External Trigger,不选择;
(2) DAC out1 Settings
- Mode selected:Normal;
- Output Buffer:Enable;设置是否使用输出缓冲器。如果使用输出缓冲器,可以降低输出阻抗并提高输出的负载能力。默认设置为Enable。
- DAC High Frequency:Automatic;
- DMA Double Data:Disable;
- Signed Format:Disable;
- Trigger:Timer3 Trigger out event;使用定时器TIM3的TRGO信号作为DAC1触发信号源。
- Trigger2:None;
- Wave Generation Mode:Triangle wave generation;
- Maximum Triangle Amplitude:4095;三角波最大幅值是由4位二进制表示的参数,表示1~4095内某个固定的参数值,如1、3、7、127、511、2047、4095等,这里设置为4095。
- User Trimming:Factory Trimming;
3、TIM3
- TIM3 Mode:Internal Clock;
- Prescaler:1700;
- Counter Mode:Up;
- Period:9;
- auto_reload:Enable;
- TRGO:Update Event;
4、NVIC
- 调整TimeBase的优先级为0;
- 开启定时器TIM3的满溢中断,抢占式优先级为1;
设置TIM3的满溢中断,目的是当中断发生时,读取DAC数据,并通过串口发送到串口助手。
二、软件设计
只需设计main.c。
/* USER CODE BEGIN Includes */
#include <stdio.h>
/* USER CODE END Includes */
/* USER CODE BEGIN PV */
uint32_t DCValue=0; //12bits,DC component,0V
/* USER CODE END PV */
/* USER CODE BEGIN 2 */HAL_TIM_Base_Start_IT(&htim3); //Start TIM3 and trigger DAC1 to periodically output DAC value.HAL_DACEx_TriangleWaveGenerate(&hdac1, DAC_CHANNEL_1, DAC_TRIANGLEAMPLITUDE_4095);HAL_DAC_Start(&hdac1,DAC_CHANNEL_1);//start DAC1HAL_DAC_SetValue(&hdac1, DAC_CHANNEL_1, DAC_ALIGN_12B_R, DCValue); // set to output DAC value/* USER CODE END 2 */
/* USER CODE BEGIN 4 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{DCValue = HAL_DAC_GetValue(&hdac1, DAC_CHANNEL_1);printf("DAC1 value = %ld\r\n",DCValue);
}//串口打印
int __io_putchar(int ch)
{HAL_UART_Transmit(&huart2, (uint8_t*)&ch, 1, 0xFFFF);return ch;
}
/* USER CODE END 4 */