Citat:
Odin D.:
Jesi li mozda uporedio blinkin-led projekte za STM32VL i STM32F4 na Atollicu i spazio u ovom potonjem neke bitne razlike/elemente odvracajuce prirode?
STM32F4:
Code:
#include "stm32f4xx.h"
#include "stm32f4_discovery.h"
int main(void)
{
volatile int i = 0;
/* Initialize LEDs */
STM_EVAL_LEDInit(LED3);
STM_EVAL_LEDInit(LED4);
STM_EVAL_LEDInit(LED5);
STM_EVAL_LEDInit(LED6);
/* Turn on LEDs */
STM_EVAL_LEDOn(LED3);
STM_EVAL_LEDOn(LED4);
STM_EVAL_LEDOn(LED5);
STM_EVAL_LEDOn(LED6);
/* Infinite loop */
while (1)
{
STM_EVAL_LEDOn(LED3);
STM_EVAL_LEDOn(LED4);
STM_EVAL_LEDOn(LED5);
STM_EVAL_LEDOn(LED6);
for (i=0;i<1000000;i++);
STM_EVAL_LEDOff(LED3);
STM_EVAL_LEDOff(LED4);
STM_EVAL_LEDOff(LED5);
STM_EVAL_LEDOff(LED6);
for (i=0;i<1000000;i++);
}
}
void EVAL_AUDIO_TransferComplete_CallBack(uint32_t pBuffer, uint32_t Size){
/* TODO, implement your code here */
return;
}
uint16_t EVAL_AUDIO_GetSampleCallBack(void){
/* TODO, implement your code here */
return -1;
}
dakle kao sto vidis - jednostavnije ne moze :D, stm32f4_discovery.h dolazi sa atolic-om a koliko se secam moze da se svuce sa paketom primera sa st sajta takodje
za STM32L to izgleda malo drugacije:
Code:
#include <stddef.h>
#include "stm32l1xx.h"
#include "discover_board.h"
#include "stm32l_discovery_lcd.h"
#define MESSAGE5 " program built with "
#define MESSAGE6 " Atollic TrueSTUDIO "
USART_InitTypeDef USART_InitStructure;
void Init_GPIOs (void);
void RCC_Configuration(void);
static volatile uint32_t TimingDelay;
RCC_ClocksTypeDef RCC_Clocks;
void Config_Systick()
{
RCC_GetClocksFreq(&RCC_Clocks);
SysTick_Config(RCC_Clocks.HCLK_Frequency / 1000);
}
int main(void)
{
int i = 0;
RCC_Configuration();
/* Init I/O ports */
Init_GPIOs ();
/* Init Systick */
Config_Systick();
/* Initializes the LCD glass */
LCD_GLASS_Init();
LCD_GLASS_DisplayString((uint8_t*)"STM32L-DISCOVERY");
LCD_GLASS_ScrollSentence((uint8_t*)" ** Atollic TrueSTUDIO ** ",3,200);
/* Switch on the leds at start */
GPIO_HIGH(LD_PORT,LD_GREEN);
GPIO_HIGH(LD_PORT,LD_BLUE);
while (1)
{
i++;
/* Check if the User Button is pressed */
if ((GPIOA->IDR & USER_GPIO_PIN) != 0x0)
{
LCD_GLASS_DisplayString((uint8_t*)"BLUE ");
/* Toggle blue LED */
GPIO_TOGGLE(LD_PORT,LD_BLUE);
}
else
{
LCD_GLASS_DisplayString((uint8_t*)"GREEN ");
/* Toggle green LED */
GPIO_TOGGLE(LD_PORT,LD_GREEN);
}
}
return 0;
}
/*
* Minimal __assert_func used by the assert() macro
* */
void __assert_func(const char *file, int line, const char *func, const char *failedexpr)
{
while(1)
{}
}
/*
* Minimal __assert() uses __assert__func()
* */
void __assert(const char *file, int line, const char *failedexpr)
{
__assert_func (file, line, NULL, failedexpr);
}
void RCC_Configuration(void)
{
/* Enable the GPIOs Clock */
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA | RCC_AHBPeriph_GPIOB | RCC_AHBPeriph_GPIOC|
RCC_AHBPeriph_GPIOD| RCC_AHBPeriph_GPIOE| RCC_AHBPeriph_GPIOH, ENABLE);
/* Enable comparator clock */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_COMP | RCC_APB1Periph_LCD | RCC_APB1Periph_PWR,ENABLE);
/* Enable SYSCFG */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG , ENABLE);
/* Allow access to the RTC */
PWR_RTCAccessCmd(ENABLE);
/* Reset Backup Domain */
RCC_RTCResetCmd(ENABLE);
RCC_RTCResetCmd(DISABLE);
/*!< LSE Enable */
RCC_LSEConfig(RCC_LSE_ON);
/*!< Wait till LSE is ready */
while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET)
{}
/*!< LCD Clock Source Selection */
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);
}
void Init_GPIOs (void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/* Configure User Button pin as input */
GPIO_InitStructure.GPIO_Pin = USER_GPIO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(BUTTON_GPIO_PORT, &GPIO_InitStructure);
/* Configure the GPIO_LED pins LD3 & LD4*/
GPIO_InitStructure.GPIO_Pin = LD_GREEN|LD_BLUE;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(LD_PORT, &GPIO_InitStructure);
GPIO_LOW(LD_PORT,LD_GREEN);
GPIO_LOW(LD_PORT,LD_BLUE);
/* Configure Output for LCD */
/* Port A */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_8 | GPIO_Pin_9 |GPIO_Pin_10 |GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_Init( GPIOA, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource1,GPIO_AF_LCD) ;
GPIO_PinAFConfig(GPIOA, GPIO_PinSource2,GPIO_AF_LCD) ;
GPIO_PinAFConfig(GPIOA, GPIO_PinSource3,GPIO_AF_LCD) ;
GPIO_PinAFConfig(GPIOA, GPIO_PinSource8,GPIO_AF_LCD) ;
GPIO_PinAFConfig(GPIOA, GPIO_PinSource9,GPIO_AF_LCD) ;
GPIO_PinAFConfig(GPIOA, GPIO_PinSource10,GPIO_AF_LCD) ;
GPIO_PinAFConfig(GPIOA, GPIO_PinSource15,GPIO_AF_LCD) ;
/* Configure Output for LCD */
/* Port B */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_8 | GPIO_Pin_9 \
| GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_Init( GPIOB, &GPIO_InitStructure);
#ifdef USE_ALL_LCD_SEGMENTS
/**
* Note!
* PB3 is connected to C, M, COLON, and DP segments for the second digit on the LCD
* PB3 is also the SWO pin used for the Serial Wire Viewer (SWV)
* If PB3 is used by LCD then SWV will not work for the STM32L_DISCOVERY board
**/
GPIO_PinAFConfig(GPIOB, GPIO_PinSource3,GPIO_AF_LCD) ;
#endif
GPIO_PinAFConfig(GPIOB, GPIO_PinSource4,GPIO_AF_LCD) ;
GPIO_PinAFConfig(GPIOB, GPIO_PinSource5,GPIO_AF_LCD) ;
GPIO_PinAFConfig(GPIOB, GPIO_PinSource8,GPIO_AF_LCD) ;
GPIO_PinAFConfig(GPIOB, GPIO_PinSource9,GPIO_AF_LCD) ;
GPIO_PinAFConfig(GPIOB, GPIO_PinSource10,GPIO_AF_LCD) ;
GPIO_PinAFConfig(GPIOB, GPIO_PinSource11,GPIO_AF_LCD) ;
GPIO_PinAFConfig(GPIOB, GPIO_PinSource12,GPIO_AF_LCD) ;
GPIO_PinAFConfig(GPIOB, GPIO_PinSource13,GPIO_AF_LCD) ;
GPIO_PinAFConfig(GPIOB, GPIO_PinSource14,GPIO_AF_LCD) ;
GPIO_PinAFConfig(GPIOB, GPIO_PinSource15,GPIO_AF_LCD) ;
/* Configure Output for LCD */
/* Port C*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_6 \
| GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 |GPIO_Pin_11 ;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_Init( GPIOC, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOC, GPIO_PinSource0,GPIO_AF_LCD) ;
GPIO_PinAFConfig(GPIOC, GPIO_PinSource1,GPIO_AF_LCD) ;
GPIO_PinAFConfig(GPIOC, GPIO_PinSource2,GPIO_AF_LCD) ;
GPIO_PinAFConfig(GPIOC, GPIO_PinSource3,GPIO_AF_LCD) ;
GPIO_PinAFConfig(GPIOC, GPIO_PinSource6,GPIO_AF_LCD) ;
GPIO_PinAFConfig(GPIOC, GPIO_PinSource7,GPIO_AF_LCD) ;
GPIO_PinAFConfig(GPIOC, GPIO_PinSource8,GPIO_AF_LCD) ;
GPIO_PinAFConfig(GPIOC, GPIO_PinSource9,GPIO_AF_LCD) ;
GPIO_PinAFConfig(GPIOC, GPIO_PinSource10,GPIO_AF_LCD) ;
GPIO_PinAFConfig(GPIOC, GPIO_PinSource11,GPIO_AF_LCD) ;
}
void Delay(uint32_t nTime)
{
TimingDelay = nTime;
while(TimingDelay != 0);
}
void TimingDelay_Decrement(void)
{
if (TimingDelay != 0x00)
{
TimingDelay--;
}
}
Kao sto vidis nije znacajno drugaciji ... stm32l_discovery_lcd.h je isto tu doduse kao da se ne koristi posto se cela inicijalizacija radi direkt u kodu ( Init_GPIOs() ) no RCC je ono sto bi trebalo da je drugacije, a ovde vidis ceo RCC za L i nije nista posebno (isti je kao za F1 .. za F4 ga ne vidimo ali isti je takav) tako da nema neke filozofije izgleda oko low power modova .. e sad, pitanje je da li L ili F4, F4 ce biti podrzan od strane coocox-a uskoro, L nece, oba rade isto na atolic-u i generalno arm-gcc, obe plocke imaju stlink2, L verzija ima lcd dok F4 verzija ima dsp, akcelerometar, mikrofon, bese ima i temperaturni senzor ... mislim da je bolje da idemo sa F4, cena je ako se dobro secam ista kao za L ..
Elem, za VL (to je onaj prvi, naj-obicniji) .. kod izgleda isto ko za F4
Code:
#include <stddef.h>
#include "stm32f10x.h"
#include "STM32vldiscovery.h"
#define MESSAGE5 " program built with "
#define MESSAGE6 " Atollic TrueSTUDIO "
USART_InitTypeDef USART_InitStructure;
int main(void)
{
int i = 0;
STM32vldiscovery_LEDInit(LED3);
STM32vldiscovery_LEDInit(LED4);
STM32vldiscovery_PBInit(BUTTON_USER, BUTTON_MODE_GPIO);
STM32vldiscovery_LEDOff(LED3);
STM32vldiscovery_LEDOff(LED4);
while (1)
{
i++;
if(0 == STM32vldiscovery_PBGetState(BUTTON_USER))
{
/* Toggle LED3 */
STM32vldiscovery_LEDToggle(LED3);
/* Turn Off LED4 */
STM32vldiscovery_LEDOff(LED4);
}
else
{
/* Toggle LED4 */
STM32vldiscovery_LEDToggle(LED4);
/* Turn Off LED3 */
STM32vldiscovery_LEDOff(LED3);
}
}
}
/*
* Minimal __assert_func used by the assert() macro
* */
void __assert_func(const char *file, int line, const char *func, const char *failedexpr)
{
while(1)
{}
}
/*
* Minimal __assert() uses __assert__func()
* */
void __assert(const char *file, int line, const char *failedexpr)
{
__assert_func (file, line, NULL, failedexpr);
}
Dakle kao sto se da videti, VL vs F4 = kod izgleda isto :)