【ST NUCLEO-U5A5ZJ-Q开发板测评】DAC+GPDMA生成正弦波
<div class='showpostmsg'> 本帖最后由 lugl4313820 于 2024-2-22 07:42 编辑<p>【目的】使用DAC+GPDMA生成正弦波</p>
<p>【硬件】</p>
<p>1、ST NUCLEO-U5A5ZJ-Q开发板</p>
<p>2、示波器</p>
<p>【软件环境】</p>
<p>STM32CubeIDE1.14.0</p>
<p>【实现步骤】</p>
<p>1、使用stm32CubeIDE新建基于STM32U5A5JT6核心的基础工程。</p>
<p>2、配置时钟为160MHz。</p>
<p>3、配置sys的时钟为SysTick。</p>
<p> 4、开置ICAHE,模式为1-way。</p>
<p> 5、开启DEBUG</p>
<p> 6、配置DAC1,选择输出为OUT1,连接为only external pin。stm32cubeMAX会自己动配置PA4为输出IO。</p>
<p> 7、在参数配置中,按下图配置参数:</p>
<p> 8、接着配置TIM1,如下图所示,触发选择内部ITR1,向上计数,计数值为5000,产生更新时事件。</p>
<p> 9、配置GPDMA,打开channel9,配置循环模式,port选择1,打开中断。</p>
<p> 10、创建链表用于GPDMA连接到DAC,名字为DACQueue,linked list选择GPDMA,循环模式,第一个节点名字为DACNode.</p>
<p> 11、配置节点属性如下:</p>
<p> 12、 同时需要调整一下工程中的函数启动顺序:</p>
<p> 13、生成代码,并打开工程。</p>
<p>14、在main.c中引用linked_list.h的头文件,并声明变量DACQueue;</p>
<pre>
<code>/* 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 */</code></pre>
<p>15、添加一个生成正弦波的数组:</p>
<pre>
<code>/* USER CODE BEGIN PV */
uint32_t data_sin= {
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 */</code></pre>
<p>当然也可以使用sin来实时生成。</p>
<p>16、在主函数中,添加定时器的启动函数,GPDMA链表配置初始化,以及将通道与链表连。连接好后,启动DAC——DMA,具体表码如下:</p>
<pre>
<code>/* 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, 128, DAC_ALIGN_12B_R) != HAL_OK)
{
/* Start DMA Error */
Error_Handler();
}
/* USER CODE END 2 */</code></pre>
<p>【实验效果】</p>
<p>将程序下载到开发板,使用示波器连接到PA4,可以看到生成如下的波形:</p>
<p> 附工程源代码:</p>
<div></div>
</div><script> var loginstr = '<div class="locked">查看本帖全部内容,请<a href="javascript:;" style="color:#e60000" class="loginf">登录</a>或者<a href="https://bbs.eeworld.com.cn/member.php?mod=register_eeworld.php&action=wechat" style="color:#e60000" target="_blank">注册</a></div>';
if(parseInt(discuz_uid)==0){
(function($){
var postHeight = getTextHeight(400);
$(".showpostmsg").html($(".showpostmsg").html());
$(".showpostmsg").after(loginstr);
$(".showpostmsg").css({height:postHeight,overflow:"hidden"});
})(jQuery);
} </script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script> <p>大佬,太强了,彻底搞明白了GPDMA</p>
怀揣少年梦 发表于 2024-2-22 11:27
大佬,太强了,彻底搞明白了GPDMA
<p>学习了好久,现在弄明白一点点,还不是非常熟悉,还得多用才行。</p>
页:
[1]