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?