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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2017-01-24T21:08:45+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=46&amp;t=17430&amp;mode</id>
<entry>
<author><name><![CDATA[toch88]]></name></author>
<updated>2017-01-24T21:08:45+01:00</updated>
<published>2017-01-24T21:08:45+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17430&amp;p=180687#p180687</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17430&amp;p=180687#p180687"/>
<title type="html"><![CDATA[STM32F4 ADC+DM2 w trybie Injection wyzwalany Tim5]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17430&amp;p=180687#p180687"><![CDATA[
Cześć <br /><br />Problem polega na tym że ADC1 współgra z DMA2 w trybie Injection, czy to jest związane z tym że nie nie ma sensu czegoś takiego robić, ze względu na to że w tym trybie wszystkie dane trafiają do różnych rejestrów JDRx, i nie ma &quot;zagrożenia&quot; overrunem? <br /><br />Konfiguracja wygląda następująco ADC1 w trybie Injection, wyzwalany zewnętrznie przez sygnał TRGO Timera5. Ustawione zostały dwie konwersje. Co również dla mnie dziwne jeżeli ustawi się np. jedną konwersje to trzeba wpisać adres ADC_INx do JSQR4, ale skonwertowana wartość trafi do JDR1.<br /><br />[syntax=c]void GPIO_for_ADC(){<br />RCC-&gt;AHB1ENR |= RCC_AHB1ENR_GPIOCEN; //Wlacz zegar dla GPIOC <br />GPIOC-&gt;MODER |= GPIO_MODER_MODER1; //Ustaw PC1 jako Analog Input<br />GPIOC-&gt;MODER |= GPIO_MODER_MODER0; //Ustaw PC0 jako Analog Input<br />}<br /><br />void ADC1_Config(){<br />GPIO_for_ADC();<br />//Wlacz Zegar dla ADC1<br />RCC-&gt;APB2ENR |= RCC_APB2ENR_ADC1EN;<br />ADC-&gt;CCR |= (0x03ul &lt;&lt; 16); // Preskaler na 8<br />ADC1-&gt;JSQR|=(1&lt;&lt;20)|(11&lt;&lt;15)|(10&lt;&lt;10);//Dwie konwersje injected ADC1_10 PC0 oraz ADC1_11 PC1<br /><br />ADC1-&gt;CR1|=ADC_CR1_SCAN; <br />//Ustaw wyzwalanie na TIM5_TRGO<br />//Wlacz DMA<br />//Wlacz przetwornik<br />ADC1-&gt;CR2|= (11&lt;&lt;16)|ADC_CR2_DMA|ADC_CR2_ADON;<br />//for(volatile uint32_t delay = 100000; delay; delay--);<br />//Wlacz Tryb &quot;Incjection&quot;<br />ADC1-&gt;CR2|= ADC_CR2_JEXTEN;<br />}[/syntax]<br /><br />Jest o tym wzmianka w RM0383 na stronie 233 ADC_JSQR. (Co prawda nie jest powiedziane nic o tym gdzie przetworzone dane trafią).<br /><br />DMA2 ustawiony jest na adres JDR1, pamięć na mój bufor Rx. Transakcji 2, kierunek PERIPH-&gt;MEMO, wielkości po obu stronach takie same.<br />[syntax=c]void DMA2_Config(){<br />RCC-&gt;AHB1ENR |= RCC_AHB1ENR_DMA2EN; //wlacz zegar<br />DMA2_Stream0-&gt;M0AR = (uint32_t)Rx; //ustaw adres pamieci na Rx<br />DMA2_Stream0-&gt;PAR = (uint32_t)&amp;ADC1-&gt;JDR1;//ustaw adres peryferia na JDR1;<br />DMA2_Stream0-&gt;NDTR = 2; //dwie transkacje<br />//Ustaw wielkosc pamieci adresu docelowego na half word|ustaw wielkosc danych przesylanych ma Half word<br />//| Inkrementuj po stronie pamieci <br />//|wlacz Circular mode<br />//|wlacz Stream0 DMA<br />DMA2_Stream0-&gt;CR = DMA_SxCR_MSIZE_0 | DMA_SxCR_PSIZE_0 | DMA_SxCR_MINC | DMA_SxCR_CIRC |DMA_SxCR_EN; <br />}[/syntax]<br />Timer5 ustawiony w trybie up-down, <br /><br />[syntax=c]void GPIO_for_Timer5_CHN(){<br />//Konfiguracja GPIO_PA0 jako wyjscie TIM5 <br />RCC-&gt;AHB1ENR|=RCC_AHB1ENR_GPIOAEN; //Wlacz zegar dla PA<br />GPIOA-&gt;MODER|=GPIO_MODER_MODER0_1; //ustwa na wyjscie<br />GPIOA-&gt;OSPEEDR|=GPIO_OSPEEDER_OSPEEDR0; //ustaw na max <br />GPIOA-&gt;AFR&#91;0&#93;|=(2&lt;&lt;0); //TIM5 CH1 output<br />}<br /><br />void Timer5Config(){<br />GPIO_for_Timer5_CHN();<br />RCC-&gt;APB1ENR|=RCC_APB1ENR_TIM5EN;<br />TIM5-&gt;CCMR1|=TIM_CCMR1_OC1M; //PWM mode 2<br />TIM5-&gt;CCMR1|=TIM_CCMR1_OC1PE; //preloader wlaczony<br />TIM5-&gt;CCR1=1250; // polowa wypelnenia<br /><br />TIM5-&gt;ARR=2500; //wartosc do ktorej zlicza w góre i oraz odlicza w dól do 0 / <br />//czestotliwosc 10khz<br />TIM5-&gt;PSC=1; //timer prescaler =1 <br />TIM5-&gt;CR1|=TIM_CR1_CMS; //tryb up &amp; down<br />TIM5-&gt;DIER|=TIM_DIER_UIE; //wlacz oblsugie przerwan dla UPDATE INT. EVENT<br />TIM5-&gt;CCER|=TIM_CCER_CC1E; //ustaw kanal jako output <br />TIM5-&gt;CR2 |= TIM_CR2_MMS_1; //Update - TRGO<br />//TIM5-&gt;EGR|=TIM_EGR_UG; //Update Generaton<br />TIM5-&gt;CR1|=TIM_CR1_CEN; //wlacz zegar<br />}[/syntax]<br /><br />No i pętla główna:<br />[syntax=c]static volatile uint16_t Rx&#91;2&#93;;<br />int main(){<br />SetSysClock(); //Predkosc na maxa 100Mhz <br />StopTheClockInDebugMode(); <br />Timer5Config();<br />DMA2_Config();<br />ADC1_Config();<br />NVIC_EnableIRQ(TIM5_IRQn);<br /><br />while (1);<br />return 0;<br />}<br />void TIM5_IRQHandler(){<br />if(TIM5-&gt;SR &amp; TIM_SR_UIF){<br />TIM5-&gt;SR&amp;=~TIM_SR_UIF;<br />}<br />}[/syntax]<br /><br />W &quot;Watch1&quot; Rejstry ADC1-&gt;JDR1 praz JDR2 działają w pełnym zakresie przy ruchu Joystica. Niestety Rx[0] , Rx[1] pozostaje pusty.<br /><br />Proszę o jakieś wskazówki.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1138">toch88</a> — 24 sty 2017, o 21:08</p><hr />
]]></content>
</entry>
</feed>