Hallo, Ich versuche nun schon eine ganze Weile eine SoftPwm hinzubekommen auf einen veliebigen Portbin vom Stm32f103. Dazu hab ich den Timer1 Initialisiert der läuft auch, nur ist mein Problem die ganzen Hardware Pwm Pins sind schon anderweitig benutzt. Vielleicht könnte mir einer von ihnen weiterhelfen wie ich das nun mit der SoftPwm zum laufen bekomme. mfg
void TIM1_IRQHandler(void) { if ( TIM_GetITStatus(TIM1, TIM_IT_Update) != RESET ) { TIM_ClearITPendingBit(TIM1 , TIM_FLAG_Update); if(PWMcnt < led) GPIO_ResetBits(GPIO_LED, LED5) else GPIO_SetBits(GPIO_LED, LED5) if(PWMcnt =255) { PWMcnt = 0 } else { PWMcnt++; } } }
Falk B. schrieb: > Siehe Soft-PWM Das ist ja für AVR ich nutze ja den Stm32 kann mir jemand helfen was ich da verkehrt mache
Hier sind meine Einstellungen für die SoftPWM. Es Funktioniert soweit, aber wenn ich zb Daten über Uart(mit eigener isr) bekomme Flackert die Led. Kann mir da einer Weiterhelfen was ich hbier Falsch mache.
1 | vu8 PWM_cnt = 0; |
2 | vu8 Red = 50; |
3 | |
4 | NVIC_InitStructure.NVIC_IRQChannel = TIM5_IRQn; |
5 | NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; |
6 | NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; |
7 | NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; |
8 | NVIC_Init(&NVIC_InitStructure); |
9 | |
10 | void TIM5_Configuration(void) |
11 | {
|
12 | uint16_t TimerPeriod = 0; |
13 | |
14 | TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; |
15 | RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5 , ENABLE); |
16 | |
17 | TimerPeriod = (uint16_t) (SystemCoreClock / 1000000) - 1; |
18 | TIM_DeInit(TIM5); |
19 | TIM_TimeBaseStructure.TIM_Period=1000; |
20 | TIM_TimeBaseStructure.TIM_Prescaler= 0; |
21 | TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; |
22 | TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; |
23 | TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure); |
24 | TIM_ClearFlag(TIM5, TIM_FLAG_Update); |
25 | TIM_ITConfig(TIM5,TIM_IT_Update,ENABLE); |
26 | TIM_Cmd(TIM5, ENABLE); |
27 | }
|
28 | |
29 | |
30 | void TIM5_IRQHandler(void) |
31 | {
|
32 | if ( TIM_GetITStatus(TIM5 , TIM_IT_Update) != RESET ) |
33 | {
|
34 | TIM_ClearITPendingBit(TIM5 , TIM_FLAG_Update); |
35 | |
36 | if ((PWM_cnt <=Red) && (Red!=0)) |
37 | {
|
38 | GPIO_ResetBits(GPIO_LED, LED_5); |
39 | }
|
40 | else
|
41 | {
|
42 | GPIO_SetBits(GPIO_LED, LED_5); |
43 | }
|
44 | |
45 | if(PWM_cnt==255) { |
46 | PWM_cnt=0; |
47 | }
|
48 | else
|
49 | {
|
50 | PWM_cnt++; |
51 | }
|
52 | }
|
53 | }
|
> NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
Setze die mal auf 0 und die vom UART auf größer 0.
Kleinerer Wert bedeutet höhere Priorität.
Wenn die UART ISR die LED zum Flackern bringt, sind vermutlich nicht nur die Prioritäten falsch, sondern auch deine UART ISR zu lang. Magst du deine UART ISR mal posten?
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.