lugl4313820 发表于 2024-2-22 07:33

【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>&nbsp; 4、开置ICAHE,模式为1-way。</p>

<p>&nbsp; 5、开启DEBUG</p>

<p>&nbsp; 6、配置DAC1,选择输出为OUT1,连接为only external pin。stm32cubeMAX会自己动配置PA4为输出IO。</p>

<p>&nbsp; 7、在参数配置中,按下图配置参数:</p>

<p>&nbsp; 8、接着配置TIM1,如下图所示,触发选择内部ITR1,向上计数,计数值为5000,产生更新时事件。</p>

<p>&nbsp; 9、配置GPDMA,打开channel9,配置循环模式,port选择1,打开中断。</p>

<p>&nbsp; 10、创建链表用于GPDMA连接到DAC,名字为DACQueue,linked list选择GPDMA,循环模式,第一个节点名字为DACNode.</p>

<p>&nbsp; 11、配置节点属性如下:</p>

<p>&nbsp;12、 同时需要调整一下工程中的函数启动顺序:</p>

<p>&nbsp; 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&mdash;&mdash;DMA,具体表码如下:</p>

<pre>
<code>/* USER CODE BEGIN 2 */
if (HAL_TIM_Base_Start(&amp;htim1) != HAL_OK)
{
    Error_Handler();
}
MX_DACQueue_Config();

/* Link DAC queue to DMA channel */
if( HAL_DMAEx_List_LinkQ(&amp;handle_GPDMA1_Channel9, &amp;DACQueue)!= HAL_OK)
{
    Error_Handler();
}

/* Associate the initialized GPDMA handle to the the DAC handle */
__HAL_LINKDMA(&amp;hdac1, DMA_Handle1, handle_GPDMA1_Channel9);
/* Enable DAC selected channel and associated DMA */
if (HAL_DAC_Start_DMA(&amp;hdac1, DAC_CHANNEL_1, &amp;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>&nbsp; 附工程源代码:</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>

怀揣少年梦 发表于 2024-2-22 11:27

<p>大佬,太强了,彻底搞明白了GPDMA</p>

lugl4313820 发表于 2024-2-22 13:30

怀揣少年梦 发表于 2024-2-22 11:27
大佬,太强了,彻底搞明白了GPDMA

<p>学习了好久,现在弄明白一点点,还不是非常熟悉,还得多用才行。</p>
页: [1]
查看完整版本: 【ST NUCLEO-U5A5ZJ-Q开发板测评】DAC+GPDMA生成正弦波