Skip to content
blahlt edited this page Apr 17, 2015 · 12 revisions

STM32F103C8T6

Turinys

0. [Bendra informacija](#1-bendra-informacija) 0. [Aplinkos paruošimas](#2-aplinkos-paruo%C5%A1imas) 0. [Bendrosios paskirties įvestis ir išvestis](#3-bendrosios-paskirties-%C4%AFvestis-ir-i%C5%A1vestis-angl-general-purpose-inputoutput-gpio)

1. Bendra informacija

Model STM32F103C8T6
Core ARM 32 Cortex-M3 CPU
Debug mode SWD
Max. frequency 72MHz
Flash memory 64K
SRAM 20K
Power, I/O 2.0-3.6V
Size 53.34mm x 22.86mm

Įkrovos konfigūraciją nustato BOOT0 ir BOOT1 lygis

BOOT1(PB2) BOOT0(BOOT0) Boot mode
X 0 User Flash memory
0 1 System memory (bootloader)
1 1 Embedded SRAM

2. Aplinkos paruošimas

  1. Sudiegiam GNU Tools for ARM Embedded Processors (gcc-arm-none-eabi-4_9-2014q4-20141203-win32.exe) iš https://launchpad.net/gcc-arm-embedded
  2. Baigus diegima prieš Finish uždedam varnelę ant Add path to environment variable
  3. Parsisiunčiam Eclipse IDE for C/C++ Developers (eclipse-cpp-luna-SR2-win32-x86_64.zip) iš https://www.eclipse.org/downloads/
  4. eclipse-cpp-luna-SR2-win32-x86_64.zip išpakuojam į C:\eclipseARM
  5. Sukuriam direktoriją D:\Projects\eclipseARM
  6. **Eclipse **programoje per Help->Install New Software pridedam GNU ARM Eclipse:http://gnuarmeclipse.sourceforge.net/updates
  7. Pažymim GNU ARM C/C++ Cross Compiler, GNU ARM C/C++ Documentation (Placeholder), GNU ARM C/C++ Generic Cortex-M Project Template, GNU ARM C/C++ Packs (Experimental), GNU ARM C/C++ STM32Fx Project Templates ir spaudžiam Next, Next, Finish ir restartuojam Eclipse
  8. New Project->C++ Project, įrašom Project name, pasirenkame Executable->STM32F10x C/C++ Project, Cross ARM GCC ir spaudžiam Next
  9. Pasirankam tokius nustatymus
Chip family STM32f10x Medium Density
Flash size (KB) 64
RAM size (KB) 20
External clock (Hz) 8000000
Content Empty (add your own content)
Use system calls Freestanding (no POSIX system calls)
Trace output None (no trace output)
Next, Next, Next ir Finish 0. Nustatom lss (extended listing) sukūrimą **Project**->**Properties** einam **C/C++ Build**->**Settings**, **Build Steps** skiltį ir uždedam varnelę **Create extended listing**
arm-none-eabi-objdump parametrai
-d Parodo instrukcijas (disasembliuoja)
-D Padaro tą patį kaip ir -d tik viską paverčia instrukcijomis (neskiria duomenų nuo instrucijų)
-S Padaro tą patį ką ir -d, tik susieja instrukcijas ir išeities kodą
-l Papildomai rodo iš kokio failo yra kodo dalis
-z Paprastai disasembliuojant "0" užpildytus blokus praleidžia. Šis parametras disasembliuoja ir parodo šiuos blokus
0. Kad parasčiau butų valdyti kodą einam į **Window**->**Preferences**, tada **C/C++**->**Editor**->**Folding** uždedam varneles: **Enable folding of preprocessor branches (#if/#endif)** ir **Enable folding of control flow statements (if/else, do/while, for, switch)** 0. Spaudžiam **Build** 0. Parsiunčiam **STM32 and STM8 Flash loader demonstrator** (stsw-mcu005.zip) iš [http://www.st.com/web/en/catalog/tools/PF257525](http://www.st.com/web/en/catalog/tools/PF257525) ir sudiegiam 0. Įjungiam įkrovos programą: **BOOT0** jungiam į **3,3V**, o **BOOT1** jungiam į **GND** 0. Sujungiam modulį su USB į serial keitiklį (USB to Serial converter) taip: **A9** (USART1_TX) jungiam prie **RX**, **A10** (USART1_RX) prie **TX**, **GND** prie **GND**, **3,3V** prie **3,3V** 0. Paleidžiam **Demonstrator GUI**, nustatom **Port Name**, **Boud rate** į **256000** ir spaudžiam **Next**, **Next** 0. Pažymim **Download to device**, nurodom **.hex**, pažymim **Erase necessary pages** ir **Jump to the user program**, kad po įrašymo iškarto paleistu įkeltą programą

3. Bendrosios paskirties įvestis ir išvestis (angl. General-purpose input/output (GPIO))

Kiekvienas I/O prievado (angl. port) išvadas (angl. pin) gali veikti vienu iš šių rėžimų:

  • Analog; (GPIO_Mode_AIN = 0x0)
  • Input floating; (GPIO_Mode_IN_FLOATING = 0x04)
  • Input pull-down; (GPIO_Mode_IPD = 0x28)
  • Input pull-up; (GPIO_Mode_IPU = 0x48)
  • Output open drain; (PIO_Mode_Out_OD = 0x14)
  • Output push-pull; (GPIO_Mode_Out_PP = 0x10)
  • Alternate function open drain; (GPIO_Mode_AF_OD = 0x1C)
  • Alternate function push-pull. (GPIO_Mode_AF_PP = 0x18)

Išvadai (angl. pins) yra suskirstyti į prievadus (angl. ports) PORTA, PORTB, PORTC ir t.t., kurie valdomi registrais:

  • GPIOx_CRL ir GPIOx_CRH - konfigūraciniai 32 bitų registrai;
  • GPIOx_IDR - 16 bitų1 įvesties (angl. input) registras;
  • GPIOx_ODR - 16 bitų1 išvesties (angl. output) registras;
  • GPIOx_BSRR - 32 bitų nustatymo (angl. set) / išvalymo (angl. reset) registras;
  • GPIOx_BRR - 16 bitų1 išvalymo (angl. reset) registras;
  • GPIOx_LCKR - 32 bitų užrakinimo (angl. locking) registras.

1 - registras yra 32 bitų, bet aukštesnieji 16 bitų yra rezervuoti ir valdomi likusiais 16.

Prievado (angl. port) išvesties (angl. output) registras yra valdomas 16 bitų registru GPIOx_ODR, bet taip pat yra galimas atominis2 (angl. atomic) bitų nustatymas/išvalymas pasinaudojus GPIOx_BSRR, GPIOx_BRR registrais. GPIOx_LCKR registras skirtas apsaugoti konfigūracinius registrus. Po užrakinimo nebegalima konfigūruoti užrakintų registro bitų (užraktas galioja iki perkrovus (angl. reset)).

2 - Atominis reiškia, kad yra vykdomas iškarto t.y. iškarto nustato/išvalo (angl. set/reset) bitus registre ir nereikia atlikti vadinamų skaitymo-modifikavimo-rašymo (angl. read-modify-write) operacijų (nuskaityti esamos registro reikšmės, po to OR/AND pagalba nustatyti/išvalyti (angl. set/reset) bitus ir galiausiai nustatyti registro reikšmę), kurias galėtų nustrauktį pertrauktis (angl. interrupt). Pavyzdžiui norint nustatyti 10-tą bitą A prievade (angl. port) galima daryti taip: GPIOA->ODR |= 0x0400, kas būtų analogiška GPIOA->ODR = GPIOA->ODR | 0x0400 t.y. viskas susiveda su ODR registro nuskaitymą, registro reikšmės ir konstantos 0x0400 "ARBA" (angl. OR) operacija ir galiausiai gauto rezultato priskyrimas tam pačiam ORD registrui. Taigi atliekant bitų nustatymą/išvalymą per ODR registrą yra atliekamos trys operacijos, o naudojant GPIOx_BSRR ar GPIOx_BRR (analogiškas kaip ir GPIOx_BSRR tačiau skirtas tik bitų išvalymui (angl. reset)) tik viena - priskyrimo.

Periferija kaip GPIO, USART, laikrodžiai (angl. timer), ADC ir pan. yra prijungti prie greitosios magistralės (angl. Advanced High Speed Bus (AHB)) matricos per periferines magistrales (angl. Advanced Peripheral Buses (APB)). Taigi, norint naudotis pavyzdžiui I/O prievadais (angl. port) reikia įjungti taktinio dažnio šaltinį (angl. clock source) periferinei magistralei (angl. Advanced Peripheral Bus (APB)). Šiuo atveju I/O prievadai (angl. ports) yra prijungti prie APB2 magistralės, todėl prieš pradedant naudotis prievadais (angl. ports) reikia sukonfigūruoti magistralę.

Rašyti kodą galima dviem būdais - manipuliuoti registrais tiesiogiai arba pasinaudoti CMSIS (Cortex Microcontroller Software Interface Standard). CMSIS tai biblioteka, kuri palengvina darbą su registrais ir kodą padaro lengviau pernešamą (angl. portable) ant kito mikrokontrolerio. Beabejo, naudojant CMSIS yra panaudojama daugiau vietos ir resursų, bet gaunamas lankstumas ir patogumas.

Taigi, pirmiausia kuriant programą įtraukiame prijungiam biblioteką:

#include "stm32f10x.h"

Sukonfigūruojam APB2 magistralę, kad veiktų PORTC:

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);

Sukonfigūruojam 13-tą išvestį (angl. output pin) PORTC prievade (angl. port):

//GPIO structure used to initialize port
GPIO_InitTypeDef GPIO_InitStructure;
//select pin to initialize
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
//select output push-pull mode
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
//highest speed available
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);

Įjungiam išvestį (angl. pin)

GPIO_SetBits(GPIOC, GPIO_Pin_13);

Išjungiam išvestį (angl. pin)

GPIO_ResetBits(GPIOC, GPIO_Pin_13);

Sukonfigūruojam 1-ąją įvestį (angl. input pin) PORTC prievade (angl. port) pasinaudojus anksčiau aprašytu kintamuoju ir pakeičiant tik kelis nustatymus:

//using same structure we will initialize button pin
//select pin to initialize button
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
//select input floating
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOC, &GPIO_InitStructure);

Nuskaityti įvestį (angl. input pin)galima taip:

GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_14);

Clone this wiki locally