Wątek przeniesiony 2018-11-07 16:06 z C/C++ przez Marooned.

STM32F411 - programowanie rejestrów.

Odpowiedz Nowy wątek
2018-07-19 22:30
0

Witam zacząłem się uczyć programowania STM32 i chciałem zamigać diodą korzystając z rejestrów.
Robiłem to z pomocą reference manuala. Płytka to STM32F411VET6 - Discovery.

Mam taki kod:

#include "stm32f4xx.h"

int main(void){

    RCC->APB1ENR |= RCC_AHB1ENR_GPIODEN;

    GPIOD->MODER |= GPIO_MODER_MODE15_0;

    GPIOD->OTYPER |= GPIO_OTYPER_OT15;

    GPIOD->OSPEEDR |= GPIO_OSPEEDR_OSPEED15_0;

    GPIOD->PUPDR &= ~GPIO_PUPDR_PUPDR15_0;

    while(1){
        uint32_t wait;
        GPIOD->ODR |= GPIO_ODR_OD15;
        for (wait = 0; wait < 1000000; wait++){}
        GPIOD->ODR &= ~GPIO_ODR_OD15;
        for (wait = 0; wait < 1000000; wait++){}
    }

}

Dodane pliki:

pliki.png

Ktoś mógłby mi wytłumaczyć co tu źle zrobiłem, że nie działa?

edytowany 10x, ostatnio: Raziel295, 2018-07-19 23:14
Obrazki dodajemy do załączników postów. Poprawiłem. - furious programming 2018-07-19 22:54

Pozostało 580 znaków

2018-07-19 22:59
0

Po pierwsze powinieneś sobie zdawać sprawę, że kompilator może ci usunąć te pętle for bo one nic nie robią (zasada "As If").
Po drugie "nie działa" nie wyjaśnia problemu. Pamiętaj, że liczba osób, który mają ten hardware jest dość ograniczona, więc musisz napisać coś więcej niż: "nie działa".

Szybkie googlowanie i czy to nie powinno to wyglądać bardziej tak:

HAL_GPIO_WritePin(GPIOD, GPIO_ODR_OD15, GPIO_PIN_SET);
HAL_Delay(1000);
HAL_GPIO_WritePin(GPIOD, GPIO_ODR_OD15, GPIO_PIN_RESET);
HAL_Delay(1000);

Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 2x, ostatnio: MarekR22, 2018-07-19 23:07

Pozostało 580 znaków

2018-07-19 23:15
0

Nie powinno tak wyglądać, ponieważ ja chciałem to zrobić bezpośrednio na rejestrach a nie na HAL'u.
Nie działa znaczy, że dioda nie miga.

edytowany 2x, ostatnio: Raziel295, 2018-07-19 23:16

Pozostało 580 znaków

2018-07-19 23:19
1

Marku, STM32 programowałem ostatnio 5 lat temu, ale ich biblioteka HAL (wtedy nazwana Standard Peripheral Library) była totalnie bezsensownie zrealizowana i wśród znających się lepiej na embedded uchodziła za antywzorzec.
Sądząc z wpadek na poziomie elementarnym:
https://community.st.com/thre[...]ynamic-memory-from-interrupts
to nadal obowiązuje.

@Raziel295 nie chce mi się teraz do noty patrzeć, ale zwróć uwagę, że piszesz RCC_AHB1ENR_GPIODEN do rejestru APB2ENR.
Na pewno tak?

EDIT: Marek oczywiście ma rację, że ta pętla może zostać wyoptymalizowana. Możesz zadeklarować jej zmienną sterującą jako volatile, to pomoże, ale oczywiście to zła praktyka i najlepiej będzie użyć jakiegoś timera.

EDIT2: spojrzałem do noty, GPIOD "wisi" na magistrali AHB, nie APB, więc tu pierwszy błąd.

edytowany 3x, ostatnio: alagner, 2018-07-19 23:25

Pozostało 580 znaków

2018-07-19 23:25
0

@alagner:
Niestety po poprawce wciąż nie działa.

edytowany 1x, ostatnio: Raziel295, 2018-07-19 23:26

Pozostało 580 znaków

2018-07-19 23:31
1

Nie pamiętam schematu tej płytki... GPIO ma być open-collector (jak u Ciebie) czy push-pull?
EDIT: i generalnie jaki jest objaw? Diodka świeci cały czas przygaszonym światłem?

EDIT2: jeżeli płytka to https://www.st.com/content/cc[...]ranslations/en.DM00039084.pdf
to wyjście powinno być push-pull, a masz iloczyn na drucie.

edytowany 2x, ostatnio: alagner, 2018-07-19 23:36

Pozostało 580 znaków

2018-07-19 23:37
0

Gdzie u mnie jest open-collector w PUPDR? Chciałem mieć push-pull, żeby migać diodą. Z tego co wiem to po resecie ta GPIO jest ustawione jako pływające więc trzeba chyba zresetować, żeby nie dodać do siebie tych bitów i nie wyszło coś zupełnie innego.

edytowany 1x, ostatnio: Raziel295, 2018-07-19 23:38

Pozostało 580 znaków

2018-07-19 23:39
GPIO port output type register (GPIOx_OTYPER) (x = A..E and H)

Bits15:0 OTy:Portxconfigurationbits(y=0..15)
These bits are written by software to configure the output type of the I/O port.
0: Output push-pull (reset state) 
1: Output open-drain
edytowany 2x, ostatnio: alagner, 2018-07-19 23:40

Pozostało 580 znaków

2018-07-19 23:40
0

Zrobiłem :D Zadziałało! Dzięki za pomoc :) Było open-collector zamiast push-pull :)

Pozostało 580 znaków

2018-07-19 23:41
1

A tak na zaś:
http://www.freddiechopin.info

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