硬汉嵌入式论坛

 找回密码
 立即注册
查看: 3780|回复: 4
收起左侧

[技术讨论] l431 tim+dma+dac 解码WAV 播放时速率不对

[复制链接]

1

主题

9

回帖

12

积分

新手上路

积分
12
发表于 2020-7-24 16:36:40 | 显示全部楼层 |阅读模式
本帖最后由 sniper15 于 2020-7-24 16:38 编辑

这套逻辑在F103上是OK的,但是在L431上播放的时候速率不对,声音变调而且还有杂音。系统主频都是72M.
  1. #include "dac_audio.h"
  2. #include "delay.h"
  3. #include "usart.h"
  4. #include "w25qxx.h"
  5. #define DAC_DHR8R1_Address              0x40007410
  6. #define DAC_DHR8R2_Address              0x4000741C


  7. #define AUDIO_DAC_PIN                   GPIO_Pin_4                  /* PA.15 */
  8. #define AUDIO_DAC_GPIO_PORT             GPIOA                       /* GPIOA */
  9. #define AUDIO_DAC_GPIO_CLK              RCC_APB2Periph_GPIOA

  10. #define DAC_TRIGGER_TIMER                       TIM7
  11. #define RCC_DAC_TRIGGER_TIMER                   RCC_APB1Periph_TIM7
  12. #define DAC_TRIGGER_TIMER_TRGO                  DAC_Trigger_T7_TRGO

  13. uint8_t Wavebuffer[512];
  14. uint8_t Wavebuffer2[512];
  15. u8 EnablePlayAudio=0;
  16. u8 AudioNumber=0;
  17. u8 AudioItems=0;
  18. FILEINFO wav_file[150];
  19. FILEINFO wav_play;
  20. DAC_HandleTypeDef hdac1;
  21. DMA_HandleTypeDef hdma_dac_ch1;
  22. TIM_HandleTypeDef htim7;
  23. void Read_Wav_File_Info(void)
  24. {
  25.   uint8_t Buffer;
  26.   uint8_t Buffer1[14]={0};
  27.   uint8_t i;
  28.   uint16_t j=1;
  29.   W25QXX_Read(&Buffer,0,1);//读总数量范围0~255
  30.   AudioItems=Buffer;
  31.   printf("music items:%d\r\n",Buffer);
  32.   for(i=0;i<Buffer;i++)//填充结构体
  33.   {
  34.     W25QXX_Read(Buffer1,j,14);
  35.    
  36.     (wav_file+i)->filelen=((((u32)*(Buffer1+3))<<24)&0xFF000000)|((((u32)*(Buffer1+2))<<16)&0x00FF0000)|((((u32)*(Buffer1+1))<<8)&0x0000FF00)|(((u32)*(Buffer1+0))&0x000000FF);
  37.     (wav_file+i)->startadd=((((u32)*(Buffer1+7))<<24)&0xFF000000)|((((u32)*(Buffer1+6))<<16)&0x00FF0000)|((((u32)*(Buffer1+5))<<8)&0x0000FF00)|(((u32)*(Buffer1+4))&0x000000FF);
  38.     (wav_file+i)->pointer=((((u32)*(Buffer1+11))<<24)&0xFF000000)|((((u32)*(Buffer1+10))<<16)&0x00FF0000)|((((u32)*(Buffer1+9))<<8)&0x0000FF00)|(((u32)*(Buffer1+8))&0x000000FF);
  39.     (wav_file+i)->dmacndtr=((((u16)*(Buffer1+13))<<8)&0xFF00)|(((u16)*(Buffer1+12))&0x00FF);
  40.     j+=14;
  41.       printf("file : %d\tfilelen:%d\tstartaddr:0x%x\tpointer:0x%x\tdmacndtr:%d\r\n",i,(wav_file+i)->filelen,(wav_file+i)->startadd,(wav_file+i)->pointer,(wav_file+i)->dmacndtr);
  42.   }
  43.   
  44.   for(i=Buffer;i<150;i++)
  45.   {
  46.     (wav_file+i)->filelen=(u32)0;
  47.     (wav_file+i)->startadd=(u32)0;
  48.     (wav_file+i)->pointer=(u32)0;
  49.     (wav_file+i)->dmacndtr=(u16)0;
  50.   }
  51.   
  52.   wav_play=*(wav_file+0);
  53. }

  54. void DFS_ReadFile(uint8_t* pBuffer,PFILEINFO fileinfo)
  55. {
  56.     uint32_t remain;

  57.     remain = fileinfo->filelen + fileinfo->startadd - fileinfo->pointer;

  58.     if (remain >= 512)
  59.     {
  60.         W25QXX_Read(pBuffer,fileinfo->pointer,512);
  61.         fileinfo->pointer += 512;
  62.         fileinfo->dmacndtr = 512;
  63.     }
  64.     // Case 2B - We are only reading a partial sector
  65.     else
  66.     {
  67.         W25QXX_Read(pBuffer,fileinfo->pointer,remain);
  68.         fileinfo->pointer += remain;
  69.         fileinfo->dmacndtr = remain;

  70.         // TIM_Cmd(TIM7, DISABLE);
  71.     }
  72.   
  73.   
  74. }
  75. void PlayAudioProgress(void)
  76. {
  77.   wav_play=*(wav_file+AudioNumber);
  78.   
  79.   DFS_ReadFile(Wavebuffer,&wav_play);
  80.     #if 0
  81.   DMA1_Channel3->CCR = (uint32_t)0x0;
  82.   DMA1_Channel3->CNDTR = wav_play.dmacndtr;
  83.   
  84.   DMA1_Channel3->CPAR = DAC_DHR8R1_Address;
  85.   DMA1_Channel3->CMAR = (uint32_t) & Wavebuffer;
  86.   DMA1_Channel3->CCR = 0x2093;
  87.   DFS_ReadFile(Wavebuffer2,&wav_play);
  88.   //HAL_DAC_Start(&hdac1,DAC_CHANNEL_1);
  89.   //__HAL_DAC_ENABLE(&hdac1,DAC_CHANNEL_1);
  90.     DAC1->CR|=(1<<12);
  91.   __HAL_DMA_ENABLE(&hdma_dac_ch1);
  92.     #else
  93.      HAL_DAC_Start_DMA(&hdac1,DAC1_CHANNEL_1, Wavebuffer, wav_play.dmacndtr,DAC_ALIGN_8B_R); //启动传输
  94.     //HAL_TIM_Base_Start_IT(&htim7);
  95.     #endif
  96.   
  97. }
  98. void PlayAudio(u8 audio_index)
  99. {
  100.   PAM8303_ENABLE();
  101.   
  102.   
  103.   

  104.   
  105.   AudioNumber=audio_index;
  106.   
  107.   EnablePlayAudio=1;
  108.   PlayAudioProgress();

  109. }
  110. void PAM8303_Init(void)
  111. {

  112.     GPIO_InitTypeDef GPIO_InitStruct = {0};
  113.     __HAL_RCC_GPIOC_CLK_ENABLE();
  114.    
  115.    

  116.     /*Configure GPIO pins : PAM8303_EN_Pin SPI_FLASH_CS_Pin */
  117.     GPIO_InitStruct.Pin = PAM8303_EN_Pin;
  118.     GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  119.     GPIO_InitStruct.Pull = GPIO_PULLUP;
  120.     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  121.     HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
  122. }
  123. void DAC_Trigger_Timer_Init(void)
  124. {
  125.     TIM_MasterConfigTypeDef sMasterConfig = {0};  

  126.     /* USER CODE BEGIN TIM7_Init 1 */
  127.    
  128.     /* USER CODE END TIM7_Init 1 */
  129.     htim7.Instance = TIM7;
  130.     htim7.Init.Prescaler = 1;
  131.     htim7.Init.CounterMode = TIM_COUNTERMODE_UP;
  132.     htim7.Init.Period = 2250;//16k
  133.     htim7.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  134.     //__HAL_TIM_SetAutoreload(&htim7,550);
  135.     HAL_TIM_Base_Init(&htim7);
  136.    
  137.     sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE;
  138.     sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  139.     HAL_TIMEx_MasterConfigSynchronization(&htim7, &sMasterConfig);
  140.    
  141.      HAL_TIM_Base_Start(&htim7);
  142. //    HAL_TIM_Base_Start_IT(&htim7);
  143. }
  144. void Audio_DAC_Init(void)
  145. {
  146.     DAC_ChannelConfTypeDef sConfig = {0};

  147.     /* USER CODE BEGIN DAC1_Init 1 */

  148.     /* USER CODE END DAC1_Init 1 */
  149.     /** DAC Initialization
  150.     */
  151.     hdac1.Instance = DAC1;
  152.     HAL_DAC_Init(&hdac1);
  153.    
  154.     /** DAC channel OUT1 config
  155.     */
  156.     sConfig.DAC_SampleAndHold = DAC_SAMPLEANDHOLD_DISABLE;
  157.     sConfig.DAC_Trigger = DAC_TRIGGER_T7_TRGO;
  158.     sConfig.DAC_OutputBuffer = DAC_OUTPUTBUFFER_ENABLE;
  159.     sConfig.DAC_ConnectOnChipPeripheral = DAC_CHIPCONNECT_DISABLE;
  160.     sConfig.DAC_UserTrimming = DAC_TRIMMING_FACTORY;
  161.     HAL_DAC_ConfigChannel(&hdac1, &sConfig, DAC_CHANNEL_1);
  162.     //__HAL_DAC_ENABLE(&hdac1,DAC1_CHANNEL_1);
  163.     HAL_DAC_Start(&hdac1,DAC_CHANNEL_1);  //开启DAC通道1
  164.     //HAL_DAC_SetValue(&hdac1,DAC_CHANNEL_1,DAC_ALIGN_8B_R,0X80);
  165. }
  166. void Audio_DMA_Init(void)
  167. {
  168.     /* DMA controller clock enable */
  169.     __HAL_RCC_DMA1_CLK_ENABLE();

  170.     /* DMA interrupt init */
  171.     /* DMA1_Channel3_IRQn interrupt configuration */
  172.     HAL_NVIC_SetPriority(DMA1_Channel3_IRQn, 3, 1);
  173.     HAL_NVIC_EnableIRQ(DMA1_Channel3_IRQn);
  174. }
  175. #if 0
  176. void DAC2_DAC_TRIGGER_TIMER_Audio_Config(void)
  177. {
  178.   
  179.     /* Init Structure definition */
  180.     DAC_ChannelConfTypeDef sConfig = {0};
  181.     DMA_InitTypeDef            DMA_InitStructure;
  182.     GPIO_InitTypeDef GPIO_InitStruct = {0};
  183.     //NVIC_InitTypeDef            NVIC_InitStructure;
  184.     TIM_MasterConfigTypeDef sMasterConfig = {0};
  185.    

  186.     __HAL_RCC_GPIOC_CLK_ENABLE();
  187.    
  188.    
  189.    
  190.     /*Configure GPIO pins : PAM8303_EN_Pin SPI_FLASH_CS_Pin */
  191.       GPIO_InitStruct.Pin = PAM8303_EN_Pin;
  192.       GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  193.       GPIO_InitStruct.Pull = GPIO_PULLUP;
  194.       GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  195.       HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
  196.    
  197.     /* TIM6 Configuration */
  198.     /* USER CODE END TIM7_Init 1 */
  199.       htim7.Instance = TIM7;
  200.       htim7.Init.Prescaler = 0;
  201.       htim7.Init.CounterMode = TIM_COUNTERMODE_UP;
  202.       htim7.Init.Period = 0;
  203.       htim7.Init.AutoReloadPreload = 5000;
  204.     //TIM_DeInit(DAC_TRIGGER_TIMER);
  205.     HAL_TIM_Base_DeInit(&htim7);
  206.     HAL_TIM_Base_Init(&htim7);
  207.     sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE;
  208.     sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  209.     HAL_TIMEx_MasterConfigSynchronization(&htim7, &sMasterConfig);
  210.    
  211.         
  212.    
  213.     //  TIM_SetAutoreload(DAC_TRIGGER_TIMER, 1500);//16KHz采样率  24MHz
  214.     //TIM_SetAutoreload(DAC_TRIGGER_TIMER, 2250);//16KHz采样率  36MHz 36000/16=2250
  215.     //__HAL_TIM_SetAutoreload(&htim7,2250);
  216.     /* TIM6 TRGO selection */
  217.     //TIM_SelectOutputTrigger(DAC_TRIGGER_TIMER, TIM_TRGOSource_Update);
  218.     //__HAL_TIM_S
  219.     /* TIM6 enable counter */
  220.     //TIM_Cmd(DAC_TRIGGER_TIMER, ENABLE);
  221.     //__HAL_TIM_ENABLE (&htim7);
  222.     /* DAC deinitialize */


  223.   /* USER CODE BEGIN DAC1_Init 1 */

  224.   /* USER CODE END DAC1_Init 1 */
  225.   /** DAC Initialization
  226.   */
  227.   hdac1.Instance = DAC1;
  228.   HAL_DAC_Init(&hdac1);
  229.   
  230.   /** DAC channel OUT1 config
  231.   */
  232.   sConfig.DAC_SampleAndHold = DAC_SAMPLEANDHOLD_DISABLE;
  233.   sConfig.DAC_Trigger = DAC_TRIGGER_T7_TRGO;
  234.   sConfig.DAC_OutputBuffer = DAC_OUTPUTBUFFER_ENABLE;
  235.   sConfig.DAC_ConnectOnChipPeripheral = DAC_CHIPCONNECT_DISABLE;
  236.   sConfig.DAC_UserTrimming = DAC_TRIMMING_FACTORY;
  237.   HAL_DAC_ConfigChannel(&hdac1, &sConfig, DAC_CHANNEL_1);
  238.   

  239.     /* Enable DAC Channel1: Once the DAC channel1 is enabled, PA.04 is
  240.     automatically connected to the DAC converter. */
  241.     __HAL_DAC_ENABLE(&hdac1,DAC1_CHANNEL_1);
  242.     /* Enable DMA for DAC Channel1 */
  243.    

  244.       /* DMA controller clock enable */
  245.   __HAL_RCC_DMA1_CLK_ENABLE();

  246.   /* DMA interrupt init */
  247.   /* DMA1_Channel3_IRQn interrupt configuration */
  248.   HAL_NVIC_SetPriority(DMA1_Channel3_IRQn, 3, 2);
  249.   HAL_NVIC_EnableIRQ(DMA1_Channel3_IRQn);
  250.    
  251.   
  252. }
  253. #else
  254. void DAC2_DAC_TRIGGER_TIMER_Audio_Config(void)
  255. {
  256.     PAM8303_Init();
  257.     DAC_Trigger_Timer_Init();
  258.     Audio_DAC_Init();
  259.     Audio_DMA_Init();
  260. }
  261. #endif

  262. void DMA1_Channel3_IRQHandler(void)
  263. {
  264.     static u8 dmaindex = 0;

  265.     #if 1

  266.     DMA1->IFCR = DMA_IT_TC;


  267.     if(wav_play.dmacndtr <2)
  268.     {
  269.       PAM8303_DISABLE();
  270.       HAL_DAC_SetValue(&hdac1,DAC_CHANNEL_1,DAC_ALIGN_8B_R,0X80);
  271.    
  272.    
  273.     }
  274.    
  275.    
  276.    
  277.    
  278.     DMA1_Channel3->CCR = (uint32_t)0x0;
  279.     DMA1_Channel3->CNDTR = wav_play.dmacndtr;
  280.     DMA1_Channel3->CPAR = DAC_DHR8R1_Address;
  281.    
  282.     if (dmaindex == 0)
  283.         DMA1_Channel3->CMAR = (uint32_t) & Wavebuffer;
  284.     else
  285.         DMA1_Channel3->CMAR = (uint32_t) & Wavebuffer2;
  286.     DMA1_Channel3->CCR = 0x2093;


  287.     if(wav_play.dmacndtr<512)
  288.     {//如果Wavebuffer内数据不足512字节,播完则将下次dmacndtr设置为0
  289.       wav_play.dmacndtr=0;
  290.       // DAC1->CR&=~(1<<12);
  291.       // TIM_Cmd(TIM7, DISABLE);
  292.     }
  293.     else
  294.     {
  295.        if (dmaindex == 0)
  296.        {
  297.             DFS_ReadFile(Wavebuffer2,&wav_play);//为dmaindex=1准备数据
  298.             dmaindex=1;
  299.        }
  300.        else
  301.        {
  302.             DFS_ReadFile(Wavebuffer,&wav_play);//为dmaindex=1准备数据
  303.             dmaindex=0;
  304.        }   
  305.     }
  306.     #else
  307.     __HAL_DMA_CLEAR_FLAG(&hdma_dac_ch1, DMA_FLAG_TC3); //清除DMA2_Steam7传输完成标志
  308.     HAL_DAC_Stop_DMA(&hdac1,DAC_CHANNEL_1);      //传输完成以后关闭串口DMA
  309.     if(wav_play.dmacndtr <2)
  310.     {
  311.       PAM8303_DISABLE();
  312.       HAL_DAC_SetValue(&hdac1,DAC_CHANNEL_1,DAC_ALIGN_8B_R,0X80);
  313.    
  314.    
  315.     }
  316.     if(dmaindex==0)
  317.     {
  318.         HAL_DAC_Start_DMA(&hdac1,DAC1_CHANNEL_1, Wavebuffer, wav_play.dmacndtr,DAC_ALIGN_8B_R); //启动传输
  319.     }
  320.     else
  321.     {
  322.         HAL_DAC_Start_DMA(&hdac1,DAC1_CHANNEL_1, Wavebuffer2, wav_play.dmacndtr,DAC_ALIGN_8B_R); //启动传输
  323.     }
  324.     if(wav_play.dmacndtr<512)
  325.     {//如果Wavebuffer内数据不足512字节,播完则将下次dmacndtr设置为0
  326.       wav_play.dmacndtr=0;
  327.       // DAC1->CR&=~(1<<12);
  328.       // TIM_Cmd(TIM7, DISABLE);
  329.     }
  330.     else
  331.     {
  332.        if (dmaindex == 0)
  333.        {
  334.             DFS_ReadFile(Wavebuffer2,&wav_play);//为dmaindex=1准备数据
  335.             dmaindex=1;
  336.        }
  337.        else
  338.        {
  339.             DFS_ReadFile(Wavebuffer,&wav_play);//为dmaindex=1准备数据
  340.             dmaindex=0;
  341.        }   
  342.     }
  343.     #endif
  344.     HAL_DMA_IRQHandler(&hdma_dac_ch1);   
  345. }

  346. void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* htim_base)
  347. {
  348.   if(htim_base->Instance==TIM7)
  349.   {
  350.   /* USER CODE BEGIN TIM7_MspInit 0 */

  351.   /* USER CODE END TIM7_MspInit 0 */
  352.     /* Peripheral clock enable */
  353.     __HAL_RCC_TIM7_CLK_ENABLE();
  354. //       HAL_NVIC_SetPriority(TIM7_IRQn, 1, 3);  //设置中断优先级,抢占优先级1,子优先级3
  355. //        HAL_NVIC_EnableIRQ(TIM7_IRQn);          //开启ITM3中断
  356.   /* USER CODE BEGIN TIM7_MspInit 1 */

  357.   /* USER CODE END TIM7_MspInit 1 */
  358.   }

  359. }
  360. void TIM7_IRQHandler(void)
  361. {
  362.     //HAL_GPIO_TogglePin(PAM8303_EN_GPIO_Port,PAM8303_EN_Pin);
  363.     static u16 play_count=0;
  364.     static u8 index=0;
  365.     if(play_count<wav_play.dmacndtr)
  366.     {   
  367.         if(index==0)
  368.             HAL_DAC_SetValue(&hdac1,DAC_CHANNEL_1,DAC_ALIGN_8B_R,*(Wavebuffer+play_count));
  369.         else
  370.             HAL_DAC_SetValue(&hdac1,DAC_CHANNEL_1,DAC_ALIGN_8B_R,*(Wavebuffer2+play_count));
  371.         play_count++;
  372.         if(play_count>=wav_play.dmacndtr)
  373.         {
  374.             play_count=0;
  375.             if(wav_play.dmacndtr<512)
  376.             {//如果Wavebuffer内数据不足512字节,播完则将下次dmacndtr设置为0
  377.               wav_play.dmacndtr=0;
  378.                 HAL_TIM_Base_Stop_IT(&htim7);
  379.               // DAC1->CR&=~(1<<12);
  380.               // TIM_Cmd(TIM7, DISABLE);
  381.             }
  382.             else
  383.             {
  384.                 if (index == 0)
  385.                {
  386.                     DFS_ReadFile(Wavebuffer2,&wav_play);//为dmaindex=1准备数据
  387.                     index=1;
  388.                }
  389.                else
  390.                {
  391.                     DFS_ReadFile(Wavebuffer,&wav_play);//为dmaindex=1准备数据
  392.                     index=0;
  393.                }  
  394.             }
  395.         }
  396.             
  397.     }
  398.     HAL_TIM_IRQHandler(&htim7);
  399. }
  400. void HAL_DAC_MspInit(DAC_HandleTypeDef* hdac)
  401. {
  402.   GPIO_InitTypeDef GPIO_InitStruct = {0};
  403.   if(hdac->Instance==DAC1)
  404.   {
  405.   /* USER CODE BEGIN DAC1_MspInit 0 */

  406.   /* USER CODE END DAC1_MspInit 0 */
  407.     /* Peripheral clock enable */
  408.     __HAL_RCC_DAC1_CLK_ENABLE();
  409.   
  410.     __HAL_RCC_GPIOA_CLK_ENABLE();
  411.     /**DAC1 GPIO Configuration   
  412.     PA4     ------> DAC1_OUT1
  413.     */
  414.     GPIO_InitStruct.Pin = GPIO_PIN_4;
  415.     GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
  416.     GPIO_InitStruct.Pull = GPIO_NOPULL;
  417.     HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  418.     /* DAC1 DMA Init */
  419.       __HAL_RCC_DMA1_CLK_ENABLE();
  420.     /* DAC_CH1 Init */
  421.     hdma_dac_ch1.Instance = DMA1_Channel3;
  422.     hdma_dac_ch1.Init.Request = DMA_REQUEST_6;
  423.     hdma_dac_ch1.Init.Direction = DMA_MEMORY_TO_PERIPH;
  424.     hdma_dac_ch1.Init.PeriphInc = DMA_PINC_DISABLE;
  425.     hdma_dac_ch1.Init.MemInc = DMA_MINC_ENABLE;
  426.     hdma_dac_ch1.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
  427.     hdma_dac_ch1.Init.MemDataAlignment = DMA_PDATAALIGN_BYTE;
  428.     hdma_dac_ch1.Init.Mode = DMA_NORMAL;
  429.     hdma_dac_ch1.Init.Priority = DMA_PRIORITY_HIGH;
  430.     HAL_DMA_Init(&hdma_dac_ch1);
  431.    

  432.     __HAL_LINKDMA(hdac,DMA_Handle1,hdma_dac_ch1);

  433.   /* USER CODE BEGIN DAC1_MspInit 1 */

  434.   /* USER CODE END DAC1_MspInit 1 */
  435.   }

  436. }

复制代码


回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107652
QQ
发表于 2020-7-24 17:04:53 | 显示全部楼层
帮顶。
回复

使用道具 举报

80

主题

722

回帖

962

积分

金牌会员

积分
962
发表于 2020-8-4 15:36:42 | 显示全部楼层
你这个搞得有点绕了,TIM7以及作为DAC触发源,就最好不要使用TIM7中断了。数据直接给DMA,开启定时器,DMA,让出CPU。如果使用定时器中断的话,不同片子处理中断的时间可能不一致,播放速率自然会受到影响。
回复

使用道具 举报

1

主题

9

回帖

12

积分

新手上路

积分
12
 楼主| 发表于 2020-8-5 16:03:00 | 显示全部楼层
庄永 发表于 2020-8-4 15:36
你这个搞得有点绕了,TIM7以及作为DAC触发源,就最好不要使用TIM7中断了。数据直接给DMA,开启定时器,DMA ...

中断是为了测频率,发出来的这个中断没有用了,这套逻辑在103上是OK的,就431上有问题
回复

使用道具 举报

80

主题

722

回帖

962

积分

金牌会员

积分
962
发表于 2020-8-6 01:23:36 | 显示全部楼层
sniper15 发表于 2020-8-5 16:03
中断是为了测频率,发出来的这个中断没有用了,这套逻辑在103上是OK的,就431上有问题

建议你把TIM7中断使能关掉,测量频率可以想其它办法。1、16K频率意味着62us触发一次中断。这么频繁的中断本身就容易导致不稳定
2、不同的片子中断处理时间不一样,很容易就导致频率发生变化
3、使能中断之后你的频率已经不是你设置的16K了,时间还要加上处理中断所耗费的时间
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-6-11 03:47 , Processed in 0.159436 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表