[ GORSHTAK @ 06.01.2016. 16:00 ] @
Zdravo svima,

dobio sam da radim sa stm32f415 mikrokontrolerom (iskustvo 0).

Nesto sam uspeo da isprogramiram u sledecim okruzenjima, Keil i IAR, (ali nisam postigao da rade isto).
Medjutim, posto su ova dva okruzenja komercijalna, voleo bih da radim na nekom besplatnom okruzenju (npr https://launchpad.net/gcc-arm-embedded)

Takodje sam skinuo eclipse plug-in http://gnuarmeclipse.github.io/

ono sto za pocetak pokusavam je obicno paljenje lampica. Lampice su na sledecim portovima: c12, c13 (STAT i DATA) i a14 (eksterno povezana na pin u-kontrolera)
u keil sam aktivirao c12 i c13, ali ne i a14 (dobio gotov primer)
u IAR sam aktivirao samo a14 (postoji primer u okviru FreeRTOS-a)
u eklipsi nijedan (koristio sam templejt projekat i rekonfigurisao gde mi se nalazi LED)
jos jedna varijanta sa kojom sam tek krenuo da eksperimentisem je codebench lite, ali bih radije da ovo izbegnem


Da li je neko uspeo da koristi https://launchpad.net/gcc-arm-embedded u programiranju stm32?
Jel imate neki savet gde da pogledam kako se pravilno inicijalizuju periferije, ili da mi posaljete gotov primer

Trenutno nemam nijedan primer da prilozim...
[ ZAS011 @ 06.01.2016. 17:40 ] @
www.coocox.org/
[ bogdan.kecman @ 06.01.2016. 19:25 ] @
attolic true studio ti je trenutno najbolje free okruzenje koje postoji
za arm
[ GORSHTAK @ 08.01.2016. 21:19 ] @
CoIDE je veoma nestabilan, guta resurse, pada, a i u trenutku kada je radio, imao sam konfliktre tokom kompajla, nesto ne radi lepo sa repozitorijumom...

Attolic generalno nije los, a primetio sam da nema release konfiguraciju, samo debug.
A primetio sam razliku u elementima strukture GPIO_TypeDef, jer sadrzi short elemente BSRRL i BSRRH, dok je u drugim okruzenjima int BSRR (nije strasno, ali moze napraviti zbrku tokom migracije na neko drugo okruzenje)

U oba slucaja nisam uspeo da nateram lampice da blinkaju...

Ploca na kojoj radim je bazirana na ovom uC http://www.mikroe.com/mini/stm32/
Na ploci ne postoji taster, i samo je jedna lampica na A14 portu.

Sad primeri kodova:

Keil:
Code (c):

void delay(int value) {
     int i = value*10000;
     while(i>0) {i--;}
}

void blinky (void const *argumnt) {
     while( 1 ) {
          GPIOC->BSRR = GPIO_BSRR_BS_13;
          GPIOC->BSRR = GPIO_BSRR_BS_12;
          delay(500);

          GPIOC->BSRR = GPIO_BSRR_BR_13;         
          delay(500);
         
         
          GPIOC->BSRR = GPIO_BSRR_BR_12;
          delay(500);
          GPIOC->BSRR = GPIO_BSRR_BS_13;
          delay(500);
          GPIOC->BSRR = GPIO_BSRR_BS_12;
          delay(500);
          GPIOC->BSRR = GPIO_BSRR_BR_13;         
          delay(500);
          GPIOC->BSRR = GPIO_BSRR_BS_13;
          delay(500);
          GPIOC->BSRR = GPIO_BSRR_BR_13;     
          GPIOC->BSRR = GPIO_BSRR_BR_12;     
          delay(500);
     //   */
     
     //   /*   lampica koja se ne pali
          GPIOA->BSRR = GPIO_BSRR_BS_14;
          delay(500);
          //osDelay(200);
          GPIOA->BSRR = GPIO_BSRR_BR_14;
          delay(500);
          //osDelay(500);
          GPIOA->BSRR = GPIO_BSRR_BS_14;
          delay(500);
          //osDelay(200);
          GPIOA->BSRR = GPIO_BSRR_BR_14;
          delay(500);

//        */
     }
}

/*
 * main: initialize and start the system
 */

int main (void) {
     // initialize peripherals here
     RCC->AHB1ENR = (RCC_AHB1ENR_GPIOCEN | RCC_AHB1ENR_GPIOAEN);
//   RCC->AHB1ENR |= (RCC_AHB1ENR_GPIOAEN);
//   /* // inicijalizacija C12 i C13
     GPIOC->MODER |= (GPIO_MODER_MODER12_0 | GPIO_MODER_MODER13_0);
     GPIOC->OTYPER &= ~(GPIO_OTYPER_OT_12 | GPIO_OTYPER_OT_13);
     GPIOC->OSPEEDR |= (GPIO_OSPEEDER_OSPEEDR12 | GPIO_OSPEEDER_OSPEEDR13);
     GPIOC->PUPDR &= ~(GPIO_PUPDR_PUPDR12 | GPIO_PUPDR_PUPDR13);
     
//   */  // inicijalizacija A14
     GPIOA->MODER |= (GPIO_MODER_MODER14_0 );
     GPIOA->OTYPER &= ~(GPIO_OTYPER_OT_14);
     GPIOA->OSPEEDR |= (GPIO_OSPEEDER_OSPEEDR14 );
     GPIOA->PUPDR &= ~(GPIO_PUPDR_PUPDR14 );
     
     blinky(0);
 
}
 


Ovaj kod pali samo C12 i C13 LED, a ne i A14. Da li neko primecuje, da li sam izostavio nesto tokom inicijalizacije?

--------------------------------
Za Attolic

Code (c):



//  stm32_discovery.h

#define LEDn                             3

#define LED4_PIN                         GPIO_Pin_12
#define LED4_GPIO_PORT                   GPIOC
#define LED4_GPIO_CLK                    RCC_AHB1Periph_GPIOC
 
#define LED3_PIN                         GPIO_Pin_13
#define LED3_GPIO_PORT                   GPIOC
#define LED3_GPIO_CLK                    RCC_AHB1Periph_GPIOC
 
#define LED5_PIN                         GPIO_Pin_14
#define LED5_GPIO_PORT                   GPIOA
#define LED5_GPIO_CLK                    RCC_AHB1Periph_GPIOA

void STM_EVAL_LEDInit(Led_TypeDef Led)
{
  GPIO_InitTypeDef  GPIO_InitStructure;
 
  /* Enable the GPIO_LED Clock */
  RCC_AHB1PeriphClockCmd(GPIO_CLK[Led], ENABLE);

  /* Configure the GPIO_LED pin */
  GPIO_InitStructure.GPIO_Pin = GPIO_PIN[Led];
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIO_PORT[Led], &GPIO_InitStructure);
}

void STM_EVAL_LEDOn(Led_TypeDef Led)
{
  GPIO_PORT[Led]->BSRRL = GPIO_PIN[Led];
}

void STM_EVAL_LEDOff(Led_TypeDef Led)
{
  GPIO_PORT[Led]->BSRRH = GPIO_PIN[Led];  
}


void STM_EVAL_LEDToggle(Led_TypeDef Led)
{
  GPIO_PORT[Led]->ODR ^= GPIO_PIN[Led];
}

/////////// main.c
void delay(int value) {
     int i = value*10000;
     while(i>0) {i--;}
}

int main(void)
{
  RCC_ClocksTypeDef RCC_Clocks;
 
  /* Initialize LEDs and User_Button on STM32F4-Discovery --------------------*/
//  STM_EVAL_PBInit(BUTTON_USER, BUTTON_MODE_EXTI);
 
  STM_EVAL_LEDInit(LED4);
  STM_EVAL_LEDInit(LED3);
  STM_EVAL_LEDInit(LED5);
 // STM_EVAL_LEDInit(LED6);
 
  delay(500);
  /* SysTick end of count event each 10ms */
  RCC_GetClocksFreq(&RCC_Clocks);
  SysTick_Config(RCC_Clocks.HCLK_Frequency / 100);
 
  STM_EVAL_LEDToggle(LED4);
     delay(10);
     /* Toggle LED4 */
     STM_EVAL_LEDToggle(LED3);
     delay(10);
     /* Toggle LED4 */
     STM_EVAL_LEDToggle(LED5);
     delay(10);

while(1) {
    /* Turn on LEDs available on STM32F4-Discovery ---------------------------*/
    STM_EVAL_LEDOn(LED4);
    STM_EVAL_LEDOn(LED3);
    STM_EVAL_LEDOn(LED5);
  //  STM_EVAL_LEDOn(LED6);

    delay(500);
    STM_EVAL_LEDToggle(LED4);
    STM_EVAL_LEDToggle(LED3);
    STM_EVAL_LEDToggle(LED5);
    delay(100);

      /* Turn off LEDs available on STM32F4-Discovery ------------------------*/
      STM_EVAL_LEDOff(LED4);
      STM_EVAL_LEDOff(LED3);
      STM_EVAL_LEDOff(LED5);
   //   STM_EVAL_LEDOff(LED6);
      delay(500);
      STM_EVAL_LEDToggle(LED4);
          STM_EVAL_LEDToggle(LED3);
          STM_EVAL_LEDToggle(LED5);
          delay(100);
}

}

 


main sam modifikovao, jer je originalni primer pravljen za diskovery plocu, koja ima i taster, ali svakako ne pali lampice.
i zna li neko cemu sluzi toggle u ovom primeru?
[ goran_68 @ 08.01.2016. 22:54 ] @
Taj pin PA14 je istovremeno i SWCLK. Možda treba da se isključi SWD da bi taj pin koristio kao output pin. Možeš li da staviš LED na neki drugi pin porta A pa onda probaš?
[ GORSHTAK @ 09.01.2016. 01:02 ] @
Na zalost, ne. Elektronicar je tako zalemio....
Inace, u IAR-u uspevam da upalim pin (FreeRTOS templejt), ali je previse zamrsen kod, i ne radi mi u IAR-u "Go to definition" opcija, pa mi je tesko da ispratim.
[ motor @ 16.01.2016. 20:54 ] @
Program za paljenje LED dioda za tvoj MCU je slijedeći:

Konfiguracija takta MCU-a,neka je naprimjer 64Mhz:
Code:


void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct;
  RCC_ClkInitTypeDef RCC_ClkInitStruct;

  __PWR_CLK_ENABLE();

  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);

  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.HSICalibrationValue = 16;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
  RCC_OscInitStruct.PLL.PLLM = 16;
  RCC_OscInitStruct.PLL.PLLN = 128;
  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
  RCC_OscInitStruct.PLL.PLLQ = 4;
  HAL_RCC_OscConfig(&RCC_OscInitStruct);

  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
  HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2);
}


Konfiguracija pina na kojima su prikljucene tri LED diode:
Code:


void MX_GPIO_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStruct;

  /* GPIO Port Clock Enable */
  __GPIOC_CLK_ENABLE();
  __GPIOA_CLK_ENABLE();

  /*Configure GPIO pins : PC13 PC12 */
  GPIO_InitStruct.Pin = GPIO_PIN_13|GPIO_PIN_12;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_LOW;
  HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

  /*Configure GPIO pin : PA14 */
  GPIO_InitStruct.Pin = GPIO_PIN_14;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_LOW;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}


Glavni program:

Code:


#include "stm32f4xx_hal.h"
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
int main(void)
{
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();

  while (1)
  {
   HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_12);
   HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13)
   HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_14)
   HAL_Delay(500);
  }

}




[ GORSHTAK @ 14.02.2016. 01:09 ] @
Bio sam malo odsutan :)
U medjuvremenu sam saznao za aplikaiju koja generise kod za doticni MCU, STM32CubeMX.
Sa tim sam dosta uradio. Naravno, imam jos puno toga da provaljujem, ali drugom prilikom o tome....