Luettavuuden vuoksi ja virheiden todennäköisyyden vähentämiseksi käytä makroja maagisten numeroiden sijaan.
stm32f30x.h sisältää makrot (toivottavasti) koko rekisterille arvot. Joten:
RCC->AHBENR | = ((1UL << 21)); // Ota GPIOE-kello käyttöön GPIOE->MODER | = (1 << 2 * 8); // PIN 9 lähdönä
voidaan kirjoittaa seuraavasti:
RCC->AHBENR | = RCC_AHBENR_GPIOEEN; // Ota GPIOE-kello käyttöön. GPIOE->MODER | = GPIO_MODER_MODER8_0; // PIN 8 - ei 9! - tuotoksena.
(Todellakin - alkuperäinen kommentti oli väärä tässä; makron käyttäminen tekee siitä selvemmän!)
Vastaavasti pin-vaihtokoodi voidaan kirjoittaa kuten:
GPIOE->BSRR = GPIO_BSRR_BS_8; Viive (50); GPIOE->BRR = GPIO_BRR_BR_8; Viive (50);
Menee pidemmälle, GPIO_MODER_MODER8_0
ei ole aivan selvää, joten minä saattaa lisätä oman makron:
#define GPIO_MODER_MODER8_OUT GPIO_MODER_MODER8_0
Se voi olla hieman väsyttävää, jos määrität paljon nastoja, joten voit tehdä:
#define GPIO_MODER_OUT (pin) ((((uint32_t) 1) << (2 * (pin)))
Lisäksi Yläpuolella olevalla rivillä oletetaan, että nämä MODER
-bittien bitit olivat jo 0x0 tai 0x1. Jos emme voi olettaa sitä, meidän on ensin tyhjennettävä ne:
GPIOE->MODER & = ~ GPIO_MODER_MODER8; GPIOE->MODER | = GPIO_MODER_OUT (8);
Myös:
Jos tiedoston yläosassa ilmoitettuja toimintoja ei käytetä missään muualla, ilmoita ne staattisiksi
. Tämä estää niitä käyttämästä vahingossa missään muussa tiedostossa.
Jos kääntäjä sallii, main
tulisi ilmoittaa void
-tekstinä, ei palauttaa int
, koska se ei koskaan palaa.
Tämä on todellinen nitpick: TimingDelay
on vain tavallinen numero; sitä ei käytetä, jos heksadesimaalinen esitys on sopiva. Joten kohdassa TimingDelay_Decrement
, jossa sitä verrataan nollaan, käytä 0
, ei 0x00
. Tämä tekee siitä myös johdonmukaisen vertailun kanssa Delay
.
Jos olen ymmärtänyt oikein, __IO
merkitsee muuttujan volatile
, ja epäilen, että sitä käytetään merkitsemään luettavia ja kirjoitettavia rekistereitä. TimingDelay
: n on todellakin oltava volatile
, koska se päivitetään keskeytyksessä - mutta olisin halukas käyttämään volatile
-tunnusta sijaan __IO
osoittaa, että se ei ole rekisteri.
nTime
ei tarvitse olla haihtuva
(tai __IO koodi>), koska se on vain normaali toimintoparametri, joka välitetään arvolla, joka luetaan kerran.