你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

用STM32F207的DMA+DAC+TIM6输出正玄波有问题,请大神帮忙解决...

[复制链接]
风905067 提问时间:2017-5-25 17:27 /
阅读主题, 点击返回1楼
收藏 评论17 发布时间:2017-5-25 17:27
17个回答
风905067 回答时间:2017-5-26 15:03:48
wambob 发表于 2017-5-26 14:24
DMA循环只是说DMA循环,不没有指定DMA的数据地址。数据DMA到DAC完了后,需要重置数据指针 ...

具体该怎么做呢?我用了你的代码,出来了杂波,不是正玄波,估计是没有重置数组指针,请问这个在什么时候什么地方做这一步动作?谢谢
风905067 回答时间:2017-5-26 15:58:52
wambob 发表于 2017-5-26 14:24
DMA循环只是说DMA循环,不没有指定DMA的数据地址。数据DMA到DAC完了后,需要重置数据指针 ...

在哪里操作呢?DMA中断里?
wambob 回答时间:2017-5-26 18:40:46
本帖最后由 wambob 于 2017-5-26 20:23 编辑
风905067 发表于 2017-5-26 15:58
在哪里操作呢?DMA中断里?

抱歉,说错了,我的代码是DMA音乐代码,你的是DMA波形。 使用函数
HAL_DAC_Start_DMA(&hdac, DAC通道, (uint32_t*)数组名, 数组大小, 数据长度);
应该就可以了

原理上时一样的,把数组的数据循环DMA到DAC的通道,就产生了波形,波形的频率跟定时器的预装值有关,幅值跟数组的值有关
F722播放音乐数组的代码,你参考下
  1. #include "main.h"
  2. #include "stm32f7xx_hal.h"

  3. /* USER CODE BEGIN Includes */
  4. #define __CLK_TCK        1000

  5. #define AUDIO_FILE_ADDRESS        0x08060000
  6. #define AUDIO_FILE_SIZE                        119652
  7. #define PLAY_BUFF_SIZE       (16*1000)
  8. #define PLAY_HEADER          0x2C
  9. uint8_t                      PlayBuff[PLAY_BUFF_SIZE];
  10. __IO int16_t                 UpdatePointer = -1;
  11. /* USER CODE END Includes */

  12. /* Private variables ---------------------------------------------------------*/

  13. DAC_HandleTypeDef hdac;
  14. DMA_HandleTypeDef hdma_dac2;

  15. TIM_HandleTypeDef htim6;

  16. UART_HandleTypeDef huart3;

  17. /* USER CODE BEGIN PV */
  18. /* Private variables ---------------------------------------------------------*/

  19. /* USER CODE END PV */

  20. /* Private function prototypes -----------------------------------------------*/
  21. void SystemClock_Config(void);
  22. static void MX_GPIO_Init(void);
  23. static void MX_DMA_Init(void);
  24. static void MX_DAC_Init(void);
  25. static void MX_USART3_UART_Init(void);
  26. static void MX_TIM6_Init(void);



  27. //void HAL_DACEx_ConvCpltCallbackCh2(DAC_HandleTypeDef* hdac)
  28. //{
  29. //  UpdatePointer = PLAY_BUFF_SIZE/2;
  30. //}

  31. //void HAL_DACEx_ConvHalfCpltCallbackCh2(DAC_HandleTypeDef* hdac)
  32. //{
  33. //  UpdatePointer = 0;
  34. //}

  35. /* USER CODE END 0 */

  36. int main(void)
  37. {

  38.   /* USER CODE BEGIN 1 */
  39. //uint32_t PlaybackPosition   = PLAY_BUFF_SIZE + PLAY_HEADER;
  40.   /* USER CODE END 1 */

  41.   /* Enable I-Cache-------------------------------------------------------------*/
  42.   SCB_EnableICache();

  43.   /* Enable D-Cache-------------------------------------------------------------*/
  44.   SCB_EnableDCache();

  45.   /* MCU Configuration----------------------------------------------------------*/

  46.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  47.   HAL_Init();

  48.   /* USER CODE BEGIN Init */

  49.   /* USER CODE END Init */

  50.   /* Configure the system clock */
  51.   SystemClock_Config();

  52.   /* USER CODE BEGIN SysInit */

  53.   /* USER CODE END SysInit */

  54.   /* Initialize all configured peripherals */
  55.   MX_GPIO_Init();
  56.   MX_DMA_Init();
  57.   MX_DAC_Init();
  58.   MX_USART3_UART_Init();
  59.   MX_TIM6_Init();

  60.   /* USER CODE BEGIN 2 */
  61. /* Initialize the data buffer */
  62.   for(int i=0; i < PLAY_BUFF_SIZE; i+=sizeof(uint8_t))
  63.   {
  64.     PlayBuff[i]=*((__IO uint8_t *)(AUDIO_FILE_ADDRESS +PLAY_HEADER + i));
  65.   }
  66.         
  67.         HAL_TIM_Base_Start(&htim6);
  68.         HAL_DAC_Start(&hdac, DAC_CHANNEL_1);
  69.         
  70.         HAL_DAC_Start_DMA(&hdac, DAC_CHANNEL_2, (uint32_t*)PlayBuff, PLAY_BUFF_SIZE, DAC_ALIGN_8B_R);
  71.         
  72.         printf("Demo for 21ic Audio Series Article, by zhanzr21 @ 21ic BBS\n");
  73.         printf("BSD Style License for my own code\n");
  74.         printf("For the library please refer to the license declaim of their own.\n");
  75.         printf("DAC + DMA Test For STM32F722 Nucleo Board @ %u MHz\n", SystemCoreClock/1000000);
  76.   /* USER CODE END 2 */

  77.   /* Infinite loop */
  78.   /* USER CODE BEGIN WHILE */
  79.         
  80.         while (1)
  81.   {                                
  82.                 HAL_GPIO_TogglePin(LD2_GPIO_Port, LD2_Pin);

  83.     /* Wait a callback event */
  84. //    while(UpdatePointer==-1);
  85. //                    
  86. //    int position = UpdatePointer;
  87. //    UpdatePointer = -1;

  88. //    /* Upate the first or the second part of the buffer */
  89. //    for(int i = 0; i < PLAY_BUFF_SIZE/2; i++)
  90. //    {
  91. //      PlayBuff[i+position] = *(uint8_t *)(AUDIO_FILE_ADDRESS + PlaybackPosition);
  92. //      PlaybackPosition+=sizeof(uint8_t);
  93. //    }

  94. //    /* check the end of the file */
  95. //    if((PlaybackPosition+(PLAY_BUFF_SIZE/2)/sizeof(uint8_t)) > AUDIO_FILE_SIZE)
  96. //    {
  97. //      PlaybackPosition = PLAY_HEADER;
  98. //    }
  99. //   
  100. //    if(UpdatePointer != -1)
  101. //    {
  102. //      /* Buffer update time is too long compare to the data transfer time */
  103. //      Error_Handler();
  104. //    }                 
  105.   /* USER CODE END WHILE */

  106.   /* USER CODE BEGIN 3 */

  107.   }
  108.   /* USER CODE END 3 */

  109. }
复制代码

风905067 回答时间:2017-5-27 09:46:50
你是用什么编译的,用什么建工程的,我的keil里好像没有文件:stm32f7xx_hal.h  ,所以也没办法#include "stm32f7xx_hal.h"的,
风905067 回答时间:2017-5-27 10:46:21
我用的是STM32F207。
风905067 回答时间:2017-5-27 11:14:48
问题解决了,其实我的那个程序是可以的,就是一个小地方没有搞对,谢谢你的帮助。我知道问题在哪里了 。谢谢!!!谢谢谢!!!!!!!

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2 结贴奖励

查看全部评分

风905067 回答时间:2017-5-27 11:16:05
请问你是在哪里工作?是否可以加微信好友,或者QQ好友?
风905067 回答时间:2017-5-27 11:17:53
请问你是在哪···‘·‘·‘’’’里工作,是否可以加  微##¥信@!#好···友,或者Q·@为好···友??
12
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
13245底部标题123相同标题
12底部标题123相同标题
33333底部标题123相同序号
3435底部标题-无链接
关注我们
st-img 微信公众号
st-img 手机版