<?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=7052&amp;mode" />

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2014-05-15T21:35:34+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=46&amp;t=7052&amp;mode</id>
<entry>
<author><name><![CDATA[Forfiter]]></name></author>
<updated>2014-05-15T21:35:34+01:00</updated>
<published>2014-05-15T21:35:34+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7052&amp;p=81241#p81241</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7052&amp;p=81241#p81241"/>
<title type="html"><![CDATA[Re: STM32F3 - próbkowanie [ADC, DMA, TIM, USB]]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7052&amp;p=81241#p81241"><![CDATA[
Witam ponownie,<br />Jado, robiłem tak jak pisałeś i wyszło, że... inicjacja USB wszystko wiesza... Wziąłem dla pewności &quot;surowy&quot; przykład z ST, dodałem zwykłe miganie diody - Set,Reset GPIO + for jako delay - i tnie automatycznie diode. Nie chce się już z tym grzebać bo straciłem już na tą transmisje ponad miesiąc :/ Przerobiłem kod, dodałem obsługe USART i kod wygląda następująco:<br />[syntax=c]//  *Used on STM32F3-Discovery<br />// Free pins located in STM32F3-Discovery manual, UM1570<br /><br />// ADC1/2 Trigger EXT3 TIM2_CC2<br />// ADC3/4 Trigger EXT1 TIM2_CC3<br /><br />// Pins for this example PA1, PA4, PB1, PB12<br /><br />/**************************************************************************************/<br /><br />#include &quot;stm32f30x.h&quot;<br />#include &quot;stm32f30x_rcc.h&quot;<br />#include &quot;stm32f30x_gpio.h&quot;<br />#include &quot;stm32f30x_tim.h&quot;<br />#include &quot;stm32f30x_dma.h&quot;<br />#include &quot;stm32f30x_adc.h&quot;<br /><br />#include &quot;stm32303c_eval.h&quot;<br /><br />/**************************************************************************************/<br /><br />#define SAMPLES 25<br /><br />#define ADC12_CDR_ADDRESS    ((uint32_t)0x5000030C)<br /><br /><br />volatile uint16_t ADC12DualConvertedValue&#91;SAMPLES * 2&#93;;<br />volatile uint8_t m_sym;<br />volatile uint8_t l_sym;<br /><br />volatile uint16_t testowy=2100;<br /><br />/**************************************************************************************/<br /><br />void ADC_GPIO_Configuration(void)<br />{<br />    GPIO_InitTypeDef GPIO_InitStructure;<br /><br />  /* Enable GPIOA and GPIOB Periph clock */<br />  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA | RCC_AHBPeriph_GPIOB, ENABLE);<br /><br />  /* ADC Channels configuration */<br />  /* Configure  as analog input */<br />  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;<br />  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;<br />  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_4;<br />  GPIO_Init(GPIOA, &amp;GPIO_InitStructure);<br /> // GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_12;<br /> // GPIO_Init(GPIOB, &amp;GPIO_InitStructure);<br /><br /><br />}<br /><br />void USART_GPIO_Conf(void)<br />{<br />GPIO_InitTypeDef GPIO_InitStructure;<br /><br />GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;<br />GPIO_InitStructure.GPIO_Pin= GPIO_Pin_9;<br />GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;<br />GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;<br />GPIO_Init(GPIOA, &amp;GPIO_InitStructure);<br /><br />GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;<br />GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;<br />GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;<br />GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;<br />GPIO_Init(GPIOA, &amp;GPIO_InitStructure);<br /><br />GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_7);<br />GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_7);<br /><br />RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);<br />}<br /><br />/**************************************************************************************/<br /><br />void ADC12_DMA_Configuration(void)<br />{<br />    DMA_InitTypeDef DMA_InitStructure;<br /><br />  /* Enable DMA1 clock */<br />  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);<br /><br />  /* DMA configuration */<br />  /* DMA1 Channel1 Init Test */<br />  DMA_InitStructure.DMA_PeripheralBaseAddr = ADC12_CDR_ADDRESS;<br />  DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&amp;ADC12DualConvertedValue&#91;0&#93;;<br />  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;<br />  DMA_InitStructure.DMA_BufferSize = SAMPLES;<br />  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;<br />  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;<br />  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;<br />  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;<br />  DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;<br />  DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;<br />  DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;<br /><br />  DMA_Init(DMA1_Channel1, &amp;DMA_InitStructure); // ADC1<br />}<br /><br />/**************************************************************************************/<br /><br /><br />/**************************************************************************************/<br /><br />void ADC_Configuration(void)<br />{<br />    ADC_InitTypeDef        ADC_InitStructure;<br />    ADC_CommonInitTypeDef  ADC_CommonInitStructure;<br />  volatile int i;<br />    uint16_t CalibrationValue&#91;4&#93;;<br /><br />  /* Configure the ADC clocks */<br />  RCC_ADCCLKConfig(RCC_ADC12PLLCLK_Div1);<br /><br /><br />  /* Enable ADC1/2/3/4 clocks */<br />  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_ADC12, ENABLE);<br /><br />  /* ADC GPIO configuration */<br />  ADC_GPIO_Configuration();<br /><br />  /* ADC DMA Channel configuration */<br />  ADC12_DMA_Configuration();<br /><br />  /* ADC Calibration procedure */<br />  ADC_VoltageRegulatorCmd(ADC1, ENABLE);<br /> // ADC_VoltageRegulatorCmd(ADC2, ENABLE);<br /><br /><br />  /* Insert delay equal to 10 µs */<br />  //Delay(10);<br />    for(i=0; i&lt;10000; i++);<br /><br />  ADC_SelectCalibrationMode(ADC1, ADC_CalibrationMode_Single);<br />  ADC_StartCalibration(ADC1);<br /><br /> // ADC_SelectCalibrationMode(ADC2, ADC_CalibrationMode_Single);<br /> // ADC_StartCalibration(ADC2);<br /><br /><br />  while(ADC_GetCalibrationStatus(ADC1) != RESET );<br />  CalibrationValue&#91;0&#93; = ADC_GetCalibrationValue(ADC1);<br /><br /> // while(ADC_GetCalibrationStatus(ADC2) != RESET );<br />//  CalibrationValue&#91;1&#93; = ADC_GetCalibrationValue(ADC2);<br /><br /><br />  /* ADC Dual mode configuration */<br />  ADC_CommonInitStructure.ADC_Mode = ADC_Mode_RegSimul;<br />  ADC_CommonInitStructure.ADC_Clock = ADC_Clock_AsynClkMode;<br />  ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_1; // 12-bit<br />  ADC_CommonInitStructure.ADC_DMAMode = ADC_DMAMode_Circular;<br />  ADC_CommonInitStructure.ADC_TwoSamplingDelay = 10;<br /><br />  ADC_CommonInit(ADC1, &amp;ADC_CommonInitStructure);<br /><br />  /* */<br />  ADC_InitStructure.ADC_ContinuousConvMode = ADC_ContinuousConvMode_Disable; // Triggered<br />  ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;<br />  ADC_InitStructure.ADC_ExternalTrigEventEdge = ADC_ExternalTrigEventEdge_RisingEdge;<br />  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;<br />  ADC_InitStructure.ADC_OverrunMode = ADC_OverrunMode_Disable;<br />  ADC_InitStructure.ADC_AutoInjMode = ADC_AutoInjec_Disable;<br />  ADC_InitStructure.ADC_NbrOfRegChannel = 1;<br /><br />  ADC_InitStructure.ADC_ExternalTrigConvEvent = ADC_ExternalTrigConvEvent_3; // ADC1/2 EXT3 TIM2_CC2<br /><br />    ADC_Init(ADC1, &amp;ADC_InitStructure);<br /> // ADC_Init(ADC2, &amp;ADC_InitStructure);<br /><br /><br />  /* ADC1 regular configuration */<br />  ADC_RegularChannelConfig(ADC1, ADC_Channel_4, 1, ADC_SampleTime_7Cycles5); // PA1<br />  /* ADC2 regular configuration */<br /> // ADC_RegularChannelConfig(ADC2, ADC_Channel_1, 1, ADC_SampleTime_7Cycles5); // PA4<br /><br /><br />  /* Configures the ADC DMA */<br />  ADC_DMAConfig(ADC1, ADC_DMAMode_Circular);<br /><br />  /* Enable the ADC DMA */<br />  ADC_DMACmd(ADC1, ENABLE);<br /><br />  /* Enable ADC&#91;1..4&#93; */<br />  ADC_Cmd(ADC1, ENABLE);<br /> // ADC_Cmd(ADC2, ENABLE);<br /><br />  /* wait for ADC1 ADRDY */<br />  while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_RDY));<br /><br />  /* wait for ADC2 ADRDY */<br /> // while(!ADC_GetFlagStatus(ADC2, ADC_FLAG_RDY));<br /><br /><br />  /* Enable the DMA channel */<br />  DMA_Cmd(DMA1_Channel1, ENABLE);<br /> // DMA_Cmd(DMA2_Channel5, ENABLE);<br /><br />  /* Start ADC1 Software Conversion */<br />  ADC_StartConversion(ADC1);<br />}<br /><br />/**************************************************************************************/<br /><br />void TIM2_Configuration(void)<br />{<br />  TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;<br />    TIM_OCInitTypeDef TIM_OCInitStructure;<br /><br />  /* Enable ADC1/2/3/4 clocks */<br />  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);<br /><br />    TIM_TimeBaseStructure.TIM_Prescaler = 0;<br />  TIM_TimeBaseStructure.TIM_Period = (SystemCoreClock / 50) - 1; // 50 Hz Sample Rate<br />  TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;<br />  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;<br /><br />  TIM_TimeBaseInit(TIM2, &amp;TIM_TimeBaseStructure);<br /><br />  /* PWM1 Mode configuration: Channel2 &amp; 3 */<br />  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;<br />  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;<br />  TIM_OCInitStructure.TIM_Pulse = 10; // Some arbitary width<br />  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;<br /><br />  TIM_OC2Init(TIM2, &amp;TIM_OCInitStructure);<br />  TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable);<br /><br />  TIM_OC3Init(TIM2, &amp;TIM_OCInitStructure);<br />  TIM_OC3PreloadConfig(TIM2, TIM_OCPreload_Enable);<br /><br />  TIM_Cmd(TIM2, ENABLE);<br />}<br /><br />/**************************************************************************************/<br /><br />void NVIC_Configuration(void)<br />{<br />    NVIC_InitTypeDef NVIC_InitStructure;<br /><br />  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;<br />  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;<br />  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;<br /><br />  /* Enable DMA1 channel1 IRQ Channel */<br />  NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel1_IRQn;<br />  NVIC_Init(&amp;NVIC_InitStructure);<br />}<br /><br />/**************************************************************************************/<br /><br />void DMA1_Channel1_IRQHandler(void) // 2 Hz<br />{<br />  /* Test on DMA1 Channel1 Transfer Complete interrupt */<br />  if (DMA_GetITStatus(DMA1_IT_TC1))<br />  {<br />    /* Clear DMA1 Channel1 Half Transfer, Transfer Complete and Global interrupt pending bits */<br />    DMA_ClearITPendingBit(DMA1_IT_GL1);<br /><br />        STM_EVAL_LEDToggle(LED3); // 1 Hz<br />  }<br />}<br /><br />void USART_Conf(void)<br />{<br />USART_InitTypeDef USART_InitStructure;<br /><br />USART_InitStructure.USART_BaudRate = 9600;<br />USART_InitStructure.USART_WordLength = USART_WordLength_8b;<br />USART_InitStructure.USART_Parity = USART_Parity_No;<br />USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;<br />USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;<br />USART_Init(USART1, &amp;USART_InitStructure);<br />USART_Cmd(USART1, ENABLE);<br />}<br /><br />/**************************************************************************************/<br /><br /><br /><br />/**************************************************************************************/<br /><br />int main(void)<br />{<br /><br />int i;<br />  /* Initialize LEDs available on STM32F3-Discovery board */<br />  STM_EVAL_LEDInit(LED3);<br />  STM_EVAL_LEDInit(LED4);<br /><br />  /* Turn on LD3 */<br />  STM_EVAL_LEDOn(LED3);<br />  /* Turn off LD4 */<br />  STM_EVAL_LEDOff(LED4);<br /><br />  TIM2_Configuration();<br /><br />  ADC_Configuration();<br /><br />    /* Use LED's to confirm sample periodicity */<br />    NVIC_Configuration();<br /><br />  /* Enable DMA1 Channel1 Transfer Complete interrupt */<br />  DMA_ITConfig(DMA1_Channel1, DMA_IT_TC, ENABLE);<br /><br />  USART_GPIO_Conf();<br />  USART_Conf();<br /><br /><br /><br />  while(1)<br />  {<br />  m_sym = (uint8_t)(testowy &amp; 0xFF);<br />  l_sym = (uint8_t)(testowy &gt;&gt; 8);<br /><br />  USART_SendData(USART1, l_sym);<br />  for(i=0; i&lt;100000; i++);<br />  USART_SendData(USART1, m_sym);<br />// USART_SendData(USART1, ADC12DualConvertedValue&#91;20&#93;);<br />  }<br />}[/syntax]<br /><br />Przesyła wybraną próbke do PC (ADC w 100% działa bo sprawdzałem za pomocą potencjometru). Z racji że chciałem mieć 12 bitowe próbki zrobiłem sobie &quot;rozdzielanie&quot; 16bitowej wartości na 2 bajty - młodsza i starsza część próbki. Działa - tylko, że... nie potrafię zsynchronizować wysyłania naprzemiennego (raz leci odpowiednia sekwencja 16 bitów, raz lecą pod rząd same bity mniej znaczącej części, a innym razem bardziej znaczącej). Pierwsza myśl - wprowadze opóźnienie, ale czy to najlepszy sposób ? Wątpie... Kolejna sprawa, że chce osiągnąć częstotliwość próbkowania na poziomie 200-500kHz więc...wysyłanie na bieżąco nie spełni sie za bardzo. Są jakieś inne koncepcje na wysyłanie 12 bitowych wartości za pomocą USART w miare składny sposób ? Tak, wiem np opcja z funkcją <em>ITOA</em>, ale konwersja na char też swoje trwa.... docelowo chce wysyłać do komputera ok 1024-2048 próbek.<br />Pozdrawiam.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3691">Forfiter</a> — 15 maja 2014, o 21:35</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Jado]]></name></author>
<updated>2014-05-14T18:27:01+01:00</updated>
<published>2014-05-14T18:27:01+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7052&amp;p=81133#p81133</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7052&amp;p=81133#p81133"/>
<title type="html"><![CDATA[Re: STM32F3 - próbkowanie [ADC, DMA, TIM, USB]]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7052&amp;p=81133#p81133"><![CDATA[
Niestety, ale często własnie tak bywa, że oddzielnie każdy fragment kodu działa, a razem poskładane &quot;do kupy&quot; nie chcą.<br />Kody te mogą współzawodniczyć ze sobą o dostęp do zasobów mikrokontrolera, a wreszcie o sam czas procesora, który jest przecież ograniczony.  <br />Wystarczy, że któryś z kodów będzie miał w sobie wbudowaną pętlę oczekiwania na jakiś warunek i już będzie blokował pozostałe części programu, które oczywiście nie będą działać poprawnie.  <br />Dlatego między innymi stosuje się róźnego rodzaju RTOS'y, maszyny stanów, itp., żeby zapewnić współbieżność działania tych wszystkich programów. <br />Jeśli każdy z fragmentów programu Ci działa, a razem nie chcą, to zastanów się, w jaki sposób każdy z nich może oddziaływać na inny.<br />Który z nich powinien mieć największy priorytet działania, a który może poczekać.  Czasami wystarczy zmienić priorytety przerwań i program zaczyna działać.  <br />Niestety są to &quot;najwredniejsze&quot; z możliwych błędów, bo generalnie nie ma błędu programowego jako takiego, są tylko niespełnione warunki czasowe działania programu.<br />Może warto byłoby wprowadzić flagi informujące pozostałe części programu o uruchomieniu innego jego fragmentu - i w tym czasie wstrzymać się z uruchamianiem jednocześnie innych funkcji.<br />Spróbuj uruchamiać kod po kolei - najpierw jedną część, tą która działa bezproblemowo, potem dodawaj kolejne fragmenty i patrz czy to dodanie zakłóciło działanie tego pierwszego kodu.<br />Potem spróbuj przeanalizować co w danym kodzie może mieć wpływ na zaburzenie działania tego pierwszego działającego programu.<br />Trzeba rozbić problem na mniejsze części.<br />Dobrze jest też robić regularne backupy-snapshoty pisanego kodu, bo czasami &quot;trąci się jakiś klawisz, bo klawiatura spada ze stołu&quot; i to potrafi we wredny sposób niepostrzeżenie zmienić kod, który nagle przestaje działać.  Wtedy odtworzenie kopii z backupu ratuje nas przed wielogodzinnym szukaniem niewiadomego błędu.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=852">Jado</a> — 14 maja 2014, o 18:27</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Forfiter]]></name></author>
<updated>2014-05-14T15:20:44+01:00</updated>
<published>2014-05-14T15:20:44+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7052&amp;p=81100#p81100</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7052&amp;p=81100#p81100"/>
<title type="html"><![CDATA[Re: STM32F3 - próbkowanie [ADC, DMA, TIM, USB]]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7052&amp;p=81100#p81100"><![CDATA[
Zero pomysłów ?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3691">Forfiter</a> — 14 maja 2014, o 15:20</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Forfiter]]></name></author>
<updated>2014-05-13T18:06:11+01:00</updated>
<published>2014-05-13T18:06:11+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7052&amp;p=81016#p81016</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7052&amp;p=81016#p81016"/>
<title type="html"><![CDATA[Re: STM32F3 - próbkowanie [ADC, DMA, TIM, USB]]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7052&amp;p=81016#p81016"><![CDATA[
Masakra po całości... dzięki uprzejmości pewnego Pana z ST otrzymałem sprawnie działający program ADC+TIM+DMA. USB mi działało, więc postanowiłem je zestawic do kupy... wyszło mi coś takiego:<br />[syntax=c]// STM32 ADC Quad Mode STM32F3-Discovery - sourcer32@gmail.com<br /><br />/**************************************************************************************/<br /><br />//              ADC1        ADC2        ADC3        ADC4<br />//  IN1   PA0*    PA4     PB1     PE14*<br />//  IN2   PA1     PA5*    PE9*    PE15*<br />//  IN3   PA2     PA6*    PE13*   PB12<br />//  IN4   PA3     PA7*    ---     PB14<br />//  IN5   PF4     PC4     PB13    PB15<br />//<br />//  *Used on STM32F3-Discovery<br />// Free pins located in STM32F3-Discovery manual, UM1570<br /><br />// ADC1/2 Trigger EXT3 TIM2_CC2<br />// ADC3/4 Trigger EXT1 TIM2_CC3<br /><br />// Pins for this example PA1, PA4, PB1, PB12<br /><br />/**************************************************************************************/<br /><br />#include &quot;stm32f30x.h&quot;<br />#include &quot;stm32f30x_flash.h&quot;<br />#include &quot;stm32f30x_misc.h&quot;<br />#include &quot;stm32f30x_rcc.h&quot;<br />#include &quot;stm32f30x_exti.h&quot;<br />#include &quot;stm32f30x_gpio.h&quot;<br />#include &quot;stm32f30x_dma.h&quot;<br />#include &quot;stm32f30x_tim.h&quot;<br />#include &quot;stm32f30x_adc.h&quot;<br />#include &quot;hw_config.h&quot;<br />#include &quot;usb_lib.h&quot;<br />#include &quot;usb_desc.h&quot;<br />#include &quot;usb_pwr.h&quot;<br /><br /><br />//#include &quot;stm32303c_eval.h&quot;<br /><br />/**************************************************************************************/<br /><br />#define SAMPLES 25<br /><br />#define ADC12_CDR_ADDRESS    ((uint32_t)0x5000030C)<br />#define ADC34_CDR_ADDRESS    ((uint32_t)0x5000070C)<br /><br />extern __IO uint8_t Receive_Buffer&#91;64&#93;;<br />extern __IO  uint32_t Receive_length ;<br />extern __IO  uint32_t Send_length ;<br />extern __IO  uint32_t length ;<br />uint16_t Send_Buffer&#91;60&#93;;<br />uint32_t packet_sent=1;<br />uint32_t packet_receive=1;<br /><br />volatile uint16_t ADC12DualConvertedValue&#91;SAMPLES * 2&#93;;<br />volatile uint16_t ADC34DualConvertedValue&#91;SAMPLES * 2&#93;;<br /><br />/**************************************************************************************/<br /><br />void ADC_GPIO_Configuration(void)<br />{<br />    GPIO_InitTypeDef GPIO_InitStructure;<br /><br />  /* Enable GPIOA and GPIOB Periph clock */<br />  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA | RCC_AHBPeriph_GPIOB, ENABLE);<br />  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOE, ENABLE);<br />  /* ADC Channels configuration */<br />  /* Configure  as analog input */<br />  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;<br />  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;<br />  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_4;<br />  GPIO_Init(GPIOA, &amp;GPIO_InitStructure);<br />  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_12;<br />  GPIO_Init(GPIOB, &amp;GPIO_InitStructure);<br /><br />  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11;<br />  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;<br />  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;<br />  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;<br />  GPIO_Init(GPIOE, &amp;GPIO_InitStructure);<br />}<br /><br />/**************************************************************************************/<br /><br />void ADC12_DMA_Configuration(void)<br />{<br />    DMA_InitTypeDef DMA_InitStructure;<br /><br />  /* Enable DMA1 clock */<br />  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);<br /><br />  /* DMA configuration */<br />  /* DMA1 Channel1 Init Test */<br />  DMA_InitStructure.DMA_PeripheralBaseAddr = ADC12_CDR_ADDRESS;<br />  DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&amp;ADC12DualConvertedValue&#91;0&#93;;<br />  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;<br />  DMA_InitStructure.DMA_BufferSize = SAMPLES;<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_Medium;<br />  DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;<br /><br />  DMA_Init(DMA1_Channel1, &amp;DMA_InitStructure); // ADC1<br />}<br /><br />/**************************************************************************************/<br /><br />void ADC34_DMA_Configuration(void)<br />{<br />    DMA_InitTypeDef DMA_InitStructure;<br /><br />  /* Enable DMA2 clock */<br />  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE);<br /><br />  /* DMA configuration */<br />  /* DMA2 Channel5 Init Test */<br />  DMA_InitStructure.DMA_PeripheralBaseAddr = ADC34_CDR_ADDRESS;<br />  DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&amp;ADC34DualConvertedValue&#91;0&#93;;<br />  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;<br />  DMA_InitStructure.DMA_BufferSize = SAMPLES;<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_Medium;<br />  DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;<br /><br />  DMA_Init(DMA2_Channel5, &amp;DMA_InitStructure); // ADC3<br />}<br /><br />/**************************************************************************************/<br /><br />void ADC_Configuration(void)<br />{<br />    ADC_InitTypeDef        ADC_InitStructure;<br />    ADC_CommonInitTypeDef  ADC_CommonInitStructure;<br />  volatile int i;<br />    uint16_t CalibrationValue&#91;4&#93;;<br /><br />  /* Configure the ADC clocks */<br />  RCC_ADCCLKConfig(RCC_ADC12PLLCLK_Div1);<br />  RCC_ADCCLKConfig(RCC_ADC34PLLCLK_Div1);<br /><br />  /* Enable ADC1/2/3/4 clocks */<br />  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_ADC12 | RCC_AHBPeriph_ADC34, ENABLE);<br /><br />  /* ADC GPIO configuration */<br />  ADC_GPIO_Configuration();<br /><br />  /* ADC DMA Channel configuration */<br />  ADC12_DMA_Configuration();<br />  ADC34_DMA_Configuration();<br /><br />  /* ADC Calibration procedure */<br />  ADC_VoltageRegulatorCmd(ADC1, ENABLE);<br />  ADC_VoltageRegulatorCmd(ADC2, ENABLE);<br />  ADC_VoltageRegulatorCmd(ADC3, ENABLE);<br />  ADC_VoltageRegulatorCmd(ADC4, ENABLE);<br /><br />  /* Insert delay equal to 10 µs */<br />  //Delay(10);<br />    for(i=0; i&lt;10000; i++);<br /><br />  ADC_SelectCalibrationMode(ADC1, ADC_CalibrationMode_Single);<br />  ADC_StartCalibration(ADC1);<br /><br />  ADC_SelectCalibrationMode(ADC2, ADC_CalibrationMode_Single);<br />  ADC_StartCalibration(ADC2);<br /><br />  ADC_SelectCalibrationMode(ADC3, ADC_CalibrationMode_Single);<br />  ADC_StartCalibration(ADC3);<br /><br />  ADC_SelectCalibrationMode(ADC4, ADC_CalibrationMode_Single);<br />  ADC_StartCalibration(ADC4);<br /><br />  while(ADC_GetCalibrationStatus(ADC1) != RESET );<br />  CalibrationValue&#91;0&#93; = ADC_GetCalibrationValue(ADC1);<br /><br />  while(ADC_GetCalibrationStatus(ADC2) != RESET );<br />  CalibrationValue&#91;1&#93; = ADC_GetCalibrationValue(ADC2);<br /><br />  while(ADC_GetCalibrationStatus(ADC3) != RESET );<br />  CalibrationValue&#91;2&#93; = ADC_GetCalibrationValue(ADC3);<br /><br />  while(ADC_GetCalibrationStatus(ADC4) != RESET );<br />  CalibrationValue&#91;3&#93; = ADC_GetCalibrationValue(ADC4);<br /><br />  /* ADC Dual mode configuration */<br />  ADC_CommonInitStructure.ADC_Mode = ADC_Mode_RegSimul;<br />  ADC_CommonInitStructure.ADC_Clock = ADC_Clock_AsynClkMode;<br />  ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_1; // 12-bit<br />  ADC_CommonInitStructure.ADC_DMAMode = ADC_DMAMode_Circular;<br />  ADC_CommonInitStructure.ADC_TwoSamplingDelay = 10;<br /><br />  ADC_CommonInit(ADC1, &amp;ADC_CommonInitStructure);<br />  ADC_CommonInit(ADC3, &amp;ADC_CommonInitStructure);<br /><br />  /* */<br />  ADC_InitStructure.ADC_ContinuousConvMode = ADC_ContinuousConvMode_Disable; // Triggered<br />  ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;<br />  ADC_InitStructure.ADC_ExternalTrigEventEdge = ADC_ExternalTrigEventEdge_RisingEdge;<br />  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;<br />  ADC_InitStructure.ADC_OverrunMode = ADC_OverrunMode_Disable;<br />  ADC_InitStructure.ADC_AutoInjMode = ADC_AutoInjec_Disable;<br />  ADC_InitStructure.ADC_NbrOfRegChannel = 1;<br /><br />  ADC_InitStructure.ADC_ExternalTrigConvEvent = ADC_ExternalTrigConvEvent_3; // ADC1/2 EXT3 TIM2_CC2<br /><br />    ADC_Init(ADC1, &amp;ADC_InitStructure);<br />  ADC_Init(ADC2, &amp;ADC_InitStructure);<br /><br />  ADC_InitStructure.ADC_ExternalTrigConvEvent = ADC_ExternalTrigConvEvent_1; // ADC3/4 EXT1 TIM2_CC3<br /><br />    ADC_Init(ADC3, &amp;ADC_InitStructure);<br />  ADC_Init(ADC4, &amp;ADC_InitStructure);<br /><br />  /* ADC1 regular configuration */<br />  ADC_RegularChannelConfig(ADC1, ADC_Channel_4, 1, ADC_SampleTime_7Cycles5); // PA1<br />  /* ADC2 regular configuration */<br />  ADC_RegularChannelConfig(ADC2, ADC_Channel_1, 1, ADC_SampleTime_7Cycles5); // PA4<br />  /* ADC3 regular configuration */<br />  ADC_RegularChannelConfig(ADC3, ADC_Channel_1, 1, ADC_SampleTime_7Cycles5); // PB1<br />  /* ADC4 regular configuration */<br />  ADC_RegularChannelConfig(ADC4, ADC_Channel_3, 1, ADC_SampleTime_7Cycles5); // PB12<br /><br />  /* Configures the ADC DMA */<br />  ADC_DMAConfig(ADC1, ADC_DMAMode_Circular);<br />  ADC_DMAConfig(ADC3, ADC_DMAMode_Circular);<br /><br />  /* Enable the ADC DMA */<br />  ADC_DMACmd(ADC1, ENABLE);<br />  ADC_DMACmd(ADC3, ENABLE);<br /><br />  /* Enable ADC&#91;1..4&#93; */<br />  ADC_Cmd(ADC1, ENABLE);<br />  ADC_Cmd(ADC2, ENABLE);<br />  ADC_Cmd(ADC3, ENABLE);<br />  ADC_Cmd(ADC4, ENABLE);<br /><br />  /* wait for ADC1 ADRDY */<br />  while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_RDY));<br /><br />  /* wait for ADC2 ADRDY */<br />  while(!ADC_GetFlagStatus(ADC2, ADC_FLAG_RDY));<br /><br />  /* wait for ADC3 ADRDY */<br />  while(!ADC_GetFlagStatus(ADC3, ADC_FLAG_RDY));<br /><br />  /* wait for ADC4 ADRDY */<br />  while(!ADC_GetFlagStatus(ADC4, ADC_FLAG_RDY));<br /><br />  /* Enable the DMA channel */<br />  DMA_Cmd(DMA1_Channel1, ENABLE);<br />  DMA_Cmd(DMA2_Channel5, ENABLE);<br /><br />  /* Start ADC1 Software Conversion */<br />  ADC_StartConversion(ADC1);<br />  ADC_StartConversion(ADC3);<br />}<br /><br />/**************************************************************************************/<br /><br />void TIM2_Configuration(void)<br />{<br />  TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;<br />    TIM_OCInitTypeDef TIM_OCInitStructure;<br /><br />  /* Enable ADC1/2/3/4 clocks */<br />  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);<br /><br />    TIM_TimeBaseStructure.TIM_Prescaler = 7200;<br />  TIM_TimeBaseStructure.TIM_Period = 100; // 50 Hz Sample Rate<br />  TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;<br />  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;<br /><br />  TIM_TimeBaseInit(TIM2, &amp;TIM_TimeBaseStructure);<br /><br />  /* PWM1 Mode configuration: Channel2 &amp; 3 */<br />  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;<br />  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;<br />  TIM_OCInitStructure.TIM_Pulse = 10; // Some arbitary width<br />  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;<br /><br />  TIM_OC2Init(TIM2, &amp;TIM_OCInitStructure);<br />  TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable);<br /><br />  TIM_OC3Init(TIM2, &amp;TIM_OCInitStructure);<br />  TIM_OC3PreloadConfig(TIM2, TIM_OCPreload_Enable);<br /><br />  TIM_Cmd(TIM2, ENABLE);<br />}<br /><br />/**************************************************************************************/<br /><br />void NVIC_Configuration(void)<br />{<br />    NVIC_InitTypeDef NVIC_InitStructure;<br /><br />  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;<br />  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;<br />  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;<br /><br />  /* Enable DMA1 channel1 IRQ Channel */<br />  NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel1_IRQn;<br />  NVIC_Init(&amp;NVIC_InitStructure);<br />  /* Enable DMA2 channel5 IRQ Channel */<br />  NVIC_InitStructure.NVIC_IRQChannel = DMA2_Channel5_IRQn;<br />  NVIC_Init(&amp;NVIC_InitStructure);<br />}<br /><br />/**************************************************************************************/<br /><br />void DMA1_Channel1_IRQHandler(void) // 2 Hz<br />{<br />  /* Test on DMA1 Channel1 Transfer Complete interrupt */<br />  if (DMA_GetITStatus(DMA1_IT_TC1))<br />  {<br />    /* Clear DMA1 Channel1 Half Transfer, Transfer Complete and Global interrupt pending bits */<br />    DMA_ClearITPendingBit(DMA1_IT_GL1);<br /><br />       // GPIO_ResetBits(GPIOE, GPIO_Pin_9);// 1 Hz<br />  }<br />}<br /><br />/**************************************************************************************/<br /><br />void DMA2_Channel5_IRQHandler(void) // 2 Hz<br />{<br />  /* Test on DMA2 Channel5 Transfer Complete interrupt */<br />  if (DMA_GetITStatus(DMA2_IT_TC5))<br />  {<br />    /* Clear DMA2 Channel5 Half Transfer, Transfer Complete and Global interrupt pending bits */<br />    DMA_ClearITPendingBit(DMA2_IT_GL5);<br /><br />       // GPIO_SetBits(GPIOE,GPIO_Pin_9); // 1 Hz<br />  }<br />}<br /><br />/**************************************************************************************/<br /><br />void main(void)<br />{<br />  /* Initialize LEDs available on STM32F3-Discovery board */<br />  //GPIO_SetBits(GPIOE, GPIO_Pin_10);<br /> // GPIO_SetBits(GPIOE, GPIO_Pin_11);<br /> // STM_EVAL_LEDInit(LED4);<br /><br />  /* Turn on LD3 */<br /> // GPIO_SetBits(GPIOE,GPIO_Pin_10);<br /> // GPIO_SetBits(GPIOE, GPIO_Pin_11);<br />  /* Turn off LD4 */<br /> // STM_EVAL_LEDOff(LED4);<br /><br />  long int j=0;<br /><br />  TIM2_Configuration();<br /><br />  ADC_Configuration();<br /><br />  Set_System();<br />  Set_USBClock();<br />  USB_Interrupts_Config();<br />  USB_Init();<br />    /* Use LED's to confirm sample periodicity */<br />    NVIC_Configuration();<br /><br />  /* Enable DMA1 Channel1 Transfer Complete interrupt */<br />  DMA_ITConfig(DMA1_Channel1, DMA_IT_TC, ENABLE);<br /><br />  /* Enable DMA2 Channel5 Transfer Complete interrupt */<br />  DMA_ITConfig(DMA2_Channel5, DMA_IT_TC, ENABLE);<br /><br />  GPIO_SetBits(GPIOE,GPIO_Pin_9);<br /><br />  if (bDeviceState == CONFIGURED)<br />      {<br /><br />        if (Receive_length  != 0)<br />        {<br />        if (packet_sent == 1)<br />        {<br />        GPIO_SetBits(GPIOE, GPIO_Pin_11);<br />        CDC_Send_DATA ((unsigned char*)Send_Buffer,60);<br /><br />        }<br />        packet_sent = 1;<br />        for(j=0; j&lt;2000; j++);<br />        }<br />        Receive_length = 0;<br />      }<br />  while(1); // Don't want to exit<br />}[/syntax]<br /><br />Wszystko fajnie, dioda się świeci - czyli void main jest 'widzialny' ale... na terminalu cisza... w dodatku stm32 mi go zawiesza :/<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3691">Forfiter</a> — 13 maja 2014, o 18:06</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Forfiter]]></name></author>
<updated>2014-05-13T15:14:15+01:00</updated>
<published>2014-05-13T15:14:15+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7052&amp;p=80999#p80999</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7052&amp;p=80999#p80999"/>
<title type="html"><![CDATA[Re: STM32F3 - próbkowanie [ADC, DMA, TIM, USB]]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7052&amp;p=80999#p80999"><![CDATA[
Aktywowałem ale dalej nic ehh...<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3691">Forfiter</a> — 13 maja 2014, o 15:14</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[PJS]]></name></author>
<updated>2014-05-13T05:38:58+01:00</updated>
<published>2014-05-13T05:38:58+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7052&amp;p=80966#p80966</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7052&amp;p=80966#p80966"/>
<title type="html"><![CDATA[Re: STM32F3 - próbkowanie [ADC, DMA, TIM, USB]]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7052&amp;p=80966#p80966"><![CDATA[
No to jeszcze aktywuj zegar dla portu E, bo nie widzę tego w RCC_Config().<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1614">PJS</a> — 13 maja 2014, o 05:38</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Forfiter]]></name></author>
<updated>2014-05-12T21:51:00+01:00</updated>
<published>2014-05-12T21:51:00+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7052&amp;p=80946#p80946</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7052&amp;p=80946#p80946"/>
<title type="html"><![CDATA[Re: STM32F3 - próbkowanie [ADC, DMA, TIM, USB]]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7052&amp;p=80946#p80946"><![CDATA[
To nic nie dało :/ Dałem świecenie diody do funkcji main - zero reakcji...<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3691">Forfiter</a> — 12 maja 2014, o 21:51</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[PJS]]></name></author>
<updated>2014-05-12T21:36:16+01:00</updated>
<published>2014-05-12T21:36:16+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7052&amp;p=80945#p80945</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7052&amp;p=80945#p80945"/>
<title type="html"><![CDATA[Re: STM32F3 - próbkowanie [ADC, DMA, TIM, USB]]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7052&amp;p=80945#p80945"><![CDATA[
Widzę, że masz coś takiego:<br />[syntax=c]NVIC_InitStructure.NVIC_IRQChannel = ENABLE;<br /> <br />NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel1_IRQn;[/syntax]<br /><br />To pierwsze chyba powinno być:<br /><br />[syntax=c]NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1614">PJS</a> — 12 maja 2014, o 21:36</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Forfiter]]></name></author>
<updated>2014-05-12T20:41:36+01:00</updated>
<published>2014-05-12T20:41:36+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7052&amp;p=80933#p80933</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7052&amp;p=80933#p80933"/>
<title type="html"><![CDATA[Re: STM32F3 - próbkowanie [ADC, DMA, TIM, USB]]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7052&amp;p=80933#p80933"><![CDATA[
Źle to określiłem - z tym miganiem <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> Ogólnie chciałem zobaczyć czy wchodzi w przerwanie - zaświecenie diody. Nie jestem pewien czy nie trzeba dołączać jakiejś deklaracji związanej z aktywacją zegara dla przerwań, ale w notach od STM32f303 nic o tym nie ma :/<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3691">Forfiter</a> — 12 maja 2014, o 20:41</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[PJS]]></name></author>
<updated>2014-05-12T20:39:47+01:00</updated>
<published>2014-05-12T20:39:47+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7052&amp;p=80931#p80931</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7052&amp;p=80931#p80931"/>
<title type="html"><![CDATA[Re: STM32F3 - próbkowanie [ADC, DMA, TIM, USB]]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7052&amp;p=80931#p80931"><![CDATA[
[syntax=c]GPIO_SetBits(GPIOE, GPIO_Pin_11); // sprawdzenie czy wystepuje przerwanie od dma1[/syntax]<br /><br />Ta funkcja ustawia wyjście w stan &quot;1&quot;, a nie zmienia stanu naprzemiennie, więc dioda raczej nie będzie migać. To tak na szybko, co zwróciło moją uwagę.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1614">PJS</a> — 12 maja 2014, o 20:39</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Forfiter]]></name></author>
<updated>2014-05-12T18:40:43+01:00</updated>
<published>2014-05-12T18:40:43+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7052&amp;p=80922#p80922</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7052&amp;p=80922#p80922"/>
<title type="html"><![CDATA[STM32F3 - próbkowanie [ADC, DMA, TIM, USB]]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7052&amp;p=80922#p80922"><![CDATA[
Witam ponownie,<br />Chciałem zasięgnąć porady dotyczącej mojego kodu. USB ładnie sobie śmigało, więc postanowiłem dobudować pare klocków, które pozwalały by na próbkowanie sygnału i wysyłanie przez USB. Pokleiłem, pokleiłem... i wyszedł mi poniższy kod (zamieszczam zawartość pliku main.c). Pierwsze uruchomienie - w terminalu widze 20 zer. Poprawki, korekty - nic. Zapuściłem sobie miganie diody w przerwaniu od DMA - nie miga, czyli przerwanie takowe w ogóle nie występuje. Mógłby ktoś zerknąć na kod i sprawdzić czego brakuje ?<br />Pozdrawiam.<br /><br />[syntax=c]#include &quot;stm32f30x_flash.h&quot;<br />#include &quot;stm32f30x_rcc.h&quot;<br />#include &quot;stm32f30x_gpio.h&quot;<br />#include &quot;stm32f30x_tim.h&quot;<br />#include &quot;stm32f30x_dma.h&quot;<br />#include &quot;stm32f30x_adc.h&quot;<br />#include &quot;hw_config.h&quot;<br />#include &quot;usb_lib.h&quot;<br />#include &quot;usb_desc.h&quot;<br />#include &quot;usb_pwr.h&quot;<br />#include &quot;itoa.h&quot;<br />#include &lt;string.h&gt;<br /><br />volatile uint16_t FFT_buffer&#91;120&#93;;<br />extern __IO uint8_t Receive_Buffer&#91;64&#93;;<br />extern __IO  uint32_t Receive_length ;<br />extern __IO  uint32_t Send_length ;<br />extern __IO  uint32_t length ;<br />uint16_t Send_Buffer&#91;60&#93;;<br />uint32_t packet_sent=1;<br />uint32_t packet_receive=1;<br /><br />void RCC_Config(void);<br />void GPIO_Config(void);<br />void NVIC_Config(void);<br />void DMA_Config(void);<br />void ADC_Config(void);<br />void TIM1_Config(void);<br /><br />int main(void)<br />{<br /><br />  int j;<br />  GPIO_Config();<br />  RCC_Config();<br />  NVIC_Config();<br />  DMA_Config();<br />  ADC_Config();<br />  TIM1_Config();<br />  DMA_ITConfig(DMA1_Channel1, DMA_IT_TC, ENABLE);<br /><br />  Set_System();<br />  Set_USBClock();<br />  USB_Interrupts_Config();<br />  USB_Init();<br /><br /><br />  while (1)<br />  {<br />    if (bDeviceState == CONFIGURED)<br />    {<br />      CDC_Receive_DATA();<br />      /*Check to see if we have data yet */<br />      if (Receive_length  != 0)<br />      {<br />      if (packet_sent == 1)<br />      {<br />      CDC_Send_DATA ((unsigned char*)Send_Buffer,20);<br />      }<br />      packet_sent = 1;<br />      for(j=0; j&lt;2000; j++);<br />      }<br />      Receive_length = 0;<br />    }<br />  }<br />}<br /><br />//------------------------------------------------------------------------------------//<br /><br />void RCC_Config(void)<br />{<br />ErrorStatus HSEStartUpStatus;<br />RCC_DeInit();<br />RCC_HSEConfig(RCC_HSE_ON);<br />HSEStartUpStatus = RCC_WaitForHSEStartUp();<br />if(HSEStartUpStatus == SUCCESS)<br />{<br />FLASH_PrefetchBufferCmd(FLASH_ACR_PRFTBE);<br />FLASH_SetLatency(FLASH_Latency_2);<br />RCC_HCLKConfig(RCC_SYSCLK_Div1);<br />RCC_PCLK2Config(RCC_HCLK_Div1);<br />RCC_PCLK1Config(RCC_HCLK_Div2);<br />RCC_PLLConfig(RCC_PLLSource_PREDIV1, RCC_PLLMul_9); // Czestotliwosc PLL<br />RCC_PLLCmd(ENABLE);<br />while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);<br />RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);<br />while(RCC_GetSYSCLKSource() != 0X08);<br /><br />RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); // Aktywacja zegara dla portu GPIOA<br />RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); // Aktywacja zegara dla DMA1<br />RCC_ADCCLKConfig(RCC_ADC12PLLCLK_Div1); // Dzielnik zegara dla ADC1<br />RCC_AHBPeriphClockCmd(RCC_AHBPeriph_ADC12, ENABLE); // Aktywacja zegara dla ADC1<br />RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); // Aktywacja zegara TIM2<br />}<br />else{}<br />}<br /><br />//------------------------------------------------------------------------------------//<br /><br />void GPIO_Config(void)<br />{<br />//--------------------------------------ADC1--------------------------------------//<br />GPIO_InitTypeDef GPIO_InitStructure;<br /><br />GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;<br />GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;<br />GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;<br />GPIO_Init(GPIOA, &amp;GPIO_InitStructure);<br /><br />GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;<br />GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;<br />GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;<br />GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;<br />GPIO_Init(GPIOE, &amp;GPIO_InitStructure);<br />}<br /><br />//------------------------------------------------------------------------------------//<br /><br />void DMA_Config(void)<br />{<br />DMA_InitTypeDef DMA_InitStructure;<br /><br />DMA_InitStructure.DMA_PeripheralBaseAddr = ((uint32_t)0x5000030C);<br />DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&amp;FFT_buffer&#91;0&#93;;<br />DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;<br />DMA_InitStructure.DMA_BufferSize = 60; // wielkosc bufora;<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_Medium;<br />DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;<br /><br />DMA_Init(DMA1_Channel1, &amp;DMA_InitStructure);<br />}<br /><br />//------------------------------------------------------------------------------------//<br /><br />void TIM1_Config(void)<br />{<br />TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;<br /><br />TIM_TimeBaseStructure.TIM_Prescaler = 72; //dzielnik czestotliwosci 72MHz/72=1MHz -&gt; 1us<br />TIM_TimeBaseStructure.TIM_Period = 5; // częstotliwosc probkowania<br />TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;<br />TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;<br /><br />TIM_TimeBaseInit(TIM2, &amp;TIM_TimeBaseStructure);<br /><br /><br />TIM_OCInitTypeDef TIM_OCInitStructure;<br /><br />TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;<br />TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;<br />TIM_OCInitStructure.TIM_Pulse = 10;<br />TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;<br /><br />TIM_OC2Init(TIM2, &amp;TIM_OCInitStructure);<br />TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable);<br />TIM_Cmd(TIM2, ENABLE);<br />}<br /><br />//------------------------------------------------------------------------------------//<br /><br />void ADC_Config(void)<br />{<br />//------------------------------------zmienne-----------------------------------------//<br />volatile int delay;<br />uint16_t CalibrationValue&#91;4&#93;;<br />//-----------------------------------kalibracja---------------------------------------//<br />ADC_VoltageRegulatorCmd(ADC1, ENABLE);<br />for(delay=0; delay &lt; 10000; delay++);<br />ADC_SelectCalibrationMode(ADC1, ADC_CalibrationMode_Single);<br />ADC_StartCalibration(ADC1);<br />while(ADC_GetCalibrationStatus(ADC1) != RESET);<br />CalibrationValue&#91;0&#93; = ADC_GetCalibrationValue(ADC1);<br /><br />//----------------------------------deklaracje----------------------------------------//<br />ADC_CommonInitTypeDef ADC_CommonInitStructure;<br />ADC_InitTypeDef ADC_InitStructure;<br /><br />ADC_CommonInitStructure.ADC_Mode = ADC_Mode_RegSimul;<br />ADC_CommonInitStructure.ADC_Clock = ADC_Clock_AsynClkMode;<br />ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_1;<br />ADC_CommonInitStructure.ADC_DMAMode = ADC_DMAMode_Circular;<br />ADC_CommonInitStructure.ADC_TwoSamplingDelay = 10;<br /><br /><br /><br />ADC_InitStructure.ADC_ContinuousConvMode = ADC_ContinuousConvMode_Disable;<br />ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;<br />ADC_InitStructure.ADC_ExternalTrigConvEvent = ADC_ExternalTrigConvEvent_3;<br />ADC_InitStructure.ADC_ExternalTrigEventEdge = ADC_ExternalTrigEventEdge_RisingEdge;<br />ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;<br />ADC_InitStructure.ADC_OverrunMode = ADC_OverrunMode_Disable;<br />ADC_InitStructure.ADC_AutoInjMode = ADC_AutoInjec_Disable;<br />ADC_InitStructure.ADC_NbrOfRegChannel = 1;<br /><br />ADC_Init(ADC1, &amp;ADC_InitStructure);<br /><br />ADC_RegularChannelConfig(ADC1, ADC_Channel_4, 1, ADC_SampleTime_1Cycles5);<br />ADC_DMAConfig(ADC1, ADC_DMAMode_Circular);<br />ADC_Cmd(ADC1, ENABLE);<br /><br />while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_RDY));<br />DMA_Cmd(DMA1_Channel1, ENABLE);<br />ADC_StartConversion(ADC1);<br />}<br /><br />//----------------------------------------------------------------------------------------//<br /><br />void NVIC_Config(void)<br />{<br />NVIC_InitTypeDef NVIC_InitStructure;<br /><br />NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;<br />NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;<br />NVIC_InitStructure.NVIC_IRQChannel = ENABLE;<br /><br />NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel1_IRQn;<br />NVIC_Init(&amp;NVIC_InitStructure);<br />}<br /><br /><br />void DMA1_Channel1_IRQHandler(void)<br />{<br />if(DMA_GetITStatus(DMA1_IT_TC1))<br />{<br />Send_Buffer&#91;60&#93;=FFT_buffer&#91;120&#93;;<br />GPIO_SetBits(GPIOE, GPIO_Pin_11); // sprawdzenie czy wystepuje przerwanie od dma1<br />DMA_ClearITPendingBit(DMA1_IT_GL1);<br />}<br />}[/syntax]<br /><br />P.S. <br />Sam ciągle to sprawdzam jednak może ktoś bardziej doświadczony po rzuceniu okiem na problem rozwieje wątpliwości w znacznie krótszym czasie.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3691">Forfiter</a> — 12 maja 2014, o 18:40</p><hr />
]]></content>
</entry>
</feed>