本帖最后由 lugl4313820 于 2024-2-22 07:42 编辑
【目的】使用DAC+GPDMA生成正弦波
【硬件】
1、ST NUCLEO-U5A5ZJ-Q开发板
2、示波器
【软件环境】
STM32CubeIDE1.14.0
【实现步骤】
1、使用stm32CubeIDE新建基于STM32U5A5JT6核心的基础工程。
2、配置时钟为160MHz。
3、配置sys的时钟为SysTick。
4、开置ICAHE,模式为1-way。
5、开启DEBUG
6、配置DAC1,选择输出为OUT1,连接为only external pin。stm32cubeMAX会自己动配置PA4为输出IO。
7、在参数配置中,按下图配置参数:
8、接着配置TIM1,如下图所示,触发选择内部ITR1,向上计数,计数值为5000,产生更新时事件。
9、配置GPDMA,打开channel9,配置循环模式,port选择1,打开中断。
10、创建链表用于GPDMA连接到DAC,名字为DACQueue,linked list选择GPDMA,循环模式,第一个节点名字为DACNode.
11、配置节点属性如下:
12、 同时需要调整一下工程中的函数启动顺序:
13、生成代码,并打开工程。
14、在main.c中引用linked_list.h的头文件,并声明变量DACQueue;
/* USER CODE BEGIN Includes */
#include "linked_list.h"
/* USER CODE END Includes */
/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
extern DMA_QListTypeDef DACQueue;
/* USER CODE END PTD */
15、添加一个生成正弦波的数组:
/* USER CODE BEGIN PV */
uint32_t data_sin[128] = {
2048, 2145, 2242, 2339, 2435, 2530, 2624, 2717, 2808, 2897,
2984, 3069, 3151, 3230, 3307, 3381, 3451, 3518, 3581, 3640,
3696, 3748, 3795, 3838, 3877, 3911, 3941, 3966, 3986, 4002,
4013, 4019, 4020, 4016, 4008, 3995, 3977, 3954, 3926, 3894,
3858, 3817, 3772, 3722, 3669, 3611, 3550, 3485, 3416, 3344,
3269, 3191, 3110, 3027, 2941, 2853, 2763, 2671, 2578, 2483,
2387, 2291, 2194, 2096, 1999, 1901, 1804, 1708, 1612, 1517,
1424, 1332, 1242, 1154, 1068, 985, 904, 826, 751, 679,
610, 545, 484, 426, 373, 323, 278, 237, 201, 169,
141, 118, 100, 87, 79, 75, 76, 82, 93, 109,
129, 154, 184, 218, 257, 300, 347, 399, 455, 514,
577, 644, 714, 788, 865, 944, 1026, 1111, 1198, 1287,
1378, 1471, 1565, 1660, 1756, 1853, 1950, 2047
};
/* USER CODE END PV */
当然也可以使用sin来实时生成。
16、在主函数中,添加定时器的启动函数,GPDMA链表配置初始化,以及将通道与链表连。连接好后,启动DAC——DMA,具体表码如下:
/* USER CODE BEGIN 2 */
if (HAL_TIM_Base_Start(&htim1) != HAL_OK)
{
Error_Handler();
}
MX_DACQueue_Config();
/* Link DAC queue to DMA channel */
if( HAL_DMAEx_List_LinkQ(&handle_GPDMA1_Channel9, &DACQueue)!= HAL_OK)
{
Error_Handler();
}
/* Associate the initialized GPDMA handle to the the DAC handle */
__HAL_LINKDMA(&hdac1, DMA_Handle1, handle_GPDMA1_Channel9);
/* Enable DAC selected channel and associated DMA */
if (HAL_DAC_Start_DMA(&hdac1, DAC_CHANNEL_1, &data_sin[0], 128, DAC_ALIGN_12B_R) != HAL_OK)
{
/* Start DMA Error */
Error_Handler();
}
/* USER CODE END 2 */
【实验效果】
将程序下载到开发板,使用示波器连接到PA4,可以看到生成如下的波形:
附工程源代码: