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);
}
}
}
