STM32l1 proste zapalanie diod

Odpowiedz Nowy wątek
2014-11-26 17:29
0

posiadam płytkę stm32l152 discovery i pragnę a nawet muszę się nauczyć obsługi samego procesora a z pomocą płytki startowej zawsze jest łatwiej. Chciałem na początek pobawić się diodą LED3

 #include "stm32l1xx.h"
#include <stm32l1xx_gpio.h>
#include <stm32l1xx.h>
#include "misc.h"

#define LED1_ON        GPIO_ResetBits(GPIOB, GPIO_Pin_7)
#define LED1_OFF    GPIO_SetBits(GPIOB, GPIO_Pin_7)

//void Delay(volatile unsigned);

int main(void)
{

    while(1)
    {
            LED1_ON;
//          Delay(10000);
//          LED1_OFF;
//          Delay(10000);

    }
//}
//void Delay(volatile unsigned count) {
//while(count--);
}

kod niestety w żadnym wypadku nie działa.

edytowany 1x, ostatnio: dard, 2014-11-26 17:55

Pozostało 580 znaków

2014-11-26 17:47
1

OFF - wyłączenie
ON - włączenie
Lepiej użyj GPIO_ToggleBits()

int main() { for(;;Delay(300)) GPIO_ToggleBits(GPIOB,GPIO_Pin_7); return 0; }

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
edytowany 1x, ostatnio: _13th_Dragon, 2014-11-26 17:51

Pozostało 580 znaków

2014-11-26 17:51
0

tak wiem, poprawiłem, ale nic z tego mi nie zadziałało. i omyłkowo wysłałem kod z błędem

Pozostało 580 znaków

2014-11-26 17:58
2

Czego brakuje:

  1. Konfiguracji kwarcu/PLL ale nie jest to krytyczne, może lecieć na domyślnym.
  2. Włączenia zegara dla portów.
  3. Konfiguracji portów.

Po tych zabiegach ten kod ma prawo zadziałać.

Brakujące elementy mogą być w #include &quot;misc.h&quot; ale nie koniecznie - _13th_Dragon 2014-11-26 18:07
@_13th_Dragon, tak, o ile w startupie ma do zawartych tam funkcji BranchLink. :) Typowo tak się robi z PLLem i zegarem systemowym (system_STM32cośtam_cośtam.c). Ba. Init wszystkiego może być w startupie. I to nawet w asmie :P - alagner 2014-11-26 18:18

Pozostało 580 znaków

2014-11-26 18:29
0

wg tutoriala na YT kod działa i pali sie niebieska dioda

 #include "stm32l1xx.h"
#include <stm32l1xx_gpio.h>
#include <stm32l1xx.h>
#include "misc.h"

void Delay(volatile unsigned);

int main()
    {

        RCC->AHBENR |= (1<<19);     // włączenie zegara dla PORTU C
        GPIOB -> MODER |= (1<<16);  // ustawienie PORTUC PIN7 jako wyjscie
        GPIOB ->ODR |= (1<<6);      // GPIOC PIN& ON albo stan wysoki

        while(1)
        {

        }
    }

dalej nie świeci

zaznaczam moja pierwsza przygoda z tymże układem. proszę o wyrozumiałość

edytowany 2x, ostatnio: dard, 2014-11-26 18:31

Pozostało 580 znaków

2014-11-26 19:17

Używaj nazw "peryferialowych" dla bitów, one powinny być w headerze, np. RCC_AHBENR_cośtamcośtamEN.
A schemat pokazuje, że LEDy są na PB 6 i 7 a nie PC 6 i 7, chyba że o innych zestawach mówimy.

I podstawa - schematy+reference manual+errata sheet+core manual to Twoje źródła. Reszta to generalnie śmieci.

Imho trzeba zrobić +/-tak (mogę się mylić, bo a. na szybko to robię, b. nie wiesz sam jaki port chcesz ustawić):

        RCC->AHBENR |= RCC_AHBENR_GPIOBEN;       // włączenie zegara dla PORTU B
        GPIOB -> MODER |= GPIO_MODER_MODER7_0 ; //albo jakos podobnie. Chodzi o mlodszy bit
        GPIOB ->BSRR = GPIO_BSRR_BS7;         // GPIOC PIN& ON albo stan wysoki

Pozostało 580 znaków

2014-11-26 19:44
0

ogarnąłem temat na podstawie przykładu z coocox. Alagner, program nie ma zdefiniowanego BS7 i wywala błąd i masz rację, popełniłem błąd w opisie, są na porcie B. Będę się trzymał opcji przykładowej coocox'a. mam pytanie co do podłączania do płytki zewnętrznych elementów np (znów)diody, mam podpiętego led'a do PA3 i GND.

 #include "stm32l1xx.h"
#include "stm32l1xx_rcc.h"
#include "stm32l1xx_gpio.h"

#define LD_GREEN_GPIO_PIN       GPIO_Pin_7
#define LD_BLUE_GPIO_PIN        GPIO_Pin_6
#define LD_jakas                GPIO_Pin_3

void Delay(__IO uint32_t nCount);

int main(void) {
     GPIO_InitTypeDef GPIO_InitStructure;

    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);

    GPIO_InitStructure.GPIO_Pin = LD_GREEN_GPIO_PIN | LD_BLUE_GPIO_PIN | LD_jakas;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_40MHz;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_Init(GPIOB, &GPIO_InitStructure);
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    while (1) {
        GPIO_SetBits(GPIOB, LD_GREEN_GPIO_PIN | LD_BLUE_GPIO_PIN);
        Delay(50000);
        GPIO_ResetBits(GPIOB, LD_GREEN_GPIO_PIN | LD_BLUE_GPIO_PIN);
        Delay(50000);

        GPIO_SetBits(GPIOA, LD_jakas);

    }
}

void Delay(__IO uint32_t nCount) {
    while (nCount--) {
    }
}

#ifdef  USE_FULL_ASSERT

void assert_failed(uint8_t* file, uint32_t line)
{

    while (1)
    {
    }
}
#endif

led nie świeci. sądzę że dobrze zrozumiałem kod przykładowy.

Pozostało 580 znaków

2014-11-27 00:54
0

Zamiast GPIO_BSRR_BS7 spróbuj ew. GPIO_BSRR_BS_7, ST nie jest tu konsekwentny w nazewnictwie (BSx jest w F1, BS_x w F4, na L1 nie pracowałem nigdy, więc piszę na wyczucie bo nie mam liba pod ręką) . Ew. otwórz stm32l1xx.h i poszukaj ciągu GPIO_BSRR i wg tego działaj.

I olej te bibliotekę od ST, bo to dziadostwo jest :P

EDIT: tzn. dziadostwo w tym sensie, że nie warto z niej korzystać pisząc swój soft, a rozpisywanie prostego inita w struktury to - imho - pomyłka. Można natomiast podglądać w jakiej kolejności ustawiać rejestry przy co bardziej upierdliwych peryferialach (kto odpalał CAN w F7 wie o czym mówię <: )

I jeszcze jedna rzecz - poczytaj co to jest bitbanding, jak chcesz sterować jedną diodą/bitem to może to być o wiele lepsze wyjście od maskowania (aczkolwiek konkretnie do GPIO rejestr BSRR chyba sprawdzi się równie dobrze).

edytowany 1x, ostatnio: alagner, 2014-11-27 00:59

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0