Documente Academic
Documente Profesional
Documente Cultură
void main()
{
}
int b;
void main()
{
*(int *)0x40023830=0x09;
while(1)
{
b=*(int *)0x40020010;
}
}
Putem urmari evolutia variabilei b care arata starea registrului de date de intrare, dupa
lansarea Debug, cu o comanda View->Live Watch in care se introduce expresia b. Prin
rularea pas cu pas si actionarea asupra butonului albastru se va observa si actiunea asupra
variabilei b.
Asa cum s-a mai aratat, pentru evitarea cautarii si scrierii adreselor diverselor registre
implicate intr-un program, se poate folosi headerul "stm32f4xx.h" furnizat de
producatorul ST Microelectronics, precum si alte headere si programe sursa din directoarea
STM32F4-Discovery_FW_Vx.x.
In acest caz, programele sursa respective (cu extensia .c) se vor adauga in fereastra de
proiect iar in Project->Optoins->C/C++ compiler->Preprocessor se adauga caile necesare, ca
in exemplul din laboratorul precedent
Acestea exista deja daca s-a creat programul prin copierea subdirectoarei respective,
cu un alt nume si sunt:
C:\STM32F4-Discovery_FW_V1.1.0\Libraries\CMSIS\ST\STM32F4xx\Include
C:\STM32F4-Discovery_FW_V1.1.0\Libraries\STM32F4xx_StdPeriph_Driver\inc
C:\STM32F4-Discovery_FW_V1.1.0\Libraries\CMSIS\Include
#include "stm32f4xx.h"
int b;
void main()
{
RCC->AHB1ENR |=0x09;
while(1)
{
b=0x01&GPIOA->IDR;
}
}
Se observa ca pentru a elimina efectul bitilor portului A implicate in alte procese (ST-
Link), s-a facut un AND al registrului GPIOA->IDR cu cuvantul 0x01.
Prin rularea pas cu pas, se poate observa ca variabila b ia acum doar valorile 0 si 1.
De asemenea, variabila poate fi urmarita si dupa comanda Go, de rulare continua a
programului, daca este introdusa intr-o fereastra View-> Live Watch.
Aceasta variabila poate fi folosita de exemplu pentru comanda unui LED, cum ar fi cel
albastru, ceea ce necesita introducerea instructiunii GPIOD->MODER|=(1<<2*15);. O
varianta de implementare ar fi urmatoarea:
GPIOD->ODR=(b<<15);
Introducand aceste doua instructiuni in locurile potrivite se va observa prin rulare ca
LED-ul albastru copiaza starea butonului albastru. Atentie insa, ultima instructiune modifica
toti bitii portului GPIOD. Daca acest lucru nu trebuie sa se intample, este preferabila o
constructie ca in programul:
#include "stm32f4xx.h"
int b;
void main()
{
RCC->AHB1ENR |=0x09;
GPIOD->MODER|=1<<2*15;
GPIOD->OSPEEDR=(unsigned)(2<<2*15);
GPIOD->OTYPER=0<<2*15;
GPIOD->PUPDR=1<<2*15;
while(1)
{
b=0x01&GPIOA->IDR;
if (b==1)
GPIOD->ODR|=(1<<15);
else GPIOD->ODR&=(0<<15);
}
}
RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN|RCC_AHB1ENR_GPIOAEN;
GPIOD->MODER|= GPIO_MODER_MODER15_0;
#include "stm32f4xx.h"
int b;
int main()
{
//Validare clock GPIOA si GPIOD
RCC->AHB1ENR|=RCC_AHB1ENR_GPIOAEN|RCC_AHB1ENR_GPIODEN;
//Parametrii PD15 (PA0 este corect la Reset)
GPIOD->MODER|=GPIO_MODER_MODER15_0;//Iesire
GPIOD->OSPEEDR|=GPIO_OSPEEDER_OSPEEDR15;//High speed
GPIOD->OTYPER|=0<<15;
GPIOD->PUPDR|=GPIO_PUPDR_PUPDR15_0;//Pull-up
while(1)
{
b=GPIOA->IDR&GPIO_IDR_IDR_0;
GPIOD->ODR=~b<<15;//Stinge la apasare
}
}
Se observa ca nu s-au facut modificari in linia OTYPER deoarece nu exista o definitie
explicita pentru PushPull, aceasta fiind implicita la reset (ceea ce permite de fapt omiterea in
intregime a acestei linii in program). De asemenea, registrele sunt modificate prin operatori
compusi cu SAU |= pentru a nu se influenta decat bitii vizati, lasand neschimbati ceilalti biti.
Pentru extragerea lui PA0, s-a folosit definitia pinului respectiv cu care se face un SI. De
asemenea, pentru exemplificare, s-a facut inversarea lui b inainte de afisare, dar este de
remarcat ca modul in care se face scrierea in ODR aduce la 0 toti bitii acestuia cu exceptia
eventual a bitului 15.
Utilizarea extinsa a acestor definitii poate parea mai simpla sau nu decat calculul
constantelor hexazecimale, in functie de stilul programatorului, acesta urmand sa aleaga.
Ca urmare a celor aratate mai sus, programul care citeste starea butonului albastru
(PA0) si il copiaza in LED-ul albastru (PD15) realizat in mare masura cu functii API va arata
astfel:
#include "stm32f4xx.h"
int dt=1500000;
int b;
void wait(uint32_t nr)
{
uint32_t index=0;
while(index++<nr);
}
int main()
{
//Validare ceas periferice (se pot specifica mai multe cu SAU)
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD|RCC_AHB1Periph_GPIOA,ENABLE);
//Configurare PD15 ca iesire Push-Pull, cu rezistenta la Vdd
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Pin=(GPIO_Pin_15);
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_OUT;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_2MHz;
GPIO_InitStruct.GPIO_OType=GPIO_OType_PP;
GPIO_InitStruct.GPIO_PuPd=GPIO_PuPd_UP;
GPIO_Init(GPIOD, &GPIO_InitStruct);
In program s-a folosit o cale mixta de programare, atat cu functii API (initializari) cat si cu
registre (bucla while).
ATENTIE ! Daca se scrie ceva gresit in portul A, este posibil sa se blocheze ST-Link,
care utilizeaza acest port, astfel ca nu se mai poate scrie nimic in memoria Flash. In acest caz
se procedeaza in felul urmator:
1. Se deconecteaza cablul mini USB;
2. Se conecteaza un fir intre pinul BOOT0 (la mijlocul conectorului de pe dreapta) si
pinul 3V (al treilea de sus pe acelasi conector);
3. Se reconecteaza cablul mini USB;
4. Se deconecteaza firul dintre BOOT0 si 3V.
Unele dintre programele si headerele necesare ar putea fi copiate in directoarea de
lucru iar caile catre locatiile lor originale se pot inlocui in Preprocessor cu calea:
$PROJ_DIR$
Bineinteles, caile catre programele si headerele respective vor fi mai intai sterse din
proiect si apoi readaugate din directoarea curenta.
Desi procesul de constructie a structurilor API si a cailor incluse poate parea cronofag,
in realitate acest lucru trebuie facut pentru un periferic o singura data. La urmatoarele
programe se pot copia structurile de initializare si caile din preprocesor, sau se poate copia cu
totul directoarea unui proiect si apoi se poate modifica in aceasta copie programul pentru
obtinerea unuia nou. Avantajul utilizarii API este ca denumirile si parametrii functiilor sunt
sugestive, usor de citit, si pot fi selectate din meniul drop-down f(), cu posibitatea vizualizarii
imediate a prototipului.