Top Banner
Programowanie mikrokontrolerów 2.0 Uklady peryferyjne, wyjścia i wejścia binarne Marcin Engel Marcin Peczarski Instytut Informatyki Uniwersytetu Warszawskiego 9 października 2017 2.1
47

Układy peryferyjne, wyjścia i wejścia binarne Marcin Engel ...marpe/mikrokontrolery/w2_gpio.pdf · Programowanie mikrokontrolerów 2.0 Układy peryferyjne, wyjścia i wejścia

Apr 24, 2019

Download

Documents

lykien
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Układy peryferyjne, wyjścia i wejścia binarne Marcin Engel ...marpe/mikrokontrolery/w2_gpio.pdf · Programowanie mikrokontrolerów 2.0 Układy peryferyjne, wyjścia i wejścia

Programowanie mikrokontrolerów 2.0Układy peryferyjne, wyjścia i wejścia binarne

Marcin Engel Marcin Peczarski

Instytut Informatyki Uniwersytetu Warszawskiego

9 października 2017

2.1

Page 2: Układy peryferyjne, wyjścia i wejścia binarne Marcin Engel ...marpe/mikrokontrolery/w2_gpio.pdf · Programowanie mikrokontrolerów 2.0 Układy peryferyjne, wyjścia i wejścia

Co możemy podłączyć do mikrokontrolera?

Jako wyjście:I diody świecące – LED (ang. Light Emitting Diode)I wyświetlacz ciekłokrystaliczny – LCD (ang. Liquid CrystalDisplay)

I nadajnik podczerwieni – IR (ang. Infra Red)I układ sterujący silniczkiem, serwomechanizmem, wiatraczkiemI . . .

2.2

Page 3: Układy peryferyjne, wyjścia i wejścia binarne Marcin Engel ...marpe/mikrokontrolery/w2_gpio.pdf · Programowanie mikrokontrolerów 2.0 Układy peryferyjne, wyjścia i wejścia

Co możemy podłączyć do mikrokontrolera?

Jako wejście:I przyciskI klawiaturę matrycowąI odbiornik IRI termometr analogowyI . . .

2.3

Page 4: Układy peryferyjne, wyjścia i wejścia binarne Marcin Engel ...marpe/mikrokontrolery/w2_gpio.pdf · Programowanie mikrokontrolerów 2.0 Układy peryferyjne, wyjścia i wejścia

Co możemy podłączyć do mikrokontrolera?

Jako wejście-wyjście:I zewnętrzną pamięćI komputer (np. łączem szeregowym)I inny mikrokontrolerI akcelerometrI inne czujnikiI . . .

Będziemy poznawać sukcesywnie na kolejnych zajęciach

2.4

Page 5: Układy peryferyjne, wyjścia i wejścia binarne Marcin Engel ...marpe/mikrokontrolery/w2_gpio.pdf · Programowanie mikrokontrolerów 2.0 Układy peryferyjne, wyjścia i wejścia

Wyjście przeciwsobne (ang. push-pull)

U = 3,3 V

wyj.

I Gdy zapiszemy na wyjście 0I dolny tranzystor przewodziI górny tranzystor nie przewodziI na wyjściu mikrokontrolera jest stan

niski, napięcie bliskie 0 V – logiczne 0I Gdy zapiszemy na wyjście 1

I dolny tranzystor nie przewodziI górny tranzystor przewodziI na wyjściu mikrokontrolera jest stan

wysoki, napięcie bliskie napięciuzasilania – logiczna 1

I Uwaga: tu i dalej stosujemy dodatniąkonwencję logiczną

2.5

Page 6: Układy peryferyjne, wyjścia i wejścia binarne Marcin Engel ...marpe/mikrokontrolery/w2_gpio.pdf · Programowanie mikrokontrolerów 2.0 Układy peryferyjne, wyjścia i wejścia

Wyjście otwarty dren (ang. open-drain)

wyj.

I Gdy zapiszemy na wyjście 0I tranzystor przewodziI na wyjściu mikrokontrolera jest stan

niski, napięcie bliskie 0 V – logiczne 0I Gdy zapiszemy na wyjście 1

I tranzystor nie przewodziI na wyjściu mikrokontrolera jest stan

nieustalony, czyli stan wysokiejimpedancji – Z

2.6

Page 7: Układy peryferyjne, wyjścia i wejścia binarne Marcin Engel ...marpe/mikrokontrolery/w2_gpio.pdf · Programowanie mikrokontrolerów 2.0 Układy peryferyjne, wyjścia i wejścia

Wyjście otwarty dren z rezystorem podciągającym

U = 3,3 V

wyj.

I Gdy zapiszemy na wyjście 0I tranzystor przewodziI na wyjściu mikrokontrolera jest stan

niski, napięcie bliskie 0 V – logiczne 0I Gdy zapiszemy na wyjście 1

I tranzystor nie przewodziI na wyjściu mikrokontrolera jest

napięcie bliskie napięciu zasilania,słaby (ang. weak) stan wysoki – H

I Rezystor podciągający może byćwewnętrzny lub zewnętrzny

I Uwaga: symbol H został wzięty zVHDL-a, ale w wielu dokumentachoznacza zwykły stan wysoki

2.7

Page 8: Układy peryferyjne, wyjścia i wejścia binarne Marcin Engel ...marpe/mikrokontrolery/w2_gpio.pdf · Programowanie mikrokontrolerów 2.0 Układy peryferyjne, wyjścia i wejścia

Wyjścia otwarty dren można ze sobą łączyć

I Tworzą iloczyn logiczny

∧ 0 H Z0 0 0 0H 0 H HZ 0 H Z

I Aby uniknąć stanu nieustalonego, musi być przynajmniej jedenrezystor podciągający

I Stan wynikowy można odczytać, czytając wartość wejściaI Korzysta się z tego np. w I2C i 1-Wire

2.8

Page 9: Układy peryferyjne, wyjścia i wejścia binarne Marcin Engel ...marpe/mikrokontrolery/w2_gpio.pdf · Programowanie mikrokontrolerów 2.0 Układy peryferyjne, wyjścia i wejścia

Diody świecące, LED

2.9

Page 10: Układy peryferyjne, wyjścia i wejścia binarne Marcin Engel ...marpe/mikrokontrolery/w2_gpio.pdf · Programowanie mikrokontrolerów 2.0 Układy peryferyjne, wyjścia i wejścia

Charakterystyka diody

I Typowe parametry pracyI prąd od kilku do kilkudziesięciu mAI spadek napięcia od 0,2 V do 3,5 V

I Jasność diody świecącej zależy od prądu przez nią płynącegoI Żywotność też!I Nadmierny prąd może uszkodzić diodęI Dioda przewodzi prąd w jednym kierunku (kierunek

przewodzenia)I Zbyt duże napięcie przyłożone w kierunku zaporowym może

uszkodzić diodę2.10

Page 11: Układy peryferyjne, wyjścia i wejścia binarne Marcin Engel ...marpe/mikrokontrolery/w2_gpio.pdf · Programowanie mikrokontrolerów 2.0 Układy peryferyjne, wyjścia i wejścia

Jak przyłączyć diodę świecącą do mikrokontrolera?

U = 3,3 V

R

wyj.

wyj.

R

I Prawo Ohma: U = RII Dla założonego prądu płynącego przez

diodę:I sprawdzamy, jaki będzie spadek

napięcia na niejI włączamy w obwód rezystor dobrany

tak, aby spadki napięcia na nim i nadiodzie sumowały się do napięciazasilania

I Przykład:I prąd diody 5 mAI spadek napięcia na diodzie 1,7 VI napięcie zasilania 3,3 VI wartość rezystora:

3,3 V− 1,7 V5 mA

=1,6 V5 mA

= 320 Ω

I Wybieramy rezystor 330 Ω

2.11

Page 12: Układy peryferyjne, wyjścia i wejścia binarne Marcin Engel ...marpe/mikrokontrolery/w2_gpio.pdf · Programowanie mikrokontrolerów 2.0 Układy peryferyjne, wyjścia i wejścia

LED – podsumowanie

Dioda świecąca:I przewodzi prąd w jednym kierunku (i wtedy świeci)I wymaga ograniczenia prądu za pomocą rezystora

W zestawie laboratoryjnym:I odpowiednie rezystory są wlutowaneI wyprowadzenie mikrokontrolera musi być ustawione jako

wyjście przeciwsobne (ang. push-pull)I po połączeniu diody z wyprowadzeniem mikrokontrolera dioda

będzie świecić po podaniu na to wyprowadzenie stanu 0 lub 1(zależnie od sposobu przyłączenia diody)

2.12

Page 13: Układy peryferyjne, wyjścia i wejścia binarne Marcin Engel ...marpe/mikrokontrolery/w2_gpio.pdf · Programowanie mikrokontrolerów 2.0 Układy peryferyjne, wyjścia i wejścia

Peryferie w STM32F411I RCCI GPIOA, GPIOB, GPIOC, GPIOD, GPIOE, GPIOHI EXTII PWR, SYSCFG, FLASHI ADC, ADC1I TIM1, TIM2, TIM3, TIM4, TIM5, TIM9, TIM10, TIM11I IWDG, WWDGI RTCI I2C1, I2C2, I2C3, I2S2ext, I2S3extI SDIOI SPI1, SPI2, SPI3, SPI4, SPI5I USART1, USART2, USART6I USB OTG FSI DMA1, DMA2I CRCI NVIC, SCB, SysTickI Większość będziemy sukcesywnie poznawać

2.13

Page 14: Układy peryferyjne, wyjścia i wejścia binarne Marcin Engel ...marpe/mikrokontrolery/w2_gpio.pdf · Programowanie mikrokontrolerów 2.0 Układy peryferyjne, wyjścia i wejścia

Peryferie dostępne w innych STM32I GPIOF, GPIOG, GPIOI, GPIOJ, GPIOKI ADC2, ADC3I DACI TIM6, TIM7, TIM8, TIM12, TIM13, TIM14I CAN1, CAN2I USART3, UART4, UART5, UART7, UART8I SAI1I SPI6I USB OTG HSI ETHI LTDC, DCMII DMA2DI FSMC, FMCI CRYP, HASH, RNGI MPUI Nie będziemy o nich mówić, ale warto wiedzieć, że są

dostępne w innych modelach STM322.14

Page 15: Układy peryferyjne, wyjścia i wejścia binarne Marcin Engel ...marpe/mikrokontrolery/w2_gpio.pdf · Programowanie mikrokontrolerów 2.0 Układy peryferyjne, wyjścia i wejścia

Jak korzysta się z peryferii?

I Programista widzi peryferie jako 16- lub 32-bitowe rejestryumieszczone w przestrzeni adresowej mikrokontrolera

I Przykład

uint16_t reg;reg = *(volatile uint16_t*)(0x40020010);*(volatile uint32_t*)(0x40020014) = 0;

I Co robi ten kod?I Dlaczego użyto słowa kluczowego volatile?I NieeleganckieI Podatne na trudne do wykrycia błędy

2.15

Page 16: Układy peryferyjne, wyjścia i wejścia binarne Marcin Engel ...marpe/mikrokontrolery/w2_gpio.pdf · Programowanie mikrokontrolerów 2.0 Układy peryferyjne, wyjścia i wejścia

Biblioteka CMSIS

I Cortex Microcontroller Software Interface Standard definiujeodpowiednie struktury, na przykład

#define __IO volatiletypedef struct __IO uint32_t MODER; /* mode */__IO uint32_t OTYPER; /* output type */__IO uint32_t OSPEEDR; /* output speed */__IO uint32_t PUPDR; /* pull-up/pull-down */__IO uint32_t IDR; /* input data */__IO uint32_t ODR; /* output data */__IO uint16_t BSRRL; /* bit set */__IO uint16_t BSRRH; /* bit reset */__IO uint32_t LCKR; /* configuration lock */__IO uint32_t AFR[2]; /* alternate function */ GPIO_TypeDef;

2.16

Page 17: Układy peryferyjne, wyjścia i wejścia binarne Marcin Engel ...marpe/mikrokontrolery/w2_gpio.pdf · Programowanie mikrokontrolerów 2.0 Układy peryferyjne, wyjścia i wejścia

Biblioteka CMSIS

I Dla każdego układu peryferyjnego CMSIS definiuje jegopołożenie w pamięci, na przykład

#define PERIPH_BASE (0x40000000)#define AHB1PERIPH_BASE (PERIPH_BASE + 0x0020000)#define GPIOA_BASE (AHB1PERIPH_BASE + 0x0000)#define GPIOA ((GPIO_TypeDef *)GPIOA_BASE)

I Teraz kod może wyglądać czytelnie

uint16_t reg;reg = GPIOA->IDR;GPIOA->ODR = 0;

I Dostarcza też funkcji rozwijających się w miejscu do instrukcjiasemblerowych realizujących operacje, których nie maw języku C, np. NOP()

I W labie dostępna w katalogu /opt/arm/stm32/CMSIS

2.17

Page 18: Układy peryferyjne, wyjścia i wejścia binarne Marcin Engel ...marpe/mikrokontrolery/w2_gpio.pdf · Programowanie mikrokontrolerów 2.0 Układy peryferyjne, wyjścia i wejścia

Biblioteka CMSISI Aby użyć CMSIS, należy przy wywoływaniu kompilatora

I zdefiniować model procesora za pomocą stałej preprocesora-DSTM32F411xE

I podać kompilatorowi, gdzie ma szukać plików nagłówkowych-I/opt/arm/stm32/CMSIS/Include-I/opt/arm/stm32/CMSIS/Device/ST/STM32F4xx/Include

I włączyć właściwy plik nagłówkowy#include <stm32f4xx.h>

I Nazwa pliku nagłówkowego może się zmienić (w przeszłościjuż się to zdarzało)

I Może się okazać, że trzeba włączyć więcej plikówI Dobrze jest wszystko zgromadzić w jednym miejscu

I sugerujemy włączanie pliku#include <stm32.h>

I ścieżka dla kompilatora-I/opt/arm/stm32/inc

I dzięki temu zmiana modelu mikrokontrolera nie musi wymagaćmodyfikowania kodu źródłowego, a tylko wystarczy goprzekompilować

2.18

Page 19: Układy peryferyjne, wyjścia i wejścia binarne Marcin Engel ...marpe/mikrokontrolery/w2_gpio.pdf · Programowanie mikrokontrolerów 2.0 Układy peryferyjne, wyjścia i wejścia

Jak korzysta się z peryferii?

I Odczytać rejestr już umiemy

uint16_t reg;reg = GPIOA->IDR;

I Zapis jest równie prosty

GPIOA->ODR = 0x00e0U;

I A co, gdy chcemy ustawić tylko niektóre bity?

GPIOA->ODR |= 0x00e0U;

I Albo wyzerować niektóre bity?

GPIOA->ODR &= ~0x00e0U;

I Albo zanegować niektóre bity?

GPIOA->ODR ^= 0x00e0U;

2.19

Page 20: Układy peryferyjne, wyjścia i wejścia binarne Marcin Engel ...marpe/mikrokontrolery/w2_gpio.pdf · Programowanie mikrokontrolerów 2.0 Układy peryferyjne, wyjścia i wejścia

Jak korzysta się z peryferii?I Jak zmienić wartości bitów, których aktualnych wartości nie

znamy?uint32_t reg;reg = GPIOA->MODER;reg &= ~(3U << (2U * pin_n));reg |= new_mode << (2U * pin_n);GPIOA->MODER = reg;

I A właściwie dlaczego nie tak?GPIOA->MODER &= ~(3U << (2U * pin_n));GPIOA->MODER |= new_mode << (2U * pin_n);

I Pierwsza wersja generuje krótszy (wydajniejszy) kodmaszynowy: tylko jeden odczyt i jeden zapis rejestru MODER

I Druga wersja skutkuje dwoma odczytami i zapisami orazpowoduje występowanie w rejestrze przez chwilę stanupośredniego

I Dotychczas przedstawione sposoby modyfikowania bitóww rejestrach peryferyjnych nie są atomowe

2.20

Page 21: Układy peryferyjne, wyjścia i wejścia binarne Marcin Engel ...marpe/mikrokontrolery/w2_gpio.pdf · Programowanie mikrokontrolerów 2.0 Układy peryferyjne, wyjścia i wejścia

Atomowe modyfikowanie stanu wyjść

I Niektóre peryferie mają rejestry pozwalające na atomowemodyfikacje

I Bity w rejestrach BSRRL i BSRRH mogą być tylko zapisywaneI Zapis bitu rejestru BSRRL wartością 1 ustawia odpowiedni bit

w rejestrze ODRI Zapis bitu rejestru BSRRH wartością 1 zeruje odpowiedni bit

w rejestrze ODRI Zapisywanie wartości 0 do bitów rejestrów BSRRL i BSRRH jest

ignorowaneI Ustaw na wyprowadzeniu PA5 poziom wysoki

GPIOA->BSRRL = 1U << 5;

I Ustaw na wyprowadzeniu PA5 poziom niski

GPIOA->BSRRH = 1U << 5;

2.21

Page 22: Układy peryferyjne, wyjścia i wejścia binarne Marcin Engel ...marpe/mikrokontrolery/w2_gpio.pdf · Programowanie mikrokontrolerów 2.0 Układy peryferyjne, wyjścia i wejścia

Taktowanie

I Zanim się czegokolwiek użyje, trzeba włączyć taktowanieI Włączenie taktowania portów PA i PB (układy GPIOA i GPIOB)

RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN |RCC_AHB1ENR_GPIOBEN;

I Włączenie taktowania interfejsów USART1 i USART2

RCC->APB2ENR |= RCC_APB2ENR_USART1EN;RCC->APB1ENR |= RCC_APB1ENR_USART2EN;

I Włączenie taktowania licznika TIM2

RCC->APB1ENR |= RCC_APB1ENR_TIM2EN;

I Można dostrzec konwencję nazywania bitów:UKŁAD REJESTR BIT

2.22

Page 23: Układy peryferyjne, wyjścia i wejścia binarne Marcin Engel ...marpe/mikrokontrolery/w2_gpio.pdf · Programowanie mikrokontrolerów 2.0 Układy peryferyjne, wyjścia i wejścia

Diody świecące w zestawie laboratoryjnym

I Na płytce Nucleo mamy zieloną LEDI przyłączoną do wyprowadzenia PA5I włączaną poziomem wysokim – logiczna 1

I Na ekspanderze mamy trójkolorową LEDI czerwona – wyprowadzenie PA6I zielona – wyprowadzenie PA7I niebieska – wyprowadzenie PB0I włączane poziomem niskim – logiczne 0

2.23

Page 24: Układy peryferyjne, wyjścia i wejścia binarne Marcin Engel ...marpe/mikrokontrolery/w2_gpio.pdf · Programowanie mikrokontrolerów 2.0 Układy peryferyjne, wyjścia i wejścia

Hello World, czyli zamigaj diodami (1)

I Tworzymy plik leds_main.cI Potrzebujemy różnych definicji

#include <delay.h>#include <gpio.h>#include <stm32.h>

I Pliki nagłówkowe są dostępne w labie w katalogu/opt/arm/stm32/inc

2.24

Page 25: Układy peryferyjne, wyjścia i wejścia binarne Marcin Engel ...marpe/mikrokontrolery/w2_gpio.pdf · Programowanie mikrokontrolerów 2.0 Układy peryferyjne, wyjścia i wejścia

Hello World, czyli zamigaj diodami (2)

I Należy zdefiniować konfigurację sprzętu

#define RED_LED_GPIO GPIOA#define GREEN_LED_GPIO GPIOA#define BLUE_LED_GPIO GPIOB#define GREEN2_LED_GPIO GPIOA

#define RED_LED_PIN 6#define GREEN_LED_PIN 7#define BLUE_LED_PIN 0#define GREEN2_LED_PIN 5

2.25

Page 26: Układy peryferyjne, wyjścia i wejścia binarne Marcin Engel ...marpe/mikrokontrolery/w2_gpio.pdf · Programowanie mikrokontrolerów 2.0 Układy peryferyjne, wyjścia i wejścia

Hello World, czyli zamigaj diodami (3)

I Dobrze jest zdefiniować powtarzające się operacje, zwiększającjednocześnie czytelność kodu

#define RedLEDon() \RED_LED_GPIO->BSRRH = 1 << RED_LED_PIN#define RedLEDoff() \RED_LED_GPIO->BSRRL = 1 << RED_LED_PIN

...

#define Green2LEDon() \GREEN2_LED_GPIO->BSRRL = 1 << GREEN2_LED_PIN#define Green2LEDoff() \GREEN2_LED_GPIO->BSRRH = 1 << GREEN2_LED_PIN

I Czy ktoś widzi jakąś różnicę?

2.26

Page 27: Układy peryferyjne, wyjścia i wejścia binarne Marcin Engel ...marpe/mikrokontrolery/w2_gpio.pdf · Programowanie mikrokontrolerów 2.0 Układy peryferyjne, wyjścia i wejścia

Hello World, czyli zamigaj diodami (4)

int main() RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN |

RCC_AHB1ENR_GPIOBEN;__NOP();

RedLEDoff();GreenLEDoff();BlueLEDoff();Green2LEDoff();

2.27

Page 28: Układy peryferyjne, wyjścia i wejścia binarne Marcin Engel ...marpe/mikrokontrolery/w2_gpio.pdf · Programowanie mikrokontrolerów 2.0 Układy peryferyjne, wyjścia i wejścia

Hello World, czyli zamigaj diodami (5)

GPIOoutConfigure(RED_LED_GPIO,RED_LED_PIN,GPIO_OType_PP,GPIO_Low_Speed,GPIO_PuPd_NOPULL);

...

GPIOoutConfigure(GREEN2_LED_GPIO,GREEN2_LED_PIN,GPIO_OType_PP,GPIO_Low_Speed,GPIO_PuPd_NOPULL);

2.28

Page 29: Układy peryferyjne, wyjścia i wejścia binarne Marcin Engel ...marpe/mikrokontrolery/w2_gpio.pdf · Programowanie mikrokontrolerów 2.0 Układy peryferyjne, wyjścia i wejścia

Hello World, czyli zamigaj diodami (6)

for (;;) RedLEDon();Delay(4000000);RedLEDoff();GreenLEDon();Delay(4000000);GreenLEDoff();BlueLEDon();Delay(4000000);BlueLEDoff();Green2LEDon();Delay(4000000);Green2LEDoff();

2.29

Page 30: Układy peryferyjne, wyjścia i wejścia binarne Marcin Engel ...marpe/mikrokontrolery/w2_gpio.pdf · Programowanie mikrokontrolerów 2.0 Układy peryferyjne, wyjścia i wejścia

Pytania

I Dlaczego wyłączamy diody przed skonfigurowaniemwyprowadzeń?

I Po co jest instrukcja NOP?I Jakie wartości parametrów przyjmuje funkcjaGPIOoutConfigure?

2.30

Page 31: Układy peryferyjne, wyjścia i wejścia binarne Marcin Engel ...marpe/mikrokontrolery/w2_gpio.pdf · Programowanie mikrokontrolerów 2.0 Układy peryferyjne, wyjścia i wejścia

Jak skompilować? Plik makefile

CC = arm-eabi-gccOBJCOPY = arm-eabi-objcopyFLAGS = -mthumb -mcpu=cortex-m4CPPFLAGS = -DSTM32F411xECFLAGS = $(FLAGS) -Wall -g \

-O2 -ffunction-sections -fdata-sections \-I/opt/arm/stm32/inc \-I/opt/arm/stm32/CMSIS/Include \

-I/opt/arm/stm32/CMSIS/Device/ST/STM32F4xx/IncludeLDFLAGS = $(FLAGS) -Wl,--gc-sections -nostartfiles \

-L/opt/arm/stm32/lds -Tstm32f411re.lds

vpath %.c /opt/arm/stm32/src

2.31

Page 32: Układy peryferyjne, wyjścia i wejścia binarne Marcin Engel ...marpe/mikrokontrolery/w2_gpio.pdf · Programowanie mikrokontrolerów 2.0 Układy peryferyjne, wyjścia i wejścia

Jak skompilować? Plik makefile, cd.

OBJECTS = leds_main.o startup_stm32.o delay.o gpio.oTARGET = leds

.SECONDARY: $(TARGET).elf $(OBJECTS)

all: $(TARGET).bin

%.elf : $(OBJECTS)$(CC) $(LDFLAGS) $^ -o $@

%.bin : %.elf$(OBJCOPY) $< $@ -O binary

clean :rm -f *.bin *.elf *.hex *.d *.o *.bak *~

2.32

Page 33: Układy peryferyjne, wyjścia i wejścia binarne Marcin Engel ...marpe/mikrokontrolery/w2_gpio.pdf · Programowanie mikrokontrolerów 2.0 Układy peryferyjne, wyjścia i wejścia

Optymalizacja

I Mikrokontrolery mają ograniczoną pamięć i ograniczonączęstotliwość taktowania

I Optymalizacje przyspieszające wykonywanie kodu zwyklezmniejszają też jego rozmiar

I W większości przypadków najodpowiedniejsza jest opcja -O2I Zmniejszenie rozmiaru kodu wykonywalnego można uzyskać,

stosując opcje -ffunction-sections i -fdata-sectionsI biblioteki muszą być skompilowane z tymi opcjamiI konsolidator musi być wywołany z opcją --gc-sections

I Podglądanie efektu pracy kompilatora:arm-eabi-objdump -M reg-names-std -d *.elf

2.33

Page 34: Układy peryferyjne, wyjścia i wejścia binarne Marcin Engel ...marpe/mikrokontrolery/w2_gpio.pdf · Programowanie mikrokontrolerów 2.0 Układy peryferyjne, wyjścia i wejścia

Jak zaprogramować mikrokontroler?Podłączyć, znajdujący się na płytce Nucleo, ST-LINK/V2-1 dogniazda USB w komputerze

Pierwszy sposób (jeśli nie potrzebujemy debugera)I Użyć OpenOCD w trybie wsadowym (w bieżącym katalogu

musi być obraz pamięci *.bin) za pomocą skryptu/opt/arm/stm32/ocd/qfn4

Drugi sposób (jeśli potrzebujemy debuger)I Uruchomić OpenOCD jako GDB-serwer za pomocą skryptu/opt/arm/stm32/ocd/dbgn4 – w katalogu domowym musibyć plik .gdbinit zawierający coś takiego

target remote :3333monitor reset halt

I W katalogu, w którym mamy plik wykonywalny, uruchomićGDB poleceniem arm-eabi-gdb *.elf

I Następnie w GDB użyć polecenia load2.34

Page 35: Układy peryferyjne, wyjścia i wejścia binarne Marcin Engel ...marpe/mikrokontrolery/w2_gpio.pdf · Programowanie mikrokontrolerów 2.0 Układy peryferyjne, wyjścia i wejścia

Jak zaimplementować prostą funkcję opóźniającą?

I Pierwszy pomysł

void Delay(unsigned count) while (count--);

I Dlaczego count--, a nie --count?

Delay(0);

I Dlaczego ta implementacja jest zła?

00000000 <Delay>:0: 4770 bx lr2: bf00 nop

2.35

Page 36: Układy peryferyjne, wyjścia i wejścia binarne Marcin Engel ...marpe/mikrokontrolery/w2_gpio.pdf · Programowanie mikrokontrolerów 2.0 Układy peryferyjne, wyjścia i wejścia

Jak zaimplementować prostą funkcję opóźniającą?I Użyjmy słowa kluczowego volatile, żeby zablokować

optymalizacjęvoid Delay(volatile unsigned count) while (count--);

I Dlaczego ta implementacja jest zła?00000000 <Delay>:0: b082 sub sp, #82: 9001 str r0, [sp, #4]4: 9b01 ldr r3, [sp, #4]6: 1e5a subs r2, r3, #18: 9201 str r2, [sp, #4]a: 2b00 cmp r3, #0c: d1fa bne.n 4 <Delay+0x4>e: b002 add sp, #810: 4770 bx lr12: bf00 nop

2.36

Page 37: Układy peryferyjne, wyjścia i wejścia binarne Marcin Engel ...marpe/mikrokontrolery/w2_gpio.pdf · Programowanie mikrokontrolerów 2.0 Układy peryferyjne, wyjścia i wejścia

Jak zaimplementować prostą funkcję opóźniającą?

I Spróbujmy inaczej

void Delay(unsigned count) while (count--) __NOP();__NOP();

I Dlaczego ta implementacja jest dobra?

00000000 <Delay>:0: 1e43 subs r3, r0, #12: b120 cbz r0, e <Delay+0xe>4: bf00 nop6: bf00 nop8: f113 33ff adds.w r3, r3, #4294967295 ; -1c: d2fa bcs.n 4 <Delay+0x4>e: 4770 bx lr

2.37

Page 38: Układy peryferyjne, wyjścia i wejścia binarne Marcin Engel ...marpe/mikrokontrolery/w2_gpio.pdf · Programowanie mikrokontrolerów 2.0 Układy peryferyjne, wyjścia i wejścia

Jak zaimplementować prostą funkcję opóźniającą?

I Nasza ostateczna wersja funkcji opóźniającej

void Delay(unsigned count) while (count--) __NOP();__NOP();

I Dlaczego dwie instrukcje NOP?I Jak dobrać wartość argumentu, aby otrzymać żądane

opóźnienie?250tf

gdzie t to żądany czas opóźnienia w ms, a f to częstotliwośćtaktowania mikrokontrolera w MHz

2.38

Page 39: Układy peryferyjne, wyjścia i wejścia binarne Marcin Engel ...marpe/mikrokontrolery/w2_gpio.pdf · Programowanie mikrokontrolerów 2.0 Układy peryferyjne, wyjścia i wejścia

Jak przyłączyć przycisk do mikrokontrolera?

U = 3,3 V

R

wej.

I Gdy przycisk niewciśnięty, rezystorustala na wejściu mikrokontrolera stanwysoki, napięcie bliskie napięciuzasilania – logiczna 1

I Wciśnięcie przycisku ustala na wejściumikrokontrolera stan niski, napięciebliskie 0 V – logiczne 0

I Gdy przycisk niewciśnięty, przez rezystorprąd praktycznie nie płynie

I Gdy przycisk wciśnięty, przez rezystorpłynie prąd, przykładowo

I =UR

=3,3 V10 kΩ

= 0,33 mA

2.39

Page 40: Układy peryferyjne, wyjścia i wejścia binarne Marcin Engel ...marpe/mikrokontrolery/w2_gpio.pdf · Programowanie mikrokontrolerów 2.0 Układy peryferyjne, wyjścia i wejścia

Jak przyłączyć przycisk do mikrokontrolera?

U = 3,3 V

R

wej.

I Gdy przycisk niewciśnięty, rezystorustala na wejściu mikrokontrolera stanniski, napięcie bliskie 0 V – logiczne 0

I Wciśnięcie przycisku ustala na wejściumikrokontrolera stan wysoki, napięciebliskie napięciu zasilania – logiczna 1

I Gdy przycisk niewciśnięty, przez rezystorprąd praktycznie nie płynie

I Gdy przycisk wciśnięty, przez rezystorpłynie prąd, przykładowo

I =UR

=3,3 V10 kΩ

= 0,33 mA

2.40

Page 41: Układy peryferyjne, wyjścia i wejścia binarne Marcin Engel ...marpe/mikrokontrolery/w2_gpio.pdf · Programowanie mikrokontrolerów 2.0 Układy peryferyjne, wyjścia i wejścia

Zjawisko drgania styków

I W rzeczywistości wciśnięcie i puszczenie przycisku powodujemikrodrgania

I Stan stabilizuje się po pewnym czasie

2.41

Page 42: Układy peryferyjne, wyjścia i wejścia binarne Marcin Engel ...marpe/mikrokontrolery/w2_gpio.pdf · Programowanie mikrokontrolerów 2.0 Układy peryferyjne, wyjścia i wejścia

Algorytm obsługi przycisku bez powtarzania

if (przycisk wciśnięty) thenbeginwait(T);if (przycisk wciśnięty) thenbeginobsłuż zdarzenie;while (przycisk wciśnięty)wait(T)

endend

2.42

Page 43: Układy peryferyjne, wyjścia i wejścia binarne Marcin Engel ...marpe/mikrokontrolery/w2_gpio.pdf · Programowanie mikrokontrolerów 2.0 Układy peryferyjne, wyjścia i wejścia

Algorytm obsługi przycisku z powtarzaniem

if (przycisk wciśnięty) thenbeginwait(T);while (przycisk wciśnięty) thenbeginobsłuż zdarzenie;count := 0;while (przycisk wciśnięty and (count < timeout))beginwait(T);count := count + 1end;zmodyfikuj(timeout)endend

2.43

Page 44: Układy peryferyjne, wyjścia i wejścia binarne Marcin Engel ...marpe/mikrokontrolery/w2_gpio.pdf · Programowanie mikrokontrolerów 2.0 Układy peryferyjne, wyjścia i wejścia

Przycisk – podsumowanie

Przycisk monostabilny zwierny:I przewodzi prąd, gdy jest wciśniętyI wymaga rezystora ustalającego stan, gdy jest niewciśniętyI stabilizuje swój stan po kilku do kilkunastu milisekundach od

wciśnięcia lub puszczenia

W zestawie laboratoryjnym:I wyprowadzenie mikrokontrolera musi być ustawione jako

wejścieI odpowiednie zewnętrzne rezystory podciągające do zasilania

lub ściągające do masy są wlutowane (ustawieniewewnętrznego rezystora nie przeszkadza)

2.44

Page 45: Układy peryferyjne, wyjścia i wejścia binarne Marcin Engel ...marpe/mikrokontrolery/w2_gpio.pdf · Programowanie mikrokontrolerów 2.0 Układy peryferyjne, wyjścia i wejścia

Przyciski w zestawie laboratoryjnym

I Na płytce Nucleo mamy przycisk USERI przyłączony do wyprowadzenia PC13I stan aktywny niski – logiczne 0

I Na ekspanderze mamy dżojstikI przycisk w lewo – wyprowadzenie PB3I przycisk w prawo – wyprowadzenie PB4I przycisk w górę – wyprowadzenie PB5I przycisk w dół – wyprowadzenie PB6I przycisk akcja – wyprowadzenie PB10I stan aktywny niski – logiczne 0

I Na ekspanderze mamy przycisk AT MODEI przyłączony do wyprowadzenia PA0I stan aktywny wysoki – logiczna 1

2.45

Page 46: Układy peryferyjne, wyjścia i wejścia binarne Marcin Engel ...marpe/mikrokontrolery/w2_gpio.pdf · Programowanie mikrokontrolerów 2.0 Układy peryferyjne, wyjścia i wejścia

Układy GPIO – podsumowanie

I Mikrokontroler ma kilka układów GPIO (ang. General PurposeInput Optput) – portów wejścia wyjścia

I Są oznaczane kolejnymi literami alfabetuI układy wejścia-wyjścia: GPIOA, GPIOB, GPIOC, . . .I porty wejścia-wyjścia: PA, PB, PC, . . .

I Każdy port obsługuje 16 wyprowadzeń (wejść-wyjść),oznaczanych kolejnymi liczbami: PA0, PA1, . . . , PA15, PB0,PB1, . . . , PB15, PC0, PC1, . . . , PC15, . . .

I Odczyt stanu wejścia odbywa się poprzez rejestr IDRI Ustawienie stanu wyjścia odbywa się poprzez rejestr ODR albo

jeden z rejestrów BSRRL lub BSRRHI ustawiony stan wyjścia można odczytać z rejestru ODRI rzeczywisty stan wyjścia można odczytać z rejestru IDR

2.46

Page 47: Układy peryferyjne, wyjścia i wejścia binarne Marcin Engel ...marpe/mikrokontrolery/w2_gpio.pdf · Programowanie mikrokontrolerów 2.0 Układy peryferyjne, wyjścia i wejścia

Konfigurowanie GPIO – podsumowanie

I Każde wyprowadzenie może być indywidualnie konfigurowanejako

I wejście cyfroweI wyjście cyfroweI funkcja alternatywnaI wejście analogowe

I Po włączeniu zasilania większość wyprowadzeń jestskonfigurowana jako wejście cyfrowe

I Patrz pliki gpio.h, gpio.c dostępne w labach w katalogachodpowiednio /opt/arm/stm32/inc, /opt/arm/stm32/src

2.47