|
本帖最后由 sniper15 于 2020-7-24 16:38 编辑
这套逻辑在F103上是OK的,但是在L431上播放的时候速率不对,声音变调而且还有杂音。系统主频都是72M.
- #include "dac_audio.h"
- #include "delay.h"
- #include "usart.h"
- #include "w25qxx.h"
- #define DAC_DHR8R1_Address 0x40007410
- #define DAC_DHR8R2_Address 0x4000741C
- #define AUDIO_DAC_PIN GPIO_Pin_4 /* PA.15 */
- #define AUDIO_DAC_GPIO_PORT GPIOA /* GPIOA */
- #define AUDIO_DAC_GPIO_CLK RCC_APB2Periph_GPIOA
- #define DAC_TRIGGER_TIMER TIM7
- #define RCC_DAC_TRIGGER_TIMER RCC_APB1Periph_TIM7
- #define DAC_TRIGGER_TIMER_TRGO DAC_Trigger_T7_TRGO
- uint8_t Wavebuffer[512];
- uint8_t Wavebuffer2[512];
- u8 EnablePlayAudio=0;
- u8 AudioNumber=0;
- u8 AudioItems=0;
- FILEINFO wav_file[150];
- FILEINFO wav_play;
- DAC_HandleTypeDef hdac1;
- DMA_HandleTypeDef hdma_dac_ch1;
- TIM_HandleTypeDef htim7;
- void Read_Wav_File_Info(void)
- {
- uint8_t Buffer;
- uint8_t Buffer1[14]={0};
- uint8_t i;
- uint16_t j=1;
- W25QXX_Read(&Buffer,0,1);//读总数量范围0~255
- AudioItems=Buffer;
- printf("music items:%d\r\n",Buffer);
- for(i=0;i<Buffer;i++)//填充结构体
- {
- W25QXX_Read(Buffer1,j,14);
-
- (wav_file+i)->filelen=((((u32)*(Buffer1+3))<<24)&0xFF000000)|((((u32)*(Buffer1+2))<<16)&0x00FF0000)|((((u32)*(Buffer1+1))<<8)&0x0000FF00)|(((u32)*(Buffer1+0))&0x000000FF);
- (wav_file+i)->startadd=((((u32)*(Buffer1+7))<<24)&0xFF000000)|((((u32)*(Buffer1+6))<<16)&0x00FF0000)|((((u32)*(Buffer1+5))<<8)&0x0000FF00)|(((u32)*(Buffer1+4))&0x000000FF);
- (wav_file+i)->pointer=((((u32)*(Buffer1+11))<<24)&0xFF000000)|((((u32)*(Buffer1+10))<<16)&0x00FF0000)|((((u32)*(Buffer1+9))<<8)&0x0000FF00)|(((u32)*(Buffer1+8))&0x000000FF);
- (wav_file+i)->dmacndtr=((((u16)*(Buffer1+13))<<8)&0xFF00)|(((u16)*(Buffer1+12))&0x00FF);
- j+=14;
- 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);
- }
-
- for(i=Buffer;i<150;i++)
- {
- (wav_file+i)->filelen=(u32)0;
- (wav_file+i)->startadd=(u32)0;
- (wav_file+i)->pointer=(u32)0;
- (wav_file+i)->dmacndtr=(u16)0;
- }
-
- wav_play=*(wav_file+0);
- }
- void DFS_ReadFile(uint8_t* pBuffer,PFILEINFO fileinfo)
- {
- uint32_t remain;
- remain = fileinfo->filelen + fileinfo->startadd - fileinfo->pointer;
- if (remain >= 512)
- {
- W25QXX_Read(pBuffer,fileinfo->pointer,512);
- fileinfo->pointer += 512;
- fileinfo->dmacndtr = 512;
- }
- // Case 2B - We are only reading a partial sector
- else
- {
- W25QXX_Read(pBuffer,fileinfo->pointer,remain);
- fileinfo->pointer += remain;
- fileinfo->dmacndtr = remain;
- // TIM_Cmd(TIM7, DISABLE);
- }
-
-
- }
- void PlayAudioProgress(void)
- {
- wav_play=*(wav_file+AudioNumber);
-
- DFS_ReadFile(Wavebuffer,&wav_play);
- #if 0
- DMA1_Channel3->CCR = (uint32_t)0x0;
- DMA1_Channel3->CNDTR = wav_play.dmacndtr;
-
- DMA1_Channel3->CPAR = DAC_DHR8R1_Address;
- DMA1_Channel3->CMAR = (uint32_t) & Wavebuffer;
- DMA1_Channel3->CCR = 0x2093;
- DFS_ReadFile(Wavebuffer2,&wav_play);
- //HAL_DAC_Start(&hdac1,DAC_CHANNEL_1);
- //__HAL_DAC_ENABLE(&hdac1,DAC_CHANNEL_1);
- DAC1->CR|=(1<<12);
- __HAL_DMA_ENABLE(&hdma_dac_ch1);
- #else
- HAL_DAC_Start_DMA(&hdac1,DAC1_CHANNEL_1, Wavebuffer, wav_play.dmacndtr,DAC_ALIGN_8B_R); //启动传输
- //HAL_TIM_Base_Start_IT(&htim7);
- #endif
-
- }
- void PlayAudio(u8 audio_index)
- {
- PAM8303_ENABLE();
-
-
-
-
- AudioNumber=audio_index;
-
- EnablePlayAudio=1;
- PlayAudioProgress();
- }
- void PAM8303_Init(void)
- {
- GPIO_InitTypeDef GPIO_InitStruct = {0};
- __HAL_RCC_GPIOC_CLK_ENABLE();
-
-
- /*Configure GPIO pins : PAM8303_EN_Pin SPI_FLASH_CS_Pin */
- GPIO_InitStruct.Pin = PAM8303_EN_Pin;
- GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
- GPIO_InitStruct.Pull = GPIO_PULLUP;
- GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
- HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
- }
- void DAC_Trigger_Timer_Init(void)
- {
- TIM_MasterConfigTypeDef sMasterConfig = {0};
- /* USER CODE BEGIN TIM7_Init 1 */
-
- /* USER CODE END TIM7_Init 1 */
- htim7.Instance = TIM7;
- htim7.Init.Prescaler = 1;
- htim7.Init.CounterMode = TIM_COUNTERMODE_UP;
- htim7.Init.Period = 2250;//16k
- htim7.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
- //__HAL_TIM_SetAutoreload(&htim7,550);
- HAL_TIM_Base_Init(&htim7);
-
- sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE;
- sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
- HAL_TIMEx_MasterConfigSynchronization(&htim7, &sMasterConfig);
-
- HAL_TIM_Base_Start(&htim7);
- // HAL_TIM_Base_Start_IT(&htim7);
- }
- void Audio_DAC_Init(void)
- {
- DAC_ChannelConfTypeDef sConfig = {0};
- /* USER CODE BEGIN DAC1_Init 1 */
- /* USER CODE END DAC1_Init 1 */
- /** DAC Initialization
- */
- hdac1.Instance = DAC1;
- HAL_DAC_Init(&hdac1);
-
- /** DAC channel OUT1 config
- */
- sConfig.DAC_SampleAndHold = DAC_SAMPLEANDHOLD_DISABLE;
- sConfig.DAC_Trigger = DAC_TRIGGER_T7_TRGO;
- sConfig.DAC_OutputBuffer = DAC_OUTPUTBUFFER_ENABLE;
- sConfig.DAC_ConnectOnChipPeripheral = DAC_CHIPCONNECT_DISABLE;
- sConfig.DAC_UserTrimming = DAC_TRIMMING_FACTORY;
- HAL_DAC_ConfigChannel(&hdac1, &sConfig, DAC_CHANNEL_1);
- //__HAL_DAC_ENABLE(&hdac1,DAC1_CHANNEL_1);
- HAL_DAC_Start(&hdac1,DAC_CHANNEL_1); //开启DAC通道1
- //HAL_DAC_SetValue(&hdac1,DAC_CHANNEL_1,DAC_ALIGN_8B_R,0X80);
- }
- void Audio_DMA_Init(void)
- {
- /* DMA controller clock enable */
- __HAL_RCC_DMA1_CLK_ENABLE();
- /* DMA interrupt init */
- /* DMA1_Channel3_IRQn interrupt configuration */
- HAL_NVIC_SetPriority(DMA1_Channel3_IRQn, 3, 1);
- HAL_NVIC_EnableIRQ(DMA1_Channel3_IRQn);
- }
- #if 0
- void DAC2_DAC_TRIGGER_TIMER_Audio_Config(void)
- {
-
- /* Init Structure definition */
- DAC_ChannelConfTypeDef sConfig = {0};
- DMA_InitTypeDef DMA_InitStructure;
- GPIO_InitTypeDef GPIO_InitStruct = {0};
- //NVIC_InitTypeDef NVIC_InitStructure;
- TIM_MasterConfigTypeDef sMasterConfig = {0};
-
- __HAL_RCC_GPIOC_CLK_ENABLE();
-
-
-
- /*Configure GPIO pins : PAM8303_EN_Pin SPI_FLASH_CS_Pin */
- GPIO_InitStruct.Pin = PAM8303_EN_Pin;
- GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
- GPIO_InitStruct.Pull = GPIO_PULLUP;
- GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
- HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
-
- /* TIM6 Configuration */
- /* USER CODE END TIM7_Init 1 */
- htim7.Instance = TIM7;
- htim7.Init.Prescaler = 0;
- htim7.Init.CounterMode = TIM_COUNTERMODE_UP;
- htim7.Init.Period = 0;
- htim7.Init.AutoReloadPreload = 5000;
- //TIM_DeInit(DAC_TRIGGER_TIMER);
- HAL_TIM_Base_DeInit(&htim7);
- HAL_TIM_Base_Init(&htim7);
- sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE;
- sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
- HAL_TIMEx_MasterConfigSynchronization(&htim7, &sMasterConfig);
-
-
-
- // TIM_SetAutoreload(DAC_TRIGGER_TIMER, 1500);//16KHz采样率 24MHz
- //TIM_SetAutoreload(DAC_TRIGGER_TIMER, 2250);//16KHz采样率 36MHz 36000/16=2250
- //__HAL_TIM_SetAutoreload(&htim7,2250);
- /* TIM6 TRGO selection */
- //TIM_SelectOutputTrigger(DAC_TRIGGER_TIMER, TIM_TRGOSource_Update);
- //__HAL_TIM_S
- /* TIM6 enable counter */
- //TIM_Cmd(DAC_TRIGGER_TIMER, ENABLE);
- //__HAL_TIM_ENABLE (&htim7);
- /* DAC deinitialize */
- /* USER CODE BEGIN DAC1_Init 1 */
- /* USER CODE END DAC1_Init 1 */
- /** DAC Initialization
- */
- hdac1.Instance = DAC1;
- HAL_DAC_Init(&hdac1);
-
- /** DAC channel OUT1 config
- */
- sConfig.DAC_SampleAndHold = DAC_SAMPLEANDHOLD_DISABLE;
- sConfig.DAC_Trigger = DAC_TRIGGER_T7_TRGO;
- sConfig.DAC_OutputBuffer = DAC_OUTPUTBUFFER_ENABLE;
- sConfig.DAC_ConnectOnChipPeripheral = DAC_CHIPCONNECT_DISABLE;
- sConfig.DAC_UserTrimming = DAC_TRIMMING_FACTORY;
- HAL_DAC_ConfigChannel(&hdac1, &sConfig, DAC_CHANNEL_1);
-
- /* Enable DAC Channel1: Once the DAC channel1 is enabled, PA.04 is
- automatically connected to the DAC converter. */
- __HAL_DAC_ENABLE(&hdac1,DAC1_CHANNEL_1);
- /* Enable DMA for DAC Channel1 */
-
- /* DMA controller clock enable */
- __HAL_RCC_DMA1_CLK_ENABLE();
- /* DMA interrupt init */
- /* DMA1_Channel3_IRQn interrupt configuration */
- HAL_NVIC_SetPriority(DMA1_Channel3_IRQn, 3, 2);
- HAL_NVIC_EnableIRQ(DMA1_Channel3_IRQn);
-
-
- }
- #else
- void DAC2_DAC_TRIGGER_TIMER_Audio_Config(void)
- {
- PAM8303_Init();
- DAC_Trigger_Timer_Init();
- Audio_DAC_Init();
- Audio_DMA_Init();
- }
- #endif
- void DMA1_Channel3_IRQHandler(void)
- {
- static u8 dmaindex = 0;
- #if 1
- DMA1->IFCR = DMA_IT_TC;
- if(wav_play.dmacndtr <2)
- {
- PAM8303_DISABLE();
- HAL_DAC_SetValue(&hdac1,DAC_CHANNEL_1,DAC_ALIGN_8B_R,0X80);
-
-
- }
-
-
-
-
- DMA1_Channel3->CCR = (uint32_t)0x0;
- DMA1_Channel3->CNDTR = wav_play.dmacndtr;
- DMA1_Channel3->CPAR = DAC_DHR8R1_Address;
-
- if (dmaindex == 0)
- DMA1_Channel3->CMAR = (uint32_t) & Wavebuffer;
- else
- DMA1_Channel3->CMAR = (uint32_t) & Wavebuffer2;
- DMA1_Channel3->CCR = 0x2093;
- if(wav_play.dmacndtr<512)
- {//如果Wavebuffer内数据不足512字节,播完则将下次dmacndtr设置为0
- wav_play.dmacndtr=0;
- // DAC1->CR&=~(1<<12);
- // TIM_Cmd(TIM7, DISABLE);
- }
- else
- {
- if (dmaindex == 0)
- {
- DFS_ReadFile(Wavebuffer2,&wav_play);//为dmaindex=1准备数据
- dmaindex=1;
- }
- else
- {
- DFS_ReadFile(Wavebuffer,&wav_play);//为dmaindex=1准备数据
- dmaindex=0;
- }
- }
- #else
- __HAL_DMA_CLEAR_FLAG(&hdma_dac_ch1, DMA_FLAG_TC3); //清除DMA2_Steam7传输完成标志
- HAL_DAC_Stop_DMA(&hdac1,DAC_CHANNEL_1); //传输完成以后关闭串口DMA
- if(wav_play.dmacndtr <2)
- {
- PAM8303_DISABLE();
- HAL_DAC_SetValue(&hdac1,DAC_CHANNEL_1,DAC_ALIGN_8B_R,0X80);
-
-
- }
- if(dmaindex==0)
- {
- HAL_DAC_Start_DMA(&hdac1,DAC1_CHANNEL_1, Wavebuffer, wav_play.dmacndtr,DAC_ALIGN_8B_R); //启动传输
- }
- else
- {
- HAL_DAC_Start_DMA(&hdac1,DAC1_CHANNEL_1, Wavebuffer2, wav_play.dmacndtr,DAC_ALIGN_8B_R); //启动传输
- }
- if(wav_play.dmacndtr<512)
- {//如果Wavebuffer内数据不足512字节,播完则将下次dmacndtr设置为0
- wav_play.dmacndtr=0;
- // DAC1->CR&=~(1<<12);
- // TIM_Cmd(TIM7, DISABLE);
- }
- else
- {
- if (dmaindex == 0)
- {
- DFS_ReadFile(Wavebuffer2,&wav_play);//为dmaindex=1准备数据
- dmaindex=1;
- }
- else
- {
- DFS_ReadFile(Wavebuffer,&wav_play);//为dmaindex=1准备数据
- dmaindex=0;
- }
- }
- #endif
- HAL_DMA_IRQHandler(&hdma_dac_ch1);
- }
- void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* htim_base)
- {
- if(htim_base->Instance==TIM7)
- {
- /* USER CODE BEGIN TIM7_MspInit 0 */
- /* USER CODE END TIM7_MspInit 0 */
- /* Peripheral clock enable */
- __HAL_RCC_TIM7_CLK_ENABLE();
- // HAL_NVIC_SetPriority(TIM7_IRQn, 1, 3); //设置中断优先级,抢占优先级1,子优先级3
- // HAL_NVIC_EnableIRQ(TIM7_IRQn); //开启ITM3中断
- /* USER CODE BEGIN TIM7_MspInit 1 */
- /* USER CODE END TIM7_MspInit 1 */
- }
- }
- void TIM7_IRQHandler(void)
- {
- //HAL_GPIO_TogglePin(PAM8303_EN_GPIO_Port,PAM8303_EN_Pin);
- static u16 play_count=0;
- static u8 index=0;
- if(play_count<wav_play.dmacndtr)
- {
- if(index==0)
- HAL_DAC_SetValue(&hdac1,DAC_CHANNEL_1,DAC_ALIGN_8B_R,*(Wavebuffer+play_count));
- else
- HAL_DAC_SetValue(&hdac1,DAC_CHANNEL_1,DAC_ALIGN_8B_R,*(Wavebuffer2+play_count));
- play_count++;
- if(play_count>=wav_play.dmacndtr)
- {
- play_count=0;
- if(wav_play.dmacndtr<512)
- {//如果Wavebuffer内数据不足512字节,播完则将下次dmacndtr设置为0
- wav_play.dmacndtr=0;
- HAL_TIM_Base_Stop_IT(&htim7);
- // DAC1->CR&=~(1<<12);
- // TIM_Cmd(TIM7, DISABLE);
- }
- else
- {
- if (index == 0)
- {
- DFS_ReadFile(Wavebuffer2,&wav_play);//为dmaindex=1准备数据
- index=1;
- }
- else
- {
- DFS_ReadFile(Wavebuffer,&wav_play);//为dmaindex=1准备数据
- index=0;
- }
- }
- }
-
- }
- HAL_TIM_IRQHandler(&htim7);
- }
- void HAL_DAC_MspInit(DAC_HandleTypeDef* hdac)
- {
- GPIO_InitTypeDef GPIO_InitStruct = {0};
- if(hdac->Instance==DAC1)
- {
- /* USER CODE BEGIN DAC1_MspInit 0 */
- /* USER CODE END DAC1_MspInit 0 */
- /* Peripheral clock enable */
- __HAL_RCC_DAC1_CLK_ENABLE();
-
- __HAL_RCC_GPIOA_CLK_ENABLE();
- /**DAC1 GPIO Configuration
- PA4 ------> DAC1_OUT1
- */
- GPIO_InitStruct.Pin = GPIO_PIN_4;
- GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
- GPIO_InitStruct.Pull = GPIO_NOPULL;
- HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
- /* DAC1 DMA Init */
- __HAL_RCC_DMA1_CLK_ENABLE();
- /* DAC_CH1 Init */
- hdma_dac_ch1.Instance = DMA1_Channel3;
- hdma_dac_ch1.Init.Request = DMA_REQUEST_6;
- hdma_dac_ch1.Init.Direction = DMA_MEMORY_TO_PERIPH;
- hdma_dac_ch1.Init.PeriphInc = DMA_PINC_DISABLE;
- hdma_dac_ch1.Init.MemInc = DMA_MINC_ENABLE;
- hdma_dac_ch1.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
- hdma_dac_ch1.Init.MemDataAlignment = DMA_PDATAALIGN_BYTE;
- hdma_dac_ch1.Init.Mode = DMA_NORMAL;
- hdma_dac_ch1.Init.Priority = DMA_PRIORITY_HIGH;
- HAL_DMA_Init(&hdma_dac_ch1);
-
- __HAL_LINKDMA(hdac,DMA_Handle1,hdma_dac_ch1);
- /* USER CODE BEGIN DAC1_MspInit 1 */
- /* USER CODE END DAC1_MspInit 1 */
- }
- }
复制代码
|
|