MikroC ile STM peripheral library kullanımı

Başlatan MCansız, 01 Şubat 2015, 22:30:32

MCansız

Herkese Merhaba

MikroC arm derleyicisi ile STM32f4-discovery kit ile adc uygulaması yaparken mikroc adc kütüphanesinin yanlızca 12-bit olarak çalıştığını gördüm kendi projemde 8-bit olarak kullanmak istiyorum bunun üzerine araştırma yaptım ve anlatmaya geçiyorum.

MikroC de hem kendi kütüphanelerini hemde STM peripheral kutuphanerini beraber olarak kullana biliyoruz bunun için ilgili işlemcinin (bu yazıda STM32F4xx standard peripheral library kullanılmıştır.) kütüphanerini indirip projemize eklemek veya ekte paylaştığım hazır mikroC projesini açarak üzerinde değişiklikler yapabilirsiniz.

Neden bu kutuphaneleri kullanayım ?

-MikroC nin kendi kütüphaneleri çok güzel ama eksik yönleri de var öneğin adc çözünürlüğü gibi
-internette ve formumuzda birçok kişi bu kütüphaneleri kullanıyor birçok örnek paylaşıyor bunları direk kendi projenizde kullanabilirsiniz vs..

STM32F4xx standard peripheral library eklendikten sonra tools->options->output settings sekmesine gelip  Case sensitive kutusunu işaretliyoruz daha sonra kullancagımız header dosyalarını projemize ekliyoruz (#include "stm32f4xx.h" vs..)

Not: Eger projede STM standard peripheral kutuphane eklenmediğinde bu kutu işaretli ise derleme esnasında hata alırsınız.

Artık projemizi derleyebiliriz.

Burada değinmem gereken bir nokta var normalde mikroc de osilatör ayarlarını  Project-> Edit project arayüzü ile yapıyoruz ve bizim eklediğimiz  STM standard peripheral kütüphanenesinde bununan
SystemInit() fonksiyonundaki osilatör ayarlarımı geçerli yoksa mikroc ayarlarımı geçerli bunu nasıl anlayacağız ?

Eger ben mikroC nin arayüzü geçerli olmasını istiyorsam SystemInit()  fonksiyonunu kullanmicam yani main fonksiyonunda osilatörle ilgili tüm ayarlamaları silin ve projenize system_stm32f4xx.c kutüphanesini eklemeyin aksi halde proje derlenir, yüklenir ama çalışmaz !

Osilatör ayarlarını   SystemInit() veya  system_stm32f4xx.c  fonksiyonunda ayarlayacağım Mikroc ayarlarını kullanmıyorum diyorsanız Project->edit project arayüzünü açıp Data Type Size bölümünden other(in 4 byte) seçmek ve onaylamak

UYGULAMA

STM32f407vg ile 8-bit adc uygulaması yapalım

PA5 analog portundan analog okuyup Lcd ekranda gösterelim
adc ve gpio için STM32F4xx standard peripheral kütüphanesini
LCD için Mikroc kütüphanesini kullananacağım

projede kullandığım SystemInit()  fonksiyonu.. osc 168 mhz

/////////////////////////////////

void SystemInit()
{
unsigned int i;

   (*((int*)0xE000ED88))|=0x0F00000;
    for (i=0;i<0x00100000;i++);          // OSC oturtma ve kurtarma rutini
    RCC->CFGR |= 0x00009400;         // AHB ve APB hizlarini max degerlere set edelim
    RCC->CR |= 0x00010000;            // HSE Xtal osc calismaya baslasin
    while (!(RCC->CR & 0x00020000));// Xtal osc stabil hale gelsin
    RCC->PLLCFGR = 0x07405408;      // PLL katsayilarini M=8, N=336, P=2 ve Q=7 yapalim
//  RCC->PLLCFGR = 0x07402A04;     // PLL katsayilarini M=4, N=168, P=2 ve Q=7 yapalim
    RCC->CR |= 0x01000000;            // PLL calismaya baslasin  (Rehber Sayfa 95)
    while(!(RCC->CR & 0x02000000)); // Pll hazir oluncaya kadar bekle
//  FLASH->ACR = 0x00000705;        // Flash ROM icin 5 Wait state secelim ve ART yi aktif edelim (Rehber Sayfa 55)
    FLASH->ACR = 0x00000605;        // Flash ROM icin 5 Wait state secelim ve ART yi aktif edelim (Rehber Sayfa 55)
    RCC->CFGR |= 0x00000002;        // Sistem Clk u PLL uzerinden besleyelim
    while ((RCC->CFGR & 0x0000000F) != 0x0000000A); // Besleninceye kadar bekle

}





proje main.c

projede osilatör ayarı için  SystemInit()  fonksiyonun kullandığımdan Data Type Size bölümünden other(in 4 byte) seçtim

main.c

#include "stm32f4xx.h"
#include "stm32f4xx_gpio.h"
#include "stm32f4xx_usart.h"
#include "stm32f4xx_rcc.h"
#include "stm32f4xx_adc.h"
#include <stdio.h>
#include "misc.h"

sbit LCD_RS at GPIOE_ODR.B0;
sbit LCD_EN at GPIOE_ODR.B1;
sbit LCD_D4 at GPIOE_ODR.B2;
sbit LCD_D5 at GPIOE_ODR.B3;
sbit LCD_D6 at GPIOE_ODR.B4;
sbit LCD_D7 at GPIOE_ODR.B5;

int txt[10];
int ConvertedValue = 0;

void SystemInit()
{
unsigned int i;

   (*((int*)0xE000ED88))|=0x0F00000;
    for (i=0;i<0x00100000;i++);          // OSC oturtma ve kurtarma rutini
    RCC->CFGR |= 0x00009400;         // AHB ve APB hizlarini max degerlere set edelim
    RCC->CR |= 0x00010000;            // HSE Xtal osc calismaya baslasin
    while (!(RCC->CR & 0x00020000));// Xtal osc stabil hale gelsin
    RCC->PLLCFGR = 0x07405408;      // PLL katsayilarini M=8, N=336, P=2 ve Q=7 yapalim
//  RCC->PLLCFGR = 0x07402A04;     // PLL katsayilarini M=4, N=168, P=2 ve Q=7 yapalim
    RCC->CR |= 0x01000000;            // PLL calismaya baslasin  (Rehber Sayfa 95)
    while(!(RCC->CR & 0x02000000)); // Pll hazir oluncaya kadar bekle
//  FLASH->ACR = 0x00000705;        // Flash ROM icin 5 Wait state secelim ve ART yi aktif edelim (Rehber Sayfa 55)
    FLASH->ACR = 0x00000605;        // Flash ROM icin 5 Wait state secelim ve ART yi aktif edelim (Rehber Sayfa 55)
    RCC->CFGR |= 0x00000002;        // Sistem Clk u PLL uzerinden besleyelim
    while ((RCC->CFGR & 0x0000000F) != 0x0000000A); // Besleninceye kadar bekle

}

void adc_configure(){

 ADC_InitTypeDef ADC_init_structure; //Structure for adc confguration
 GPIO_InitTypeDef GPIO_initStructre; //Structure for analog input pin

 //Clock configuration
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);//The ADC1 is connected the APB2 peripheral bus thus we will use its clock source
 RCC_AHB1PeriphClockCmd(RCC_AHB1ENR_GPIOCEN,ENABLE);//Clock for the ADC port!! Do not forget about this one ;)

 //Analog pin configuration
GPIO_StructInit(&GPIO_initStructre);
 GPIO_initStructre.GPIO_Pin = GPIO_Pin_5;//The channel 10 is connected to Pa5
 GPIO_initStructre.GPIO_Mode = GPIO_Mode_AN; //The PA5 pin is configured in analog mode
 GPIO_initStructre.GPIO_PuPd = GPIO_PuPd_NOPULL; //We don't need any pull up or pull down
 GPIO_Init(GPIOA,&GPIO_initStructre);//Affecting the port with the initialization structure configuration

 //ADC structure configuration
 ADC_DeInit();
 ADC_init_structure.ADC_DataAlign = ADC_DataAlign_Right;//data converted will be shifted to right
 ADC_init_structure.ADC_Resolution = ADC_Resolution_8b;//Input voltage is converted into a 12bit number giving a maximum value of 4096
 ADC_init_structure.ADC_ContinuousConvMode = ENABLE; //the conversion is continuous, the input data is converted more than once
 ADC_init_structure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1;// conversion is synchronous with TIM1 and CC1 (actually I'm not sure about this one :/)
 ADC_init_structure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;//no trigger for conversion
 ADC_init_structure.ADC_NbrOfConversion = 1;//I think this one is clear :p
 ADC_init_structure.ADC_ScanConvMode = ENABLE;//The scan is configured in one channel
 ADC_Init(ADC1,&ADC_init_structure);//Initialize ADC with the previous configuration

 //Enable ADC conversion
 ADC_Cmd(ADC1,ENABLE);

 //Select the channel to be read from
 ADC_RegularChannelConfig(ADC1,ADC_Channel_5,1,ADC_SampleTime_480Cycles);
 
}

int adc_convert(){
 ADC_SoftwareStartConv(ADC1);//Start the conversion
 while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC));//Processing the conversion
 return ADC_GetConversionValue(ADC1); //Return the converted data
}

 main(void){    
                SystemInit();
                adc_configure();

                Lcd_Init();
                Lcd_Cmd(_LCD_CURSOR_OFF);
                Lcd_Cmd(_LCD_CLEAR);

                Lcd_Out(1,1,"adc olcum");

     while(1)
                {
                        ConvertedValue = adc_convert();//Read the ADC converted value
                        IntToStr(ConvertedValue,txt) ;

                        Lcd_Out(2,1,txt);

                }


}


proje dosyasını buradan indirebilirsiniz

https://drive.google.com/file/d/0B6kE5UwAIcnNbWhRaGhjcE5rQ1k/view?usp=sharing

tekosis

elinize sağlık. konuyu favorilerime ekledim.
İlim ilim bilmektir, ilim kendin bilmektir, sen kendin bilmezsin, bu nice okumaktır.

Karamel

Hocam anlatiminiz icin oncelikle cok tesekkur ederiz. ben birsey merak ediyorum hocam. st  nin cubex programi iar yada keil a kod ciktisi veriyor hatta bunun ile ilgili hazir proje bile olusturuyor. acaba cubex ile hazir kod olustursak. sonrasinda mikroc ile devam edebilirmiyiz?

MCansız

bildiğim kadarı ile cubex hall kütüphanelerini kullanıyor bu kütüphaneler hakkında bir bilgim yok

hazır kod oluşturunca kodda neler var yani osilatör ayarları gipio vs.. mi yapılıyor

Mikroc  derleyicisi ansi C formatındaki yazılımları derleyebiliyor eğer bu oluşturduğunuz hazır kodlar bu formatta ise derlenebilir

LukeSkywalker


MCansız

#5
kendime o kadar gülüyorum ki sırf 8-bit adc kullanayım diye tutup stm kütüphanelerini projeme ekledim o kadar uğraştım :D

halbuki ilgili registere ulaşıp adc ayarlamasından sonra ADC1_CR1bits.RES=2; kodunu yazmak yeterli geldi bunu neden önceden düşünemedim ilginç

LukeSkywalker

Bu kütüphaneleri mikroC derleyicisinde kullanmak isteyen arkadaşlar vardı. Onlar için yararlı oldu. Daha önce birkaç ingilizce link paylaşmıştım farklı konular altında ama başlığının açılması iyi oldu.

universitelim54

o kadar ugrasmama ragmen standart stm32f4 kutuphanesını eklemeyı basaramdım.Halen keılde kullandıgım komutları mıcroc de kullanamıyorum.altı cızılı gosterıyr.Yardım edersenız sevınırım.Saygılarımla

MCansız

Paylaştığım proje dosyasını idirip üzerinde değişiklikler yapın normaldede altı kırmızı gösteriyor ama derleniyor bahsettiğim ayarlarıda yapın bu arada

ogy

STM peripheral library' lerin MikroC ile kullanılabileceğini birçok kişi söylemişti ama örneklendirilmesi çok güzel oldu.Teşekkürler.

Karamel

internette gezinirken su linki http://embedded-lab.com/blog/?p=10038 buldum. bruadada ayni konu anlatilmis.