MBED ile STM32F103C8 Kullanımı
|Merhaba,
Bu konuda ST firmasının en çok kullanılan denetleyicilerinden olan STM32F103C8 kartını MBED ile nasıl programlayabileceğimize değineceğiz. Daha önceden MBED fimrasının kendi ide’ si olan MBED Studio’ dan bahsetmiştik. İlgili konuya bağlantıdan ulaşabilirsiniz. MBED Studio için yayınlanan yeni güncelleme ile birlikte MBED desteği olan kartlar için programlanacak cihazı seçebilme imkanı sunuyor. Yani siz ucuz ve çok kullanılan ST-Link modülleri ile MBED desteği olan herhangi bir mikrodenetleyiciyi programlayabilmektesiniz. Bunu son güncellemeden önce de yapmak mümkündü. Ancak biraz daha fazla uğraştıran bir işlemdi. Artık MBED Studio arayüzü üzerinden rahatlıkla programlama işlemi gerçekleştirilebilmektedir. Bu konuda basit bir örnek olsun diye STM32F103C8 kartı ile UART uygulaması yapacağız.
Öncelikle MBED Studio kullanırken yapmamız gereken ayarlardan bakalım. MBED Studio çok karmaşık bir IDE olmadığından aslında her şey çok basit. MBED Stduio açıkken bilgisayara ST-Link bağlarsanız aşağıdaki şekilde bir ekran ile karşılaşacaksınız. Bu yazıda Debug cihazı bağlandığını, onu tanımadığı için konfigure etmeniz gerektiğini söylemekte.
Yukarıdaki resimde gösterilen kutuda “Yes” butonuna bastığınızda yine çok karmaşık olamayan bazı ayarlar ile karşılaşacaksınız. Aşağıda resmi verilen ayar penceresinde girmemiz gereken 3 adet bilgi bulunmakta. Bunlardan ilki cihaza verdiğimiz isim. Tamamen keyfi bir isim verebilirsiniz. İkincisi ST-Link’ in bağlı olduğu denetleyici modeli. F103C8 kullanmamıza rağmen ayar ekranında F103RB seçiyoruz. Çünkü sadece bu mevcut.
Deploy and debug target olarak ise STM32F103C8 seçebiliriz. F103C8 ile F103RB arsaında neredeyse hiç fark bulunmamakta. Sadece F103RB’ nin flash belleği biraz daha büyük. Eğer sizde “Deploy ve Debug Target” kutusunda F103CB ile derleme gerçekleşmezse o kutuda da F103RB seçerek deneme yapmanızı tavsiye ederim. Bu sefer derleme sorunsuz gerçekleşecektir. Bende Keil yüklü olduğu için onun GCC derleyicileri ile sorunsuz derliyor olabilir. Kaldırıp deneme yapmak istemedim. Ancak yüklemeyi F103C8′ e yapacağımız için yazacağınız yazılımın 64 kbyte’ ı geçmemesine dikkat etmelisiniz.
Bu kısımdan sonra MBED Stduio’ da ek olarak yapacağımız bir ayar kalmadı. Artık önceki konuda da verdiğimiz şekilde kütüphaneleri ekleyip yazılımınızı yazarak STM32 denetleyicinizi programlayabilirsiniz. Bu sitede anlatılan yöntem ile bezer serilerdeki farklı denetleyicileri de programlayabilirsiniz. Şimdi MBED OS 6 ile gelen bazı değişikliklerden bahsedeceğim ve yapacağımız uygulamaya bazılarını dahil etmeye çalışacağım. Bu değişiklikler bağlantıda verilen sayfanın en sonunda verilmiştir.
MBED OS’de yapılan değişikliklerden bence en önemlisi Serial sınıfında yapılan değişiklikler. Çünkü bu sınıfı seri haberleşme yapmak için hemen herkes tarafından sıklıkla kullanılmakta. Özellikle interrupt işlemlerinde yeni sınıfların kullanılmaması ilginç sorunlara sebebiyet vermekte. MBED 6′ da gelen yeniliklerden de bahsettiğimize göre uygulamamızı verebiliriz. Yapacağımız uygulamada seri haberleşme interrupt’ larını kullanarak klavyeden gelen tuşa göre 3 tane LED’ in durumunu değiştirelim.
Öncelikle yazılımda gerekli tanımlamaları yapalım. Burada “UnbufferedSerial” sınıfı kullanacağız. Bu sınıf MBED OS 2′ de rawserial olarak kullanılmaktaydı.
// unbuffered serial = rawserial (Mbed OS 2)
// PA_9 => TX
// PA_10 => RX
UnbufferedSerial pcSerial(PA_9, PA_10);
// LED pinouts
DigitalOut led1(PB_12);
DigitalOut led2(PB_13);
DigitalOut led3(PB_14);
DigitalOut led4(PC_13);
Klaveyeden gelen karakterleri yakalamak için UART interrupt’ u kullanacağız. Bunu önceki MBED versiyonlarında olduğu gibi “attach” fonksiyonu ile gerçekleştirebilemekteyiz.
// Rx_interrupt function used for serial receive interrupt procecess
pcSerial.attach(&Rx_interrupt, SerialBase::RxIrq);
Şimdi veri seri porttan veri geldiğinde çalışacak interrupt fonksiyonunu ayarlıyalım. Klavyeden gönderilen “a , s ve d” karakterlerine göre 3 adet LED’ i toggle yapacak şekilde ayarlayalım. Interrupt fonksiyonumuz şu şekildedir
// rx interrupt funciton
void Rx_interrupt()
{
char c;
// read 1 byte from uart buffer
pcSerial.read(&c, 1);
// toggle LED' s according to received char
if(c == 'a')
{
led1 = !led1;
}else if(c == 's')
{
led2 = !led2;
}else if(c == 'd')
{
led3 = !led3;
}
}
“UnbufferedSerial” sınıfı kullandığımız için seri porttan gelen verileri okumak için önceki örneklerden farklı bir fonksiyon kullandım. Yazma işlemi yapacaksak benzeri bir fonksiyon kullanmamız gerekiyor. Yazma işlemi için gerekli fonksiyon “pcSerial.read(char_array, length)” şeklindedir. Buna örnek olması açısından main loop’ a “Hello World” yazısı ekleyelim.
// main loop
while (true) {
// toggle onboard LED which is connected to PC_13
led4 = !led4;
// prepare send buffer with sprintf function
int len = sprintf(arr, "Hello World: %d\n\r", cnt++);
// send buffer using UART
pcSerial.write(arr, len);
// wait 500ms
ThisThread::sleep_for(500);
}
Basit bir uygulama olduğu için bağlantı şeması eklemeyeceğim. UART haberleşmesi için “PA9” ve “PA10” pinlerine FTDI döndüştürücü bağlamayı unutmayın. Çünkü kullandığımız ST-Link, USB üzerinden bize UART bağlantısı vermiyor. Zaten yazılımda da TX ve RX olarak kullanılan pin isimlerini belirttik. Yazılımın tamamı aşağıda mevcuttur. MBED OS 6 ile daha kapsamlı uygulamalar paylaşmaya çalışacağım. İyi çalışmalar dilerim…
/* mbed Microcontroller Library
* Copyright (c) 2019 ARM Limited
* SPDX-License-Identifier: Apache-2.0
*/
#include "mbed.h"
#include <stdio.h>
// unbuffered serial = rawserial (Mbed OS 2)
// PA_9 => TX
// PA_10 => RX
UnbufferedSerial pcSerial(PA_9, PA_10);
// LED pinouts
DigitalOut led1(PB_12);
DigitalOut led2(PB_13);
DigitalOut led3(PB_14);
DigitalOut led4(PC_13);
// rx interrupt funciton
void Rx_interrupt()
{
char c;
// read 1 byte from uart buffer
pcSerial.read(&c, 1);
// toggle LED' s according to received char
if(c == 'a')
{
led1 = !led1;
}else if(c == 's')
{
led2 = !led2;
}else if(c == 'd')
{
led3 = !led3;
}
}
int main()
{
// Initialise the digital pin LED1 as an output
pcSerial.baud(115200);
char arr[20];
char cnt = 0;
//Rx_interrupt function used for serial receive interrupt procecess
pcSerial.attach(&Rx_interrupt, SerialBase::RxIrq);
// main loop
while (true) {
// toggle onboard LED which is connected to PC_13
led4 = !led4;
// prepare send buffer with sprintf function
int len = sprintf(arr, "Hello World: %d\n\r", cnt++);
// send buffer using UART
pcSerial.write(arr, len);
// wait 500ms
ThisThread::sleep_for(500);
}
}