STM32 - ARM Cortex M

STM32 – Register ile DAC

Herkese merhabalar , bu bloğumuzda Regsiter ile nasıl ADC sürülür onu göreceğiz.

Bu bloğk’da Registerları kullandık fakat and(&) ,or(|)  veya kaydırma(<<,>>) bitlerini kullanmadık bunun yerine Registerları Hexdecimal atamalar ile kullandık.


DAC_Channel1  =  PA4
DAC_Channel2 =  PA5
– Elinizde bulunan kartın  “Referance Manuel” dökümanındaki DAC bölümünü inceleyin.


1- Kütüphane ekleyerek başlıyoruz.
#include "stm32f4xx.h"

2- void RCC_Config(void) adında bir değişken oluşturuyoruz ve içerisini kodluyoruz. Bu işlemi daha önceki yazılarımda ayrıntılı anlatım
[button text=”Tıkla ve git” new_tab=”yes” size=”small” icon=”” url=”https://samettasoglu.com/2023/03/14/stm32f407vg-register-ile-system-clock-ayari/”]

3- GPIO_Config(void)  adında bir fonksiyon oluşturuyoruz ve içerisini GPIO ile ilgili işlemleri kodluyoruz.

void GPIO_Config(){
RCC->AHB1ENR |= 0x00000001;      // A Portunu aktif ettik
GPIOA->MODER |= 0x00000100;      // 4. pin Alternatif Fonksiyon olarak secildi
GPIOA->OSPEEDR |= 0x00000300;    // Hızını max olarak ayarlandı
GPIOA->PUPDR |= 0x00000000;      // Pull up Pull down yok
}

3- void DAC1_Config(void) adında bir fonksiyon oluşturuyoruz ve içerisini DAC ile ilgili işlemleri kodluyoruz.

void DAC1_Config(void){
RCC->APB1ENR |= 0x20000000;  // DAC biriminin bağlı olduğu clock hattıbı aktif ettik
DAC->CR |= 0x00000001;       // 0.enable (EN1)
DAC->SWTRIGR |= 0x00000000;  // Channel1'in yazılımsal olarak tetiklemesini kapatık
DAC->DHR12R1 |= 0x00000000;  // İlk olarak tüm dataları sıfırladık (1.Channel , 12 bit , Sağa yatık veri)
}

4- Delay fonksiyonu oluşturduk.

void delay(uint32_t time){
while(time--);
}

5-  12 bitlik değerleri for döngüsüne yazdırmak için bir değişken tanımladık
int i = 0;

6- main() fonksiyonunun içerisineki while(1) döngüsünü içerisine ;
for(;i<4095;i++){
DAC->DHR12R1 = i;
delay(16800);
}

Bu kod; 12bir sağa yatmış verinin adresine giderek değerleri oraya gönderdik , bu değerler i nin kendisi oluyor.
Dökümanın içerisini incelediğimizde  DAC_DOR1 adlı Register ile çıkış veriliyor fakat biz burda DHR12R1

 


Tüm kod:

#include “stm32f4xx.h”

void RCC_Config(void) {

RCC->CR &= ~(1 << 0);
RCC->CR |= (1 << 16);
while (!(RCC->CR & (1 << 17)));
RCC->CR |= (1 << 19);

RCC->PLLCFGR = 0;
RCC->PLLCFGR |= (1 << 22);
RCC->PLLCFGR |= (1 << 2);
RCC->PLLCFGR |= (168 << 6);
RCC->PLLCFGR |= (0 << 24);

RCC->CR |= (1 << 24); // PLL on, wait until ready
while ((RCC->CR & (1 << 25)) == 0);

RCC->CFGR &= ~(3 << 0);
RCC->CFGR &= ~(0xF << 4);
RCC->CFGR |= (101 << 10);
RCC->CFGR |= (100 << 13);

RCC->CIR |= (1 << 19);
RCC->CIR |= (1 << 20);

}

void GPIO_Config(){
RCC->AHB1ENR |= 0x00000001;
GPIOA->MODER |= 0x00000100;
GPIOA->OSPEEDR |= 0x00000300;
GPIOA->PUPDR |= 0x00000000;
}

void DAC1_Config(void){
RCC->APB1ENR |= 0x20000000;
DAC->CR |= 0x00000001;
DAC->SWTRIGR |= 0x00000000;
DAC->DHR12R1 |= 0x00000000;
}

void delay(uint32_t time){
while(time–);
}

int i = 0;

int main(void)
{
RCC_Config();
GPIO_Config();
DAC1_Config();

while (1)
{
for(;i<4095;i++){
DAC->DHR12R1 = i;
delay(16800);
}

}
}

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Başa dön tuşu