-
Notifications
You must be signed in to change notification settings - Fork 2
STM32F103C8T6
| Model | STM32F103C8T6 |
| Core | ARM 32 Cortex-M3 CPU |
| Chip family | STM32f10x Medium Density |
| 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 |
- Sudiegiam GNU Tools for ARM Embedded Processors (gcc-arm-none-eabi-4_9-2014q4-20141203-win32.exe) iš https://launchpad.net/gcc-arm-embedded
- Baigus diegima prieš Finish uždedam varnelę ant Add path to environment variable
- Parsisiunčiam Eclipse IDE for C/C++ Developers (eclipse-cpp-luna-SR2-win32-x86_64.zip) iš https://www.eclipse.org/downloads/
- eclipse-cpp-luna-SR2-win32-x86_64.zip išpakuojam į C:\eclipseARM
- Sukuriam direktoriją D:\Projects\eclipseARM
- **Eclipse **programoje per Help->Install New Software pridedam GNU ARM Eclipse:http://gnuarmeclipse.sourceforge.net/updates
- 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
- New Project->C++ Project, įrašom Project name, pasirenkame Executable->STM32F10x C/C++ Project, Cross ARM GCC ir spaudžiam Next
- 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) |
| 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 |
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);