PENS
Fairuzy Qonitah
2210131016
[Pemrograman STM32F4-Discovery]
General Purpose Input Output STM32F4-Discovery
General Purpose Input Output (GPIO)
Tujuan
Setelah menyelesaikan modul ini peserta mampu:
Memahami fungsi register-register yang berhubungan dengan pin
Input/Output
Meng-inisialisai pin Input/Output
Membuat program sedehana dengan memanfaatkan pin Input/Output
Dasar Teori
Semua pin di STM32F4xx adaah GPIO (General Purpuse Input/Output) yang
berfungsi untuk berkomunikasi dengan perangkat yang lainnya. Untuk meningkatkan
fungsinya, pin tersebut mempunyai tidak hanya satu fungsi dan dapat dipilih dari
pengaturan yang diinginkan. Misalnya selain I/O, pin tersebut juga berfungsi sebagai pin
TX/RX dari USART, Analog Input dan lain-lain. Sumber clock yang digunakan untuk
mengaktifkannya tergantung pada fungsinya.
Dalam STM32F4 kita perlu menginisialisasi clock untuk setiap periperal sebelum
menggunakannya. Hal ini dapat dilakukan dengan menggunakan RCC – Reset and Clock
Control. stm32f4xx memiliki dua jenis bus : AHB (Advance High Performance Bus) dan
APB (Advance Peripheral Bus). Beberapa periperal terhubung dengan AHB seperti
GPIO, sementara yang lainnya terhubung dengan APB, seperti I2C. Ketika port digunakan
untuk logika 0 atau 1, maka sumber clock berasal dari AHB1 (Advance High
Performance Bus 1).
AHB1 harus diaktifkan atau di enable sebelum port GPIO akan digunakan.
Terdapat 2 langkah untuk mengaktifkannya, yaitu
Tentukan port mana yang akan digunakan.
Enable clock dari port yang digunakan.
Berikut adalah contoh perintah untuk mengaktifkan clock periperal GPIO pada port D dan
USART1, dengan menggunakan standart periperal library:
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
Seluruh perintah terkait dengan aktivasi clock dapat dilihat dalam standart
peripheral library file driver – stm32f4xx_rcc.c. Ketika ingin mengaktifkan port yang
lainnya maka perintah untuk meng-enable hanya cukup dengan mengganti “D” pada
GPIOD, tergantung pada port yang akan digunakan. Pada STM32F4 Discovery
mempunyai enam buah port yaitu:
GPIOA sampai GPIOE mempunyai 16 pin dan GPIOH hanya mempunyai 2 pin.
Penomoran pin dimulai dari 0 sampai dengan 15, dengan nomor 0 adalah LSB (Least
significant Bit) dan nomor 15 adalah MSB (Most Significant Bit). Pada STM32F4-
Discovery terdapat 4 buah pin output yang terhubung dengan LED, yaitu di PORTD pin
15, pin 14, pin 13 dan pin 12. Hampir semua pin input digital dari chip stm32f4xx adalah
5v tolerant, artinya pin input dapat menerima tegangan 5v walaupun chip bekerja pada
tegangan 3v. berikut adalah stuktur dasar dai pin port I/O 5v tolerant.
Inisialisasi
Langkah pertama untuk inisialisasi adalah mendefinisikan data struktur dari GPIO yang
disebut GPIO_InitStruct. Perintah yang digunakan adalah:
GPIO_InitTypeDef GPIO_InitStruct;
Pada perintah diatas tanda “&” menngidentifikasikan alamat data (struktur GPIO).
Contoh konfigurasi GPIO secara lengkap, seperti berikut ini:
void initGPIO (void){
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
GPIO_InitTypeDef(GPIO_InitStruct);
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_15 | GPIO_Pin_14 |
GPIO_Pin_13 | GPIO_Pin_12;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOD, &GPIO_InitStruct);
}
Pada file stm32f4xx_gpio.h terdapat method untuk memudahkan mengakses I/O seperti
dibawah ini.
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin,
BitAction BitVal);
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);
void GPIO_ToggleBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
Contoh:
Program menyalakan LED di PORTD 12-15:
GPIO_SetBits(GPIOD,GPIO_Pin_12| GPIO_Pin_13| GPIO_Pin_14|
GPIO_Pin_15);
GPIO_SetBits(GPIOD, 0xF000);
GPIO_WriteBit(GPIOD, 0xF000, 1);
GPIO_Write(GPIOD, 0xF000);
Percobaan
Peralatan.
1. IDE Keil uVision MDK v5
2. Board STM32F4-Discovery
3. ST-Link debugger
Prosedur Praktikum
1. Pada modul ini akan menggunakan port GPIO, sehingga pastikan file libary
dari GPIO yaitu “stm32f4xx_gpio.h” sudah masuk dalam satu project yang
dibuat. Atau jika belum ada, dapat anda tambahkan di “Manage Run-Time
void GPIO_Initialize(void) {
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Otype = GPIO_Otype_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13
|GPIO_Pin_14 |GPIO_Pin_15;
GPIO_Init(GPIOD, &GPIO_InitStructure);
}
int main(void){
GPIO_Initialize();
for(;;){
GPIO_SetBits(GPIOD, GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14
| GPIO_Pin_15 );
}
}
void GPIO_Initialize(void) {
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13
|GPIO_Pin_14 |GPIO_Pin_15;
GPIO_Init(GPIOD, &GPIO_InitStructure);
}
int main(void){
GPIO_Initialize();
for(;;){
GPIO_SetBits(GPIOD, GPIO_Pin_12| GPIO_Pin_13 |GPIO_Pin_14
|GPIO_Pin_15);
delay(10000000);
GPIO_ResetBits(GPIOD, GPIO_Pin_12| GPIO_Pin_13 |GPIO_Pin_14
|GPIO_Pin_15);
delay(10000000);
}
}
void GPIO_Initialize(void) {
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13
|GPIO_Pin_14 |GPIO_Pin_15;
GPIO_Init(GPIOD, &GPIO_InitStructure);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
}
}
/**
* Metode yang perlu disebut dalam SysTick_Handler
*/
void TimeTick_Decrement(void) {
if (sysTickCounter != 0x00) {
sysTickCounter--;
}
}
void delay_us(u32 n) {
sysTickCounter = n;
void delay_1ms(void) {
sysTickCounter = 1000;
while (sysTickCounter != 0) {
}
}
void delay_ms(u32 n) {
while (n--) {
delay_1ms();
}
}
void SysTick_Handler(){
// Vector penundaan SysTick
TimeTick_Decrement();
}
void GPIO_Initialize(void) {
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13
|GPIO_Pin_14 |GPIO_Pin_15;
GPIO_Init(GPIOD, &GPIO_InitStructure);
}
int main(void){
GPIO_Initialize();
SysTick_Init();
for(;;){
GPIO_ToggleBits(GPIOD, GPIO_Pin_12);
delay_ms(500);
}
}
void SysTick_Init(void);
void TimeTick_Decrement(void);
void delay_nus(u32 n);
void delay_1ms(void);
void delay_ms(u32 n);
#endif
Tugas
1. Buatlah program jika Push Botton ditekan maka semua LED akan nyala, dan
bila ada penekanan lagi maka semua LED akan mati. Begitu seterusnya.
2. Buatlah program, pada kondisi awal semua LED pada kondisi mati, LED akan
nyala satu per satu ketika PB ditekan sampai nyala semua, dan ketika semua
nyala LED akan mati satu per satu ketika PB ditekan.
Catatan:
Tugas langsung dikumpulkan bersama laporan sementara.
Pada percobaan pertama ini akan menyalakan 4 buah LED pada Port 12, 13, 14, 15.
Pertama harus melakukan inisialisasi, yaitu mendefinisikan data struktur dari GPIO yang
disebut GPIO_InitStruct. Lalu pada baris program selanjutnya yaitu GPIO_Mode =
GPIO_Mode_OUT, perintah tersebut digunakan untuk mengatur mode yang digunakan yaitu
mode OUT. Kemudian kecepatan clock diatur dengan perintah GPIO_Speed sebesar 50MHz.
GPIO_Otype_PP mendefinisikan bagaimana output transistor dengan konfigurasi push/pull.
Lalu, GPIO_Pupd_UP mendefinisikan bagaimana resistor terpasang di pin output dengan
konfigurasi UP yaitu menambahkan ressistor pull-up di pin output, dengan demikian kondisi
normal adalah high. GPIO_Pin digunakan untuk menentukan pin port yang digunakan, pada
percobaan ini akan menyalakan 4 LED, sehingga port yang digunakan adalah GPIO_Pin_12
sampai GPIO_Pin_15.
Pada program main, akan memanggil fungsi GPIO_Initialize, lalu melakukan looping
untuk fungsi projek1(), yang berisi perintah SetBits yaitu untuk menyalakan LED.