17 Temmuz 2018 Salı

STM32 VL Discovery ile ARM Programlama - 16x2 LCD Kullanımı



Merhaba arkadaşlar,
Bu yazımda sizlerle STM32VLDISCOVERY kartını kullanarak LCD sürme kodlarını paylaşacağım. Kodları gitHub'dan buldum bir kaç küçük düzeltme yaptım ve yapmaya devam da edeceğim, linkini bırakıyorum.

https://github.com/applefreak/STM32-HD44780

Öncelikle şunu belirtmek isterim ki, bu yazıyı okumadan önce PIC,Arduino vs. ile LCD kullandığınızı varsayıyorum. 

Paylaşacağım kodlara göre aşağıdaki bağlantıları yapmanız gerekiyor.

RS -----> Pin C0
EN -----> Pin C1
RW -----> Toprak
D4 -----> Pin C4
D5 -----> Pin C5
D6 -----> Pin C6
D7 -----> Pin C7  

Aşağıda paylaşacağım kodları lcd.c ve lcd.h isimli iki dosya oluşturup içine kaydetmeliyiz. Daha sonra bu dosyaları projemizin bulunduğu klasörün içine atmalıyız.

Kütüphanenin projeye dahil edilmesi ve kullanılması ile ilgili çektiğimi YouTube videom aşağıda,




Kütüphane Kodları ↓↓↓↓↓↓↓↓

2 Temmuz 2018 Pazartesi

STM32 VL Discovery ile ARM Programlama - Delay Kütüphanesi

Bu yazımda sizlerle yeni bulduğum ve sağlıklı olduğunu düşündüğüm bir delay kütüphanesi paylaşacağım. Daha önce paylaşmış olduğum delay fonksiyonu çok sağlıklı değildi , fakat bu paylaşacağım kütüphane, sistem saatini kullanmakta ve bu yüzden de tam sonuç vermekte.

delay.c

// Delay functions using SysTick timer
// Minimal delay length is 1ms

#include "delay.h"


// Delay counter
static __IO uint32_t DelayCounter;


// SysTick interrupt handler
void SysTick_Handler(void) {
   DelayCounter++;
}

// Initialize delay functions
// note: configures the SysTick counter, must be called each time when the core
//       clock has been changed
void delay_init(void) {
   // Set reload register to generate IRQ every millisecond
   SysTick->LOAD = (uint32_t)(SystemCoreClock / (1000UL - 1UL));

   // Set priority for SysTick IRQ
   NVIC_SetPriority(SysTick_IRQn,(1 << __NVIC_PRIO_BITS) - 1);

   // Set the SysTick counter value
   SysTick->VAL = 0UL;

   // Set SysTick source and IRQ
   SysTick->CTRL = (SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_TICKINT_Msk);
}

// Do a delay for a specified number of milliseconds
// input:
//   ms - number of milliseconds to wait
void delay_ms(uint32_t ms) {
   // Enable the SysTick timer
   SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;

   // Wait for a specified number of milliseconds
   DelayCounter = 0;
   while (DelayCounter < ms);

   // Disable the SysTick timer
   SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
}

// Do a delay for a specified number of milliseconds, MCU in sleep mode
// input:
//   ms - number of milliseconds to wait
// note: all wake-up flags must be cleared before calling this function
//       to ensure proper sleep during delay
void delaysleep_ms(uint32_t ms) {
   // Enable the SysTick timer
   SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;

   // Set delay counter
   DelayCounter = 0;

   // Wait for a specified number of milliseconds
   while (DelayCounter < ms) {
      __WFI();
   }

   // Disable the SysTick timer
   SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
}

delay.h


#ifndef __DELAY_H
#define __DELAY_H

#include "stm32f10x.h"                  // Device header


// Function prototypes
void delay_init(void);
void delay_ms(uint32_t ms);
void delaysleep_ms(uint32_t ms);

#endif // __DELAY_H


Ya da;

delay.h

#include "stm32f0xx.h"                  // Device header
#ifndef __DELAY_H
#define __DELAY_H


void SysTick_Handler(void);
void delay_ms(__IO uint32_t time);
void delay_init(void);
#endif // __DELAY_H

delay.c

#include "delay.h"

uint32_t TimingDelay;
void SysTick_Handler(void) // Her 1ms'de bir olusacak kesmeyi yakaladigimiz fonksiyonumuz
{
if (TimingDelay != 0) // TimingDelay'in degeri sifirdan farkli ise çalistir.
    {
    TimingDelay --; //TimingDelay'in degeri bir azaltir.
    }
}

void delay_ms(__IO uint32_t time) // Delay Fonksiyonumuz
{
  TimingDelay = time; //Kesme fonksiyonunda kullanacagimiz degiskenin degerini ayarliyoruz
  while(TimingDelay != 0); //TimingDelay degiskeninin degeri sifirdan farkli oldugu sürece döngüde kal.
} 
void delay_init(void)
{
 SystemInit();
 SysTick_Config(SystemCoreClock/1000);
}


Bu iki dosyayı oluşturduktan (ister üstteki ister alttaki) sonra kullanmak istediğimiz proje klasörünün içine kopyalıyoruz. GPIO ayarlarını yaptıktan sonra delay_init() fonksiyonunu kullanarak kütüphaneyi hazır hale getiriyoruz. delay fonksiyonumuz artık hazır hale gelmiş oluyor :).

Kullandığınız mikrodenetleyiciye göre include kısmını değiştirmeyi unutmayın :).

Video;