STM32l1 proste zapalanie diod

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.

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; }
0

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

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ć.

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ść

1

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
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.

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).

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