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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2014-12-31T22:33:53+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=46&amp;t=9919&amp;mode</id>
<entry>
<author><name><![CDATA[Federerer]]></name></author>
<updated>2014-12-31T22:33:53+01:00</updated>
<published>2014-12-31T22:33:53+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=9919&amp;p=111543#p111543</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=9919&amp;p=111543#p111543"/>
<title type="html"><![CDATA[Re: [STM32F4] Konfiguracja 6StepTIM]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=9919&amp;p=111543#p111543"><![CDATA[
To tak w pigułce, całego mi się nie chce <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" />:<br />[syntax=c]TIM_TimeBaseStructure.TIM_Prescaler = 0;<br />TIM1-&gt;PSC = 0;<br />TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;<br />// TIM1-&gt;CR1 = TIM_CR1_DIR ustawiamy tylko gdy chcemy downcounter, zero jest domylne po resecie<br />TIM_TimeBaseStructure.TIM_Period = 4095;<br />TIM1-&gt;ARR = 4095;<br />TIM_TimeBaseStructure.TIM_ClockDivision = 0;<br />// Tu też zostają zera, w razie czego korzystamy z definicji bitów CDK&#91;1:0&#93; w rejestrze CR1 - TIM_CR1_CKD_0 i TIM_CR1_CKD_1<br />// np tak: TIM1-&gt;CR1 |= TIM_CR1_CKD_1; ustawi  tDTS = 4*tCK_INT- patrz obrazek i reference manual<br />TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;<br />// TIM1-&gt;RCR = 0; też można olac bo to wartosc domyslna.[/syntax]<br /><a href="http://forum.atnel.pl/_obrazki/o/4440/10aeb56a2db32acb908111189d43c623.PNG"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/4440/10aeb56a2db32acb908111189d43c623.PNG" alt="Obrazek" /></a><br />Reszta jest w manualu procesora. Jeśli chcesz zmieniać tylko wartości output compare dla pozostałych kanałów to możesz użyć poprostu przypisania odpowiedniej wartości:<br />[syntax=c]TIM1-&gt;CCR1 = 2047;<br />TIM1-&gt;CCR2 = 1024;<br />TIM1-&gt;CCR3 = 511;[/syntax]<br /><br />Do migania diodami na płytce discovery napisałem kiedyś taki kod:<br /><br />main.c<br />[syntax=c]#include &lt;stm32f4xx.h&gt;<br />#include &quot;soft_timer.h&quot;<br /><br />#define BITS 12<br /><br /><br />#define MAX 0xFFFFFFFF<br />#define SHIFT (32-BITS)<br /><br /><br />volatile uint32_t delay;<br /><br />void SysTick_Handler(void);<br />void timer1_tick(void);<br />void timer2_tick(void);<br />void timer3_tick(void);<br />void timer4_tick(void);<br />void timer5_tick(void);<br />void timer6_tick(void);<br />void Tim4Init(void);<br /><br />softtimer_t timer1, timer2, timer3, timer4, timer5, timer6;<br />uint32_t pwm&#91;4&#93;;<br />uint8_t on_off&#91;4&#93;, idx, dim, key_lock;<br /><br /><br />int main(void) {<br /><br />register_timer(&amp;timer1, 333, timer1_tick);<br />register_timer(&amp;timer2, 700, timer2_tick);<br />register_timer(&amp;timer3, 500, timer3_tick);<br />register_timer(&amp;timer4, 1100, timer4_tick);<br />register_timer(&amp;timer5, 5, timer5_tick);<br />register_timer(&amp;timer6, 10, timer6_tick);<br /><br />enable_timers();<br /><br /><br />RCC-&gt;AHB1ENR |= RCC_AHB1ENR_GPIOAEN; // zegar dla portu a<br />GPIOA-&gt;PUPDR = GPIO_PUPDR_PUPDR0_1; // pullup dla pinu A0<br />Tim4Init();<br /><br />    while(1) {<br /><br />    }<br />}<br /><br /><br /><br />void SysTick_Handler(void) {<br /><br />  timer_event();<br /><br />}<br /><br />void timer1_tick(void) {<br /><br />on_off&#91;0&#93; ^= 1;<br /><br />}<br /><br />void timer2_tick(void) {<br /><br />on_off&#91;1&#93; ^= 1;<br /><br />}<br /><br />void timer3_tick(void) {<br /><br />on_off&#91;2&#93; ^= 1;<br /><br />}<br /><br />void timer4_tick(void) {<br /><br />on_off&#91;3&#93; ^= 1;<br /><br />}<br /><br />void timer5_tick(void) {<br /><br />for(idx=0; idx&lt;4; idx++) {<br /><br />if (on_off&#91;idx&#93;) {<br /><br />pwm&#91;idx&#93; += (MAX - pwm&#91;idx&#93;) / 12;// szybkoć rozpalania diody<br /><br />}<br /><br />else {<br /><br />pwm&#91;idx&#93; -= pwm&#91;idx&#93; / 12;// szybkoć wygasania diody<br /><br />}<br /><br />}<br /><br />if(!dim) {<br /><br />TIM4-&gt;CCR1 = (MAX &gt;&gt; SHIFT) * on_off&#91;0&#93;;<br />TIM4-&gt;CCR2 = (MAX &gt;&gt; SHIFT) * on_off&#91;1&#93;;<br />TIM4-&gt;CCR3 = (MAX &gt;&gt; SHIFT) * on_off&#91;2&#93;;<br />TIM4-&gt;CCR4 = (MAX &gt;&gt; SHIFT) * on_off&#91;3&#93;;<br /><br />}<br />else {<br /><br /><br />TIM4-&gt;CCR1 = pwm&#91;0&#93; &gt;&gt; SHIFT;<br />TIM4-&gt;CCR2 = pwm&#91;1&#93; &gt;&gt; SHIFT;<br />TIM4-&gt;CCR3 = pwm&#91;2&#93; &gt;&gt; SHIFT;<br />TIM4-&gt;CCR4 = pwm&#91;3&#93; &gt;&gt; SHIFT;<br /><br />}<br /><br /><br />}<br /><br />void timer6_tick(void) {<br /><br />if((GPIOA-&gt;IDR &amp; (1&lt;&lt;0)) &amp;&amp; !key_lock) {<br /><br />key_lock = 1;<br />dim ^= 1;<br /><br />}<br /><br />else if(!(GPIOA-&gt;IDR &amp; (1&lt;&lt;0)) &amp;&amp; key_lock) {<br /><br />key_lock = 0;<br /><br />}<br /><br />}<br /><br />void Tim4Init(void) {<br /><br />RCC-&gt;APB1ENR |= RCC_APB1ENR_TIM4EN;//zegar dla tim4<br />RCC-&gt;AHB1ENR|=RCC_AHB1ENR_GPIODEN;<br /><br />GPIOD-&gt;MODER |=  (GPIO_MODER_MODER12_1) | (GPIO_MODER_MODER13_1) | (GPIO_MODER_MODER14_1) | (GPIO_MODER_MODER15_1);<br /><br />GPIOD-&gt;AFR&#91;1&#93; = 0x22220000;// AF2 - funkcje alternatywne dla pinów 13 14 15 i 16 - patrz tabelka datasheet<br />//AFR&#91;0&#93; - piny 0 do 7 AFR&#91;1&#93; - piny 8 do 15<br />TIM4-&gt;PSC = 0;<br />TIM4-&gt;ARR = MAX &gt;&gt; SHIFT;// max wartosc pwm 16 bit<br /><br />TIM4-&gt;CCMR1 |= TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1PE<br />    | TIM_CCMR1_OC2M_1 | TIM_CCMR1_OC2M_2 | TIM_CCMR1_OC2PE;<br /><br />TIM4-&gt;CCMR2 |= TIM_CCMR2_OC3M_1 | TIM_CCMR2_OC3M_2 | TIM_CCMR2_OC3PE<br /> | TIM_CCMR2_OC4M_1 | TIM_CCMR2_OC4M_2 | TIM_CCMR2_OC4PE;<br /><br />TIM4-&gt;CCER |= TIM_CCER_CC1E | TIM_CCER_CC2E | TIM_CCER_CC3E | TIM_CCER_CC4E; // compare output enable<br /><br />TIM4-&gt;CR1 |= TIM_CR1_CEN; // counter enable<br />TIM4-&gt;EGR |= TIM_EGR_UG; //update generation<br /><br /><br />}[/syntax]<br /><br />soft_timer.h<br />[syntax=c]/*<br /> * soft_timer.h<br /> *<br /> *  Created on: 19-07-2014<br /> *      Author: Federerer<br /> */<br /><br />#ifndef SOFT_TIMER_H_<br />#define SOFT_TIMER_H_<br /><br />#ifdef __cplusplus<br />extern &quot;C&quot; {<br />#endif<br /><br />#define TIMERS_COUNT 5<br /><br />typedef struct {<br /><br />uint16_t interval;<br />uint16_t time;<br />void (*wsk)(void);<br /><br />} softtimer_t;<br /><br />extern uint8_t tick;<br />extern softtimer_t * wskazniki&#91;&#93;;<br />extern uint8_t timer_n;<br /><br />void enable_timers(void);<br /><br />void register_timer ( softtimer_t * timer, uint16_t interval, void (*wsk)(void) );<br /><br />void timer_event(void);<br /><br />#ifdef __cplusplus<br />}<br />#endif<br /><br />#endif /* SOFT_TIMER_H_ */[/syntax]<br /><br />soft_timer.c<br />[syntax=c]#include &lt;stm32f4xx.h&gt;<br />#include &lt;stdint.h&gt;<br />#include &quot;soft_timer.h&quot;<br /><br /><br />softtimer_t *wskazniki&#91;TIMERS_COUNT&#93;;<br />uint8_t timer_n;<br /><br />void enable_timers(void)  {<br /><br />SysTick_Config(SystemCoreClock/1000);<br /><br />}<br /><br />void register_timer ( softtimer_t * timer, uint16_t interval, void (*wsk)(void) ) {<br /><br />timer-&gt;interval = interval;<br />timer-&gt;time = interval;<br />timer-&gt;wsk = wsk;<br />wskazniki&#91;timer_n&#93; = timer;<br />timer_n++;<br /><br />}<br /><br />void timer_event(void) {<br /><br />for(uint8_t i=0; i &lt; timer_n; i++) {<br /><br />wskazniki&#91;i&#93;-&gt;time--;<br /><br />if(!(wskazniki&#91;i&#93;-&gt;time)) {<br /><br />wskazniki&#91;i&#93;-&gt;time = wskazniki&#91;i&#93;-&gt;interval;<br />if(wskazniki&#91;i&#93;-&gt;wsk) wskazniki&#91;i&#93;-&gt;wsk();<br /><br />}<br /><br />}<br /><br />}[/syntax]<br /><br />Mam nadzieję, że coś się przyda <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=4440">Federerer</a> — 31 gru 2014, o 22:33</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[karol901]]></name></author>
<updated>2014-12-31T19:12:27+01:00</updated>
<published>2014-12-31T19:12:27+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=9919&amp;p=111514#p111514</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=9919&amp;p=111514#p111514"/>
<title type="html"><![CDATA[Re: [STM32F4] Konfiguracja 6StepTIM]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=9919&amp;p=111514#p111514"><![CDATA[
Na pewno by się przydało.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1374">karol901</a> — 31 gru 2014, o 19:12</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Federerer]]></name></author>
<updated>2014-12-31T18:51:23+01:00</updated>
<published>2014-12-31T18:51:23+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=9919&amp;p=111510#p111510</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=9919&amp;p=111510#p111510"/>
<title type="html"><![CDATA[Re: [STM32F4] Konfiguracja 6StepTIM]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=9919&amp;p=111510#p111510"><![CDATA[
Jeśli kolega zainteresowany to mogę napisać instrukcję jak odpalić PWM bez bibliotek.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=4440">Federerer</a> — 31 gru 2014, o 18:51</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[karol901]]></name></author>
<updated>2014-12-29T19:43:29+01:00</updated>
<published>2014-12-29T19:43:29+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=9919&amp;p=111127#p111127</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=9919&amp;p=111127#p111127"/>
<title type="html"><![CDATA[[STM32F4] Konfiguracja 6StepTIM]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=9919&amp;p=111127#p111127"><![CDATA[
Witam, mam pytanie dotyczące konfiguracji timera w tryb PWM.<br />W starej bibliotece wyglądało to w ten sposób<br />[syntax=c]/* Time Base configuration */<br />  TIM_TimeBaseStructure.TIM_Prescaler = 0;<br />  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;<br />  TIM_TimeBaseStructure.TIM_Period = 4095;<br />  TIM_TimeBaseStructure.TIM_ClockDivision = 0;<br />  TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;<br /><br />  TIM_TimeBaseInit(TIM1, &amp;TIM_TimeBaseStructure);<br /><br />  /* Channel 1, 2,3 and 4 Configuration in PWM mode */<br />  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Timing;<br />  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;<br />  TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;<br />  TIM_OCInitStructure.TIM_Pulse = 2047;<br />  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;<br />  TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;<br />  TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;<br />  TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Set;<br /><br />  TIM_OC1Init(TIM1, &amp;TIM_OCInitStructure);<br /><br />  TIM_OCInitStructure.TIM_Pulse = 1023;<br />  TIM_OC2Init(TIM1, &amp;TIM_OCInitStructure);<br /><br />  TIM_OCInitStructure.TIM_Pulse = 511;<br />  TIM_OC3Init(TIM1, &amp;TIM_OCInitStructure);<br /><br />  /* Automatic Output enable, Break, dead time and lock configuration*/<br />  TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable;<br />  TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable;<br />  TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_OFF;<br />  TIM_BDTRInitStructure.TIM_DeadTime = 1;<br />  TIM_BDTRInitStructure.TIM_Break = TIM_Break_Enable;<br />  TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_High;<br />  TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable;<br /><br />  TIM_BDTRConfig(TIM1, &amp;TIM_BDTRInitStructure);<br /><br />  TIM_CCPreloadControl(TIM1, ENABLE);<br /><br />  TIM_ITConfig(TIM1, TIM_IT_COM, ENABLE);<br /><br />  /* TIM1 counter enable */<br />  TIM_Cmd(TIM1, ENABLE);<br /><br />  /* Main Output Enable */<br />  TIM_CtrlPWMOutputs(TIM1, ENABLE);[/syntax]<br /><br /><br />W bibliotece z dopiskiem HAL są nieco inne funkcje i nie bardzo wiem jak poprawnie skonfigurować. Zatrzymałem się w tej chwili na konfiguracji kolejnego kanału. Teraz jest dostępna tylko jedna funkcja a nie tak jak wcześniej TIM_OC1Init, TIM_OC2Init, TIM_OC3Init.<br /><br />[syntax=c]TIM_TimeBaseStructure.Prescaler = 0;<br />  TIM_TimeBaseStructure.CounterMode = TIM_COUNTERMODE_UP;<br />  TIM_TimeBaseStructure.Period = 4095;<br />  TIM_TimeBaseStructure.ClockDivision   = 0;<br />  TIM_TimeBaseStructure.RepetitionCounter = 0;<br /><br />  HAL_TIM_Base_Init( &amp;TIM_TimeBaseStructure );<br />  <br />  TIM_OCInitStructure.OCMode         = TIM_OCMODE_TIMING;<br />  TIM_OCInitStructure.OCIdleState = TIM_OCIDLESTATE_SET;//TIM_OUTPUTSTATE_ENABLE;<br />  TIM_OCInitStructure.OCNIdleState= TIM_OCIDLESTATE_SET;//TIM_OUTPUTNSTATE_ENABLE;<br />  TIM_OCInitStructure.Pulse= 2047;<br />  TIM_OCInitStructure.OCPolarity = TIM_OCPOLARITY_HIGH;<br />  TIM_OCInitStructure.OCNPolarity= TIM_OCPOLARITY_LOW;<br />  HAL_TIM_OC_Init( &amp;TIM_OCInitStructure );<br />  <br />  TIM_OCInitStructure.Pulse= 1023;<br />  HAL_TIM_OC_Init()[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1374">karol901</a> — 29 gru 2014, o 19:43</p><hr />
]]></content>
</entry>
</feed>