<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pl-pl">
<link rel="self" type="application/atom+xml" href="https://forum.atnel.pl/feed.php?f=46&amp;t=12304&amp;mode" />

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2015-07-13T23:11:55+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=46&amp;t=12304&amp;mode</id>
<entry>
<author><name><![CDATA[krafin]]></name></author>
<updated>2015-07-13T23:11:55+01:00</updated>
<published>2015-07-13T23:11:55+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=12304&amp;p=134455#p134455</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=12304&amp;p=134455#p134455"/>
<title type="html"><![CDATA[Re: Odtwarzacz plików *.wav STM32]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=12304&amp;p=134455#p134455"><![CDATA[
Powiedz jeszcze co leży w zmiennej BUFF bo powinna tam być długość pliku minus te 44 bajty. Kodu DMA i reszty na razie nie sprawdzam gdyż nigdy nie korzystałem z tych &quot;śmiesznych&quot; bibliotek. Druga sprawa to przy takiej obsłudze twój bufor musi zmieścić w sobie tyle bajtów ile ma zmienna BUFF<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=487">krafin</a> — 13 lip 2015, o 23:11</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[klonyyy]]></name></author>
<updated>2015-07-13T09:32:03+01:00</updated>
<published>2015-07-13T09:32:03+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=12304&amp;p=134369#p134369</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=12304&amp;p=134369#p134369"/>
<title type="html"><![CDATA[Odtwarzacz plików *.wav STM32]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=12304&amp;p=134369#p134369"><![CDATA[
Witam!<br /><br />Postawiłęm sobie całkiem fajne zadanie, a mianowicie chcę zbudowac mały odtwarzacz wav przy użyciu przetwornika DAC z STM32. Niestety w internecie znalazłem bardzo okrojone kody i nie mam jak się na nich opierać. Postanowiłem więc, że sam napiszę taki play'erek w oparciu o przykład do generowania sinusoidy za pomoca wyżej wymienionego przetwornika. Kod tego przykładu:<br /><br />[syntax=c]/**<br />  ***************************************************************************** <br />  * @title   DualModeDMA_SineWave.c<br />  * @author  CooCox<br />  * @date    12 Nov 2013<br />  * @brief   This example describes how to use DAC dual channel mode with DMA<br />  *           to generate sinewaves on both DAC channels outputs. Both DAC ch<br />  *          annels conversions are configured to be triggered by TIM2 TRGO t<br />  *          riggers and without noise/triangle wave generation. 12 bit right<br />  *           data alignment is selected since we choose to access DAC_DHR12R<br />  *          D register. DMA2 channel4 is configured to transfer continuously<br />  *          , word by word, a 32-word buffer to the dual DAC register DAC_DH<br />  *          R12RD.<br />  *******************************************************************************<br />  */<br />////// The above comment is automatically generated by CoIDE ///////////////////<br /><br />/**<br />  ******************************************************************************<br />  * @file    DAC/DualModeDMA_SineWave/main.c<br />  * @author  MCD Application Team<br />  * @version V1.0.0<br />  * @date    30-October-2010<br />  * @brief   Main program body<br />  ******************************************************************************<br />  * @attention<br />  *<br />  * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS<br />  * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE<br />  * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY<br />  * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING<br />  * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE<br />  * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.<br />  *<br />  * &lt;h2&gt;&lt;center&gt;&amp;copy; COPYRIGHT 2010 STMicroelectronics&lt;/center&gt;&lt;/h2&gt;<br />  ******************************************************************************<br />  */<br /><br />/* Includes ------------------------------------------------------------------*/<br />#include &quot;stm32f10x.h&quot;<br />#include &quot;stm32f10x_rcc.h&quot;<br />#include &quot;stm32f10x_gpio.h&quot;<br />#include &quot;stm32f10x_tim.h&quot;<br />#include &quot;stm32f10x_dac.h&quot;<br />#include &quot;stm32f10x_dma.h&quot;<br /><br />/** @addtogroup STM32F10x_StdPeriph_Examples<br />  * @{<br />  */<br /><br />/** @addtogroup DAC_DualModeDMA_SineWave<br />  * @{<br />  */ <br /><br />/* Private typedef -----------------------------------------------------------*/<br />/* Private define ------------------------------------------------------------*/<br />#define DAC_DHR12RD_Address      0x40007420<br /><br />/* Init Structure definition */<br />DAC_InitTypeDef            DAC_InitStructure;<br />DMA_InitTypeDef            DMA_InitStructure;<br />TIM_TimeBaseInitTypeDef    TIM_TimeBaseStructure;<br />uint32_t Idx = 0;  <br />  <br />/* Private macro -------------------------------------------------------------*/<br />/* Private variables ---------------------------------------------------------*/<br />const uint16_t Sine12bit&#91;32&#93; = {<br />                      2047, 2447, 2831, 3185, 3498, 3750, 3939, 4056, 4095, 4056,<br />                      3939, 3750, 3495, 3185, 2831, 2447, 2047, 1647, 1263, 909, <br />                      599, 344, 155, 38, 0, 38, 155, 344, 599, 909, 1263, 1647};<br /><br />uint32_t DualSine12bit&#91;32&#93;;<br /><br />/* Private function prototypes -----------------------------------------------*/<br />void RCC_Configuration(void);<br />void GPIO_Configuration(void);<br />void Delay(__IO uint32_t nCount);<br /><br />/* Private functions ---------------------------------------------------------*/<br /><br />/**<br />  * @brief  example program.<br />  * @param  None<br />  * @retval None<br />  */<br />void DualModeDMA_SineWave(void)<br />{<br />  /*!&lt; At this stage the microcontroller clock setting is already configured, <br />       this is done through SystemInit() function which is called from startup<br />       file (startup_stm32f10x_xx.s) before to branch to application main.<br />       To reconfigure the default setting of SystemInit() function, refer to<br />       system_stm32f10x.c file<br />     */     <br />  <br />  <br />  /* System Clocks Configuration */<br />  RCC_Configuration();   <br /><br />  /* Once the DAC channel is enabled, the corresponding GPIO pin is automatically <br />     connected to the DAC converter. In order to avoid parasitic consumption, <br />     the GPIO pin should be configured in analog */<br />  GPIO_Configuration();<br /><br />  /* TIM2 Configuration */<br />  /* Time base configuration */<br />  TIM_TimeBaseStructInit(&amp;TIM_TimeBaseStructure); <br />  TIM_TimeBaseStructure.TIM_Period = 0x19;          <br />  TIM_TimeBaseStructure.TIM_Prescaler = 0x0;       <br />  TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;    <br />  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  <br />  TIM_TimeBaseInit(TIM2, &amp;TIM_TimeBaseStructure);<br /><br />  /* TIM2 TRGO selection */<br />  TIM_SelectOutputTrigger(TIM2, TIM_TRGOSource_Update);<br /><br />  /* DAC channel1 Configuration */<br />  DAC_InitStructure.DAC_Trigger = DAC_Trigger_T2_TRGO;<br />  DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None;<br />  DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Disable;<br />  DAC_Init(DAC_Channel_1, &amp;DAC_InitStructure);<br /><br />  /* DAC channel2 Configuration */<br />  DAC_Init(DAC_Channel_2, &amp;DAC_InitStructure);<br /><br />  /* Fill Sine32bit table */<br />  for (Idx = 0; Idx &lt; 32; Idx++)<br />  {<br />    DualSine12bit&#91;Idx&#93; = (Sine12bit&#91;Idx&#93; &lt;&lt; 16) + (Sine12bit&#91;Idx&#93;);<br />  }<br /><br />#if !defined STM32F10X_LD_VL &amp;&amp; !defined STM32F10X_MD_VL<br />  /* DMA2 channel4 configuration */<br />  DMA_DeInit(DMA2_Channel4);<br />#else<br />  /* DMA1 channel4 configuration */<br />  DMA_DeInit(DMA1_Channel4);<br />#endif<br />  DMA_InitStructure.DMA_PeripheralBaseAddr = DAC_DHR12RD_Address;<br />  DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&amp;DualSine12bit;<br />  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;<br />  DMA_InitStructure.DMA_BufferSize = 32;<br />  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;<br />  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;<br />  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;<br />  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;<br />  DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;<br />  DMA_InitStructure.DMA_Priority = DMA_Priority_High;<br />  DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;<br /><br />#if !defined STM32F10X_LD_VL &amp;&amp; !defined STM32F10X_MD_VL<br />  DMA_Init(DMA2_Channel4, &amp;DMA_InitStructure);<br />  /* Enable DMA2 Channel4 */<br />  DMA_Cmd(DMA2_Channel4, ENABLE);<br />#else<br />  DMA_Init(DMA1_Channel4, &amp;DMA_InitStructure);<br />  /* Enable DMA1 Channel4 */<br />  DMA_Cmd(DMA1_Channel4, ENABLE);<br />#endif<br /><br />  /* Enable DAC Channel1: Once the DAC channel1 is enabled, PA.04 is <br />     automatically connected to the DAC converter. */<br />  DAC_Cmd(DAC_Channel_1, ENABLE);<br />  /* Enable DAC Channel2: Once the DAC channel2 is enabled, PA.05 is <br />     automatically connected to the DAC converter. */<br />  DAC_Cmd(DAC_Channel_2, ENABLE);<br /><br />  /* Enable DMA for DAC Channel2 */<br />  DAC_DMACmd(DAC_Channel_2, ENABLE);<br /><br />  /* TIM2 enable counter */<br />  TIM_Cmd(TIM2, ENABLE);<br /><br />  while (1)<br />  {<br />  }<br />}<br /><br /><br />/**<br />  * @brief  Configures the different system clocks.<br />  * @param  None<br />  * @retval None<br />  */<br />void RCC_Configuration(void)<br />{   <br />  /* Enable peripheral clocks ------------------------------------------------*/<br />#if !defined STM32F10X_LD_VL &amp;&amp; !defined STM32F10X_MD_VL<br />  /* DMA2 clock enable */<br />  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE);<br />#else<br />  /* DMA1 clock enable */<br />  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);<br />#endif<br />  /* GPIOA Periph clock enable */<br />  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);<br />  /* DAC Periph clock enable */<br />  RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);<br />  /* TIM2 Periph clock enable */<br />  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);<br />}<br /><br /><br />/**<br />  * @brief  Configures the different GPIO ports.<br />  * @param  None<br />  * @retval None<br />  */<br />void GPIO_Configuration(void)<br />{<br />  GPIO_InitTypeDef GPIO_InitStructure;<br /><br />  /* Once the DAC channel is enabled, the corresponding GPIO pin is automatically <br />     connected to the DAC converter. In order to avoid parasitic consumption, <br />     the GPIO pin should be configured in analog */<br />  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_4 | GPIO_Pin_5;<br />  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;<br />  GPIO_Init(GPIOA, &amp;GPIO_InitStructure);<br />}<br /><br />/**<br />  * @brief  Inserts a delay time.<br />  * @param  nCount: specifies the delay time length.<br />  * @retval None<br />  */<br />void Delay(__IO uint32_t nCount)<br />{<br />  for(; nCount != 0; nCount--);<br />}<br /><br />#ifdef  USE_FULL_ASSERT<br /><br />/**<br />  * @brief  Reports the name of the source file and the source line number<br />  *         where the assert_param error has occurred.<br />  * @param  file: pointer to the source file name<br />  * @param  line: assert_param error line source number<br />  * @retval None<br />  */<br />void assert_failed(uint8_t* file, uint32_t line)<br />{ <br />  /* User can add his own implementation to report the file name and line number,<br />     ex: printf(&quot;Wrong parameters value: file %s on line %d\r\n&quot;, file, line) */<br /><br />  /* Infinite loop */<br />  while (1)<br />  {<br />  }<br />}<br /><br />#endif<br /><br />/**<br />  * @}<br />  */ <br /><br />/**<br />  * @}<br />  */ <br /><br />/******************* (C) COPYRIGHT 2011 Coocox *****END OF FILE****/[/syntax]<br /><br />oczywiście bardzo ładnie działa, wszystko słychać. Jednak chcę pójść dalej i odtworzyć póki co załóżmy 1s utworu. Tutaj pojawia sięmoje pytanie - jak mam to zrobić ? Próbuję to tak :<br /><br />odczytuję spory bufor z sd ( na początku pomijam nagłówek ( przesuwam o 44 bajty), bo wiem jakie ma on wartości), a następnie przez DMA przekazuję go do przetwornika, dokładnie tak samo jak przekazywana jest sinusoida w przykładzie. Poniżej kod :<br /><br />[syntax=c]void DualModeDMA_SineWave(void)<br />{<br /><br />  RCC_Configuratio();<br />  GPIO_Configuratio();<br /><br />  FATFS fs;<br />  FIL fp;<br />  FRESULT status;<br />  uint32_t s1;<br /><br />  status = f_mount(&amp;fs, &quot;&quot;, 0);<br />  status = f_open(&amp;fp,&quot;plik.wav&quot;, FA_READ | FA_OPEN_EXISTING );<br /><br />  status=f_lseek(&amp;fp,44);<br /><br />  status=f_read(&amp;fp,bufor,BUFF,&amp;s1);<br /><br />  TIM_TimeBaseStructInit(&amp;TIM_TimeBaseStructure); <br />  TIM_TimeBaseStructure.TIM_Period = 0x30; //19<br />  TIM_TimeBaseStructure.TIM_Prescaler = 0x60;<br />//  TIM_SetAutoreload(TIM2, 11025);<br />  TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;    <br />  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  <br />  TIM_TimeBaseInit(TIM2, &amp;TIM_TimeBaseStructure);<br /><br />  TIM_SelectOutputTrigger(TIM2, TIM_TRGOSource_Update);<br /><br />  DAC_InitStructure.DAC_Trigger = DAC_Trigger_T2_TRGO;<br />  DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None;<br />  DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Disable;<br />  DAC_Init(DAC_Channel_1, &amp;DAC_InitStructure);<br />  DAC_Init(DAC_Channel_2, &amp;DAC_InitStructure);<br />  DMA_DeInit(DMA2_Channel4);<br /><br />  DMA_InitStructure.DMA_PeripheralBaseAddr = &amp;(DAC-&gt;DHR8R1);<br />  DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&amp;bufor;<br />  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;<br />  DMA_InitStructure.DMA_BufferSize = BUFF;<br />  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;<br />  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;<br />  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;<br />  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;<br />  DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;<br />  DMA_InitStructure.DMA_Priority = DMA_Priority_High;<br />  DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;<br /><br />  DMA_Init(DMA2_Channel4, &amp;DMA_InitStructure);<br />  DMA_Cmd(DMA2_Channel4, ENABLE);<br />  DAC_Cmd(DAC_Channel_1, ENABLE);<br />  DAC_Cmd(DAC_Channel_2, ENABLE);<br />  DAC_DMACmd(DAC_Channel_2, ENABLE);<br />  TIM_Cmd(TIM2, ENABLE);<br /><br />}[/syntax]<br /><br />Czy coś od razu rzuca się Wam w oczy ? Co moge robić źle ? Dodam, że słychać jakieś króciutkie trzaski, ale gdy przesuwam wskaźnik w głąb pliku staja się takie same niezależnie od odległości od nagłówka. Może są jakieś pliki dźwiękowe które ułatwiłby mi uruchomienie playera ? <br /><br />pozdrawiam,<br />Piotrek<br /><br /><br />EDIT : OK posiedziałem trochę i poszło. Jeśi ktoś byłby zainteresowany kodem proszę pisać, jednka nie ma tu nic skomplikowanego...  <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> <br /><br />pozdrawiam<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=532">klonyyy</a> — 13 lip 2015, o 09:32</p><hr />
]]></content>
</entry>
</feed>