STM32F103 ile wav dan ses üretme ( SD kart Olmadan )

M_B

Aktif Üye
Katılım
16 Şubat 2023
Mesajlar
174
Stm32f103 ile SD kart olmadan icine gömülü olan 1-2 adet wav dosyasını çalmak istiyorum.
( wav dosyalar hex olarak Stm32f103 icine kayıt edilecek. )
Bu konuda yonlendirme ve tecrubelerinizden yararlanmak isterim.

Teşekkürler.
Mehmet


Burda @Mikro Step hocanın zamanında çalışma yaptığı uygulama var.
 
Prensip geregi yazdigim kodlari asla yayinlamam ama bu bir ilk ve istisna olsun. (Sadece SD kart rutinlerini yok)
Yanlis hatirlamiyorsamislemci STM32F030 idi. STM32F103C8 icin kod cok daha basit yazilir. C ile kodlarsan cok cok kisa olur.

Isin icinde SD kart olmazsa kisa sureli sesler saklayabilirsin.

Biraz kaliteli olsun dersen 8Khz ses 16 bin byte yer ister.
Ahizeli telefondaki kalite yeterli dersen 3Khz ses 6 bin byte yer ister.
her bir veri 8 Bit

Videodaki sesler 22Khz ile orneklendi diye hatirliyorum. Sanirim her bir veri 12 Bitti. SD kartta yer sorunu olmadigi icin hoyratca davrandim.

Esasen tum yapilan is, sayisallastirilmis ham ses verilerini pwm teknigi ile sese donusturmekten ibaret.

Initialize rutini:
             PRESERVE8
             THUMB
 
             INCLUDE MyAsmVar.S
             INCLUDE VarOfs.S
             INCLUDE M0_Regs.S
 
Buffer1      EQU    0x20000000
Buffer2      EQU    0x20000210
 
SampleRate   EQU    48000000 / 22050
 
 
             AREA   RESET, CODE, READONLY
 
Reset_       PROC
 
             DCD    0x20001000                     ; Top of Stack
             DCD    Reset                          ; Reset Handler
             DCD    Handler                        ; NMI Handler
             DCD    Handler                        ; Hard Fault Handler
             DCD    0                              ; Reserved
             DCD    0                              ; Reserved
             DCD    0                              ; Reserved
             DCD    0                              ; Reserved
             DCD    0                              ; Reserved
             DCD    0                              ; Reserved
             DCD    0                              ; Reserved
             DCD    Handler                        ; SVCall Handler
             DCD    0                              ; Reserved
             DCD    0                              ; Reserved
             DCD    Handler                        ; PendSV Handler
             DCD    Handler                        ; SysTick Handler
 
             ;      External Interrupts
 
             DCD    Handler                        ; Window Watchdog
             DCD    0                              ; Reserved
             DCD    Handler                        ; RTC through EXTI Line
             DCD    Handler                        ; FLASH
             DCD    Handler                        ; RCC
             DCD    Handler                        ; EXTI Line 0 and 1
             DCD    Handler                        ; EXTI Line 2 and 3
             DCD    Handler                        ; EXTI Line 4 to 15
             DCD    0                              ; Reserved
             DCD    Handler                        ; DMA1 Channel 1
             DCD    Handler                        ; DMA1 Channel 2 and Channel 3
             DCD    Handler                        ; DMA1 Channel 4 and Channel 5
             DCD    Handler                        ; ADC1
             DCD    Handler                        ; TIM1 Break, Update, Trigger and Commutation
             DCD    Handler                        ; TIM1 Capture Compare
             DCD    0                              ; Reserved
             DCD    Handler                        ; TIM3
             DCD    0                              ; Reserved
             DCD    0                              ; Reserved
             DCD    Tim14_Int                      ; TIM14
             DCD    Handler                        ; TIM15
             DCD    Handler                        ; TIM16
             DCD    Handler                        ; TIM17
             DCD    Handler                        ; I2C1
             DCD    Handler                        ; I2C2
             DCD    Handler                        ; SPI1
             DCD    Handler                        ; SPI2
             DCD    Handler                        ; USART1
             DCD    Handler                        ; USART2
 
             ALIGN
 
RamBase      RN     R7
 
             ENTRY
 
Reset        LDR    R0,=0x20000000              ; RAMI SILELIM
             LDR    R1,=0x20001000
             MOVS   R2,#0
RamSil       STR    R2,[R0]
             ADDS   R0,#4
             CMP    R0,R1
             BLT    RamSil
 
 
             LDR    R0,=SYSCFG_BASE
             LDR    R1,=0x00000000
             STR    R1,[R0,#SYSCFG_CFGR1]      ;  Main Flash memory seçildi
 
             LDR    R0,=FLASH_BASE
             MOVS   R1,#0x11      ; 1 Wait State, Prefetch Enb
             STR    R1,[R0,#FLASH_ACR]
 
;            SYSCFG clock enable
 
             LDR    R0,=RCC_BASE
             LDR    R1,=0x00001001        ; SysClk Enable
             STR    R1, [R0,#RCC_APB2ENR]
 
             LDR    R1,=0x00280000        ; PLL x 12, PLL Source HSI
             STR    R1, [R0,#RCC_CFGR]
 
;            LDR    R1,=0x01000000        ; PLL On
             LDR    R1,=0x010000AB        ; PLL On
             STR    R1, [R0,#RCC_CR]
 
WaitPLL      LDR    R1, [R0,#RCC_CR]
             LDR    R2,=0x02000000
             TST    R1,R2
             BEQ    WaitPLL
 
             LDR    R1,=0x00280002        ; PLL x 12, PLL Source HSI, PLL Select
             STR    R1, [R0,#RCC_CFGR]
 
             LDR    R1,=0x00060000
             STR    R1,[R0,#RCC_AHBENR]   ; GPIOA, GPIOB Clk Enb
 
             LDR    R1,=0x00005001        ; USART1, SPI1 Clk Enb
             STR    R1,[R0,#RCC_APB2ENR]
 
             LDR    R1,=0x00000100        ; TIMER14 Clk Enb
             STR    R1,[R0,#RCC_APB1ENR]
 
;            GPIOA TANIMLARI
 
INP          EQU    0x0 ; Input     Mode
OUT          EQU    0x1 ; Output    Mode
ALT          EQU    0x2 ; Alternate Mode
ANA          EQU    0x3 ; Analog    Mode
 
 
             LDR    R0,=GPIOA_BASE
             LDR    R1,=(INP<<30 :OR: \
             ALT<<28 :OR: \
             ALT<<26 :OR: \
             INP<<24 :OR: \
             INP<<22 :OR: \
             INP<<20 :OR: \
             INP<<18 :OR: \
             INP<<16 :OR: \
             ALT<<14 :OR: \
             ALT<<12 :OR: \
             ALT<<10 :OR: \
             ALT<<8 :OR: \
             ALT<<6 :OR: \
             ALT<<4 :OR: \
             INP<<2 :OR: \
             INP)
 
             STR    R1,[R0,#GPIOA_MODER]
 
PP           EQU    0x0 ; Push Pull  Mode
OD           EQU    0x1 ; Open Drain Mode
 
             LDR    R1,=(PP<<30 :OR: \
             PP<<28 :OR: \
             PP<<26 :OR: \
             PP<<24 :OR: \
             PP<<22 :OR: \
             PP<<20 :OR: \
             PP<<18 :OR: \
             PP<<16 :OR: \
             PP<<14 :OR: \
             PP<<12 :OR: \
             PP<<10 :OR: \
             PP<<8  :OR: \
             PP<<6  :OR: \
             PP<<4  :OR: \
             PP<<2  :OR: \
             PP)
 
             STR    R1,[R0,#GPIOA_OTYPER]
 
MS           EQU    0x1 ; Medium speed
LS           EQU    0x2 ; Low speed
HS           EQU    0x3 ; H1gh Speed
 
             LDR    R1,=(LS<<30 :OR: \
             LS<<28 :OR: \
             LS<<26 :OR: \
             LS<<24 :OR: \
             LS<<22 :OR: \
             LS<<20 :OR: \
             LS<<18 :OR: \
             LS<<16 :OR: \
             LS<<14 :OR: \
             LS<<12 :OR: \
             LS<<10 :OR: \
             LS<<8  :OR: \
             LS<<6  :OR: \
             LS<<4  :OR: \
             LS<<2  :OR: \
             LS)
 
             STR    R1,[R0,#GPIOA_OSPEEDR]
 
FL           EQU    0x0 ; No pull-up, pull-down
PU           EQU    0x1 ; Pull-up
PD           EQU    0x2 ; Pull-down
 
             LDR    R1,=(FL<<30 :OR: \
             PD<<28 :OR: \
             PU<<26 :OR: \
             FL<<24 :OR: \
             FL<<22 :OR: \
             FL<<20 :OR: \
             FL<<18 :OR: \
             FL<<16 :OR: \
             FL<<14 :OR: \
             FL<<12 :OR: \
             FL<<10 :OR: \
             PU<<8  :OR: \
             PU<<6  :OR: \
             FL<<4  :OR: \
             FL<<2  :OR: \
             FL)
 
             STR    R1,[R0,#GPIOA_PUPDR]
 
;            GPIOB TANIMLARI
 
             LDR    R0,=GPIOB_BASE
             LDR    R1,=(INP<<30 :OR: \
             INP<<28 :OR: \
             INP<<26 :OR: \
             INP<<24 :OR: \
             INP<<22 :OR: \
             INP<<20 :OR: \
             INP<<18 :OR: \
             INP<<16 :OR: \
             INP<<14 :OR: \
             INP<<12 :OR: \
             INP<<10 :OR: \
             INP<<8 :OR: \
             INP<<6 :OR: \
             INP<<4 :OR: \
             OUT<<2 :OR: \
             INP)
 
             STR    R1,[R0,#GPIOB_MODER]
 
             LDR    R1,=(LS<<30 :OR: \
             LS<<28 :OR: \
             LS<<26 :OR: \
             LS<<24 :OR: \
             LS<<22 :OR: \
             LS<<20 :OR: \
             LS<<18 :OR: \
             LS<<16 :OR: \
             LS<<14 :OR: \
             LS<<12 :OR: \
             LS<<10 :OR: \
             LS<<8  :OR: \
             LS<<6  :OR: \
             LS<<4  :OR: \
             LS<<2  :OR: \
             LS)
 
             STR    R1,[R0,#GPIOB_OSPEEDR]
 
;*********************************************************************
;            USART Init
;*********************************************************************
 
             LDR    R0,=GPIOA_AFRL                 ; USART1'I PA3 VE PA4'E ATAYALIM
             LDR    R1,=0x41100                    ; PA2 VE PA2 AF1 (USART), PA4 TIMER14 HARD 34.SAYFA
             STR    R1,[R0]
 
             LDR    R0,=USART1_BASE
             MOVS   R1,#0
             STR    R1,[R0,#USART1_CR1]
             STR    R1,[R0,#USART1_CR2]
 
             LDR    R1,=48000000 / 250000          ; 115200 baud
             STR    R1,[R0,#USART1_BRR]
 
             MOVS   R1,#0X0D
             STR    R1,[R0,#USART1_CR1]
 
 
;*********************************************************************
;            T1mer14 Init
;*********************************************************************
 
             LDR    R0,=TMR14_BASE
 
             LDR    R1,=SampleRate
             STRH   R1,[R0,#TIM14_ARR]
 
             MOVS   R1,#0x6C
             STRH   R1,[R0,#TIM14_CCMR1]
 
             MOVS   R1,#0x03
             STRH   R1,[R0,#TIM14_CCER]
 
             MOVS   R1,#0x81
             STRH   R1,[R0,#TIM14_CR1]
 
             LDR    R1,=SampleRate / 2
             STRH   R1,[R0,#TIM14_CCR1]
 
             MOVS   R1,#1
             STRH   R1,[R0,#TIM14_DIER]         ; Int Enb
 
             B      SD_INIT
 
             ALIGN
             LTORG
 
 
;*********************************************************************
;            SDHardInit
;            R0 = 0 Ok
;            1 Kart takili degil
;            2 Uyumsuz kart takilmis
;*********************************************************************
 
SD_INIT      LDR    RamBase,=_Sektor
 
             BL     SDHardInit
             STRB   R0,[RamBase,#CardStatus]
             MOVS   R0,#0
             STR    R0,[RamBase,#Sektor]
 
;*********************************************************************
;            NESTED INTERRUPT CONTROLLER
;*********************************************************************
 
             LDR    R1,=NVIC_BASE+NVIC_ICDR0
             LDR    R0,=0XFFFFFFFF
             STR    R0,[R1,#0]; NVIC_ICDR0
             STR    R0,[R1,#4]; NVIC_ICDR1
 
;            Tum intlarin onceligini sona alalim
 
             LDR    R2,=NVIC_BASE+NVIC_PRI0
             STR    R0,[R2,#0x00]; NVIC_PRI0
             STR    R0,[R2,#0x04]; NVIC_PRI1
             STR    R0,[R2,#0x08]; NVIC_PRI2
             STR    R0,[R2,#0x0C]; NVIC_PRI3
             STR    R0,[R2,#0x10]; NVIC_PRI4
             STR    R0,[R2,#0x14]; NVIC_PRI5
             STR    R0,[R2,#0x18]; NVIC_PRI6
             STR    R0,[R2,#0x1C]; NVIC_PRI7
 
             MOVS   R0,#0x13
             MOVS   R1,#0x7
             BL     Set_Priority                 ; Timer 14
 
             B      MyProg
 
 
;*********************************************************************
;            R0     Int No
;            R1     Int Priority  (0...7)
;            Dikkat R2,R3,R4,R5,R6 icerigi bozulur
;*********************************************************************
 
 
Set_Priority LDR    R2,=NVIC_BASE+NVIC_PRI0
             MOVS   R4,R0
             MOVS   R3,#3
             BICS   R4,R3                        ; Tek bir PRIO Registeri 4 Interruptin onceligini saklayabilir
             ADDS   R2,R4                        ; Hangi PRIO registerine yukleyecegiz belli oldu
 
             ANDS   R3,R0                        ; Int No kacinci 4 lude belli oldu
             LSLS   R3,#3                        ; Register icindeki bit pozisyonu 8*N + 4
             ADDS   R3,#4                        ; Int No Bit numarasi belli oldu
             MOVS   R5,#0x0F
             LSLS   R5,R3                        ; Maske belli oldu
 
             LDR    R4,[R2]                      ; PRIOx Registerini okuduk
             BICS   R4,R5                        ; PRIOx Registerinde ilgili bitler silindi
             LSLS   R1,R3                        ; Int priorityi registerdeki ilgili bitlere gore siraladik
             ORRS   R1,R4                        ; Ilgili bit alanina yerlestirdik
             STR    R1,[R2]                      ; Ilgili PRIOx registerine yazdik
 
             LDR    R2,=NVIC_BASE
             CMPS   R0,#32                       ; Enable biti ISER0 dami ISER1 demi ?
             BGE    Ust_grup
             LDR    R3,[R2,#NVIC_ISER0]
             MOVS   R4,#1
             LSLS   R4,R0
             ORRS   R3,R4
             STR    R3,[R2,#NVIC_ISER0]
             BX     LR
 
Ust_grup     LDR    R3,[R2,#NVIC_ISER1]
             MOVS   R4,#1
             SUBS   R0,#32
             LSLS   R4,R0
             ORRS   R3,R4
             STR    R3,[R2,#NVIC_ISER1]
             BX     LR
 
Handler      B      .
 
 
             INCLUDE SD_CARD.S
 
             ALIGN
 
             INCLUDE MyProg.S
 
             ENDP
 
             ALIGN
 
             END

Ana dongu:
MyProg    B      AnaDongu
 
 
Format_   LDR    R0,=Buffer1
          BL     Format
          B      .
 
;*********************************************************************
;         Seri Porttan 1 Byte veri bekler ve R0 icinde geri dondurur
;         Eger hata varsa PC'ye 0x1B yollar ve cagiran rutine geri donmez
;*********************************************************************
 
 
AnaDongu  MOVS   R1,#0
          STRB   R1,[RamBase,#BufNo]
          STRB   R0,[RamBase,#Oku]
          STRB   R0,[RamBase,#Konus]
 
          LDR    R1,=USART1_BASE
WaitData  LDR    R2,[R1,#USART1_ISR]            ; ISR Oku
          MOVS   R3,#0x2A
          ANDS   R2,R3
          BEQ    WaitData
 
          LDR    R0,[R1,#USART1_RDR]            ; RDR Oku
 
          LDR    R2,[R1,#USART1_ISR]            ; ISR Oku
          ANDS   R2,R3
          BEQ    Komut
 
          STR    R3,[R1,#USART1_ICR]                        ; Hata bitlerini sil
          B      AnaDongu
 
Komut     MOVS   R2,#0x7F                       ; SES No: 0..127
          ANDS   R0,R2
          STRB   R0,[RamBase,#SesNo]
 
          MOVS   R0,#0x1B
          STRH   R0,[R1,#USART1_TDR]
 
          LDR    R0,=File                       ; DOSYANIN KAYITLI OLDUGU SEKTORUN NUMARASI (Header)
          LDR    R1,=Buffer1
          BL     Read
 
          LDRB   R0,[RamBase,#SesNo]
          LSLS   R0,#2
          LDR    R0,[R1,R0]                     ; Sesin kacinci sektorde oldugunu ogrendik
          STR    R0,[RamBase,#Sektor]
 
          LDR    R0,=File+1                     ; DOSYANIN KAYITLI OLDUGU SEKTORUN NUMARASI (Headerin 2 512 si)
          LDR    R1,=Buffer1
          BL     Read
 
          LDRB   R0,[RamBase,#SesNo]
          LSLS   R0,#2
          LDR    R0,[R1,R0]                     ; Sesin boyunu ogrendik
          STR    R0,[RamBase,#Boy]
 
          LDR    R0,[RamBase,#Sektor]
          LDR    R1,=Buffer1
          BL     Read
          ADDS   R0,#1
          STR    R0,[RamBase,#Sektor]
 
          LDR    R1,=Buffer2
          BL     Read
          ADDS   R0,#1
          STR    R0,[RamBase,#Sektor]
 
          MOVS   R0,#1
          STRB   R0,[RamBase,#Konus]
 
Bekle     LDRB   R0,[RamBase,#Oku]
          CMP    R0,#0
          BNE    Bufdoldur
 
          LDRB   R1,[RamBase,#Konus]            ; WORD CINSINDEN TOPLAM SES UZUNLUGU
          CMP    R1,#0
          BLE    AnaDongu
          B      Bekle
 
Bufdoldur MOVS   R0,#0
          STRB   R0,[RamBase,#Oku]
 
          LDR    R1,=Buffer1
          LDRB   R0,[RamBase,#BufNo]            ; Buffer1'i mi yoksa Buffer2' yimi okuyoruz
          CMP    R0,#1
          BEQ    BufOk
          LDR    R1,=Buffer2
 
BufOk     LDR    R0,[RamBase,#Sektor]
          BL     Read
          ADDS   R0,#1
          STR    R0,[RamBase,#Sektor]
          B      Bekle
 
;*********************************************************************
;         TIMER 14 INT
;*********************************************************************
 
Tim14_Int LDR    R0,=TMR14_BASE
          MOVS   R1,#0
          STRH   R1,[R0,#TIM14_SR]
 
          LDRB   R1,[RamBase,#Konus]
          CMP    R1,#0
          BEQ    Bitti
 
          LDRB   R2,[RamBase,#BufNo]            ; Buffer1'i mi yoksa Buffer2' yimi okuyoruz
          LDR    R1,=Buffer1
          CMP    R2,#0
          BEQ    BufOku
          LDR    R1,=Buffer2
 
BufOku    LDRH   R2,[RamBase,#Index]
          ADDS   R1,R2
          LDRH   R3,[R1]                        ; Ses datasi okundu
          SXTH   R3,R3
          ASRS   R3,#5                          ; Ses datalari 16 bit, fakat 12 biti kullaniyoruz
          LDR    R1,=SampleRate/2               ; Ofset ekleyelim
          ADD    R3,R1
          STRH   R3,[R0,#TIM14_CCR1]
 
          ADDS   R2,#2
          LDR    R1,=511
          ANDS   R2,R1
          STRH   R2,[RamBase,#Index]
 
          LDR    R1,[RamBase,#Boy]              ; WORD CINSINDEN TOPLAM SES UZUNLUGU
          SUBS   R1,#1
          STR    R1,[RamBase,#Boy]
          BGT    Bitmedi
          LDR    R1,=SampleRate/2               ; Ses verileri bittiginde sesi sifirlayalim
          STRH   R1,[R0,#TIM14_CCR1]
          MOVS   R1,#0
          STRB   R1,[RamBase,#Konus]
          B      Bitti
 
Bitmedi   CMP    R2,#0
          BNE    Bitti
 
          LDRB   R2,[RamBase,#BufNo]
          ADDS   R2,#1
          MOVS   R1,#1
          ANDS   R2,R1
          STRB   R2,[RamBase,#BufNo]            ; Buffer degistirildi
          STRB   R1,[RamBase,#Oku]              ; Sektor Oku
Bitti     BX     LR
 
          END

Degiskenler:
            AREA   ZiosRam, NOINIT, READWRITE, ALIGN=3
 
_Sektor     DCD    0
_Boy        DCD    0
 
_CardStatus DCB    0
_CardType   DCB    0    ; 2 GB tipinde 0x80  8 GB tipinde 0xC0
_SesNo      DCB    0
_Konus      DCB    0    ; 0 ise konusma, 1 ise konus
_Oku        DCB    0    ; Bir sonraki sektoru oku
_BufNo      DCB    0    ; 0 ise Buffer1'e oku, 1 ise Buffer2'ye oku
_Index      DCB    0    ; buffer okuma indexi
 
 
            END

Ofsetler:
Sektor     EQU    0x0000 ; 4 Byte
Boy        EQU    0x0004 ; 4 Byte
CardStatus EQU    0x0008 ; 1 Byte
CardType   EQU    0x0009 ; 1 Byte
SesNo      EQU    0x000A ; 1 Byte
Konus      EQU    0x000B ; 1 Byte
Oku        EQU    0x000C ; 1 Byte
BufNo      EQU    0x000D ; 1 Byte
Index      EQU    0x000E ; 1 Byte
 
           END

Register tanimlamalari:
;*********************************************************************
;               CM0 Base registerler Rehber Sayfa 50/1096
;*********************************************************************
 
SRAM_BASE       EQU    0x20000000
PERIPH_BASE     EQU    0x40000000
SRAM_BB_BASE    EQU    0x22000000
PERIPH_BB_BASE  EQU    0x42000000
FSMC_R_BASE     EQU    0xA0000000
APB1PERIPH_BASE EQU    0x40000000
APB2PERIPH_BASE EQU    0x40010000
AHBPERIPH_BASE  EQU    0x40020000
 
RAM_BASE        EQU    0x20000000
RAMBOYU         EQU    0x1400 ; Ram Boyu 32x5120 = 20 KB
 
;*********************************************************************
;               PWR
;*********************************************************************
 
IWDG_BASE       EQU    0x40003000
IWDG_KR         EQU    0x000
IWDG_PR         EQU    0x004
IWDG_RLR        EQU    0x008
IWDG_SR         EQU    0x00C
 
;*********************************************************************
;               PWR
;*********************************************************************
 
PWR_BASE        EQU    0x40007000
 
PWR_CR          EQU    0x00
PWR_CSR         EQU    0x00
 
 
;*********************************************************************
;               RCC
;*********************************************************************
 
RCC_BASE        EQU    0x40021000
 
RCC_CR          EQU    0x00
RCC_CFGR        EQU    0x04
RCC_CIR         EQU    0x08
RCC_APB2RSTR    EQU    0x0C
RCC_APB1RSTR    EQU    0x10
RCC_AHBENR      EQU    0x14
RCC_APB2ENR     EQU    0x18
RCC_APB1ENR     EQU    0x1C
RCC_BDCR        EQU    0x20
RCC_CSR         EQU    0x24
 
;*********************************************************************
;               SYSCFG
;*********************************************************************
 
SYSCFG_BASE     EQU    0x40010000
 
SYSCFG_CFGR1    EQU    0x00
SYSCFG_EXTICR1  EQU    0x08               ; External interrupt configuration registers
SYSCFG_EXTICR2  EQU    0x0C               ; External interrupt configuration registers
SYSCFG_EXTICR3  EQU    0x10               ; External interrupt configuration registers
SYSCFG_EXTICR4  EQU    0x14               ; External interrupt configuration registers
SYSCFG_CFGR2    EQU    0x1C
 
;*********************************************************************
;               GPIO A
;*********************************************************************
 
GPIOA_BASE      EQU    0x48000000
 
GPIOA_MODER     EQU    0x000
GPIOA_OTYPER    EQU    0x004
GPIOA_OSPEEDR   EQU    0x008
GPIOA_PUPDR     EQU    0x00C
GPIOA_IDR       EQU    0x010
GPIOA_ODR       EQU    0x014
GPIOA_BSRR      EQU    0x018
GPIOA_LCKR      EQU    0x01C
GPIOA_AFRL      EQU    0x48000020
GPIOA_AFRH      EQU    0x48000024
 
 
;*********************************************************************
;               GPIO B
;*********************************************************************
 
GPIOB_BASE      EQU    0x48000400
 
GPIOB_MODER     EQU    0x000
GPIOB_OTYPER    EQU    0x004
GPIOB_OSPEEDR   EQU    0x008
GPIOB_PUPDR     EQU    0x00C
GPIOB_IDR       EQU    0x010
GPIOB_ODR       EQU    0x014
GPIOB_BSRR      EQU    0x018
GPIOB_LCKR      EQU    0x01C
GPIOB_AFRL      EQU    0x48000420
GPIOB_AFRH      EQU    0x48000424
 
;*********************************************************************
;               GPIO C
;*********************************************************************
 
GPIOC_BASE      EQU    0x48000800
 
 
;*********************************************************************
;               ADC1
;*********************************************************************
 
ADC_BASE        EQU    0x40012400
 
;               ADC1_BASE           EQU       0x40012400
 
ADC1_SR         EQU    0X000
ADC1_CR1        EQU    0X004
ADC1_CR2        EQU    0X008
ADC1_SMPR1      EQU    0X00C
ADC1_SMPR2      EQU    0X010
ADC1_JOFR1      EQU    0X014
ADC1_JOFR2      EQU    0X018
ADC1_JOFR3      EQU    0X01C
ADC1_JOFR4      EQU    0X020
ADC1_HTR        EQU    0X024
ADC1_LTR        EQU    0X028
ADC1_SQR1       EQU    0X02C
ADC1_SQR2       EQU    0X030
ADC1_SQR3       EQU    0X034
ADC1_JSQR       EQU    0X038
ADC1_JDR1       EQU    0X03C
ADC1_JDR2       EQU    0X040
ADC1_JDR3       EQU    0X044
ADC1_JDR4       EQU    0X048
ADC1_DR         EQU    0X04C
 
;*********************************************************************
;               ADC2
;*********************************************************************
 
;               ADC2_BASE          EQU       0x40012800
 
ADC2_SR         EQU    0X400
ADC2_CR1        EQU    0X404
ADC2_CR2        EQU    0X408
ADC2_SMPR1      EQU    0X40C
ADC2_SMPR2      EQU    0X410
ADC2_JOFR1      EQU    0X414
ADC2_JOFR2      EQU    0X418
ADC2_JOFR3      EQU    0X41C
ADC2_JOFR4      EQU    0X420
ADC2_HTR        EQU    0X424
ADC2_LTR        EQU    0X428
ADC2_SQR1       EQU    0X42C
ADC2_SQR2       EQU    0X430
ADC2_SQR3       EQU    0X434
ADC2_JSQR       EQU    0X438
ADC2_JDR1       EQU    0X43C
ADC2_JDR2       EQU    0X440
ADC2_JDR3       EQU    0X444
ADC2_JDR4       EQU    0X448
ADC2_DR         EQU    0X44C
 
;*********************************************************************
;               TIMER 1 (16 bit)
;*********************************************************************
 
TIM1_BASE       EQU    0x40012C00
 
TIM1_CR1        EQU    0X00
TIM1_CR2        EQU    0X04
TIM1_SMCR       EQU    0X08
TIM1_DIER       EQU    0X0C
TIM1_SR         EQU    0X10
TIM1_EGR        EQU    0X14
TIM1_CCMR1      EQU    0X18
TIM1_CCMR2      EQU    0X1C
TIM1_CCER       EQU    0X20
TIM1_CNT        EQU    0X24
TIM1_PSC        EQU    0X28
TIM1_ARR        EQU    0X2C
TIM1_RCR        EQU    0X30
TIM1_CCR1       EQU    0X34
TIM1_CCR2       EQU    0X38
TIM1_CCR3       EQU    0X3C
TIM1_CCR4       EQU    0X40
TIM1_BDTR       EQU    0X44
TIM1_DCR        EQU    0X48
TIM1_DMAR       EQU    0X4C
 
 
;*********************************************************************
;               SPI1
;*********************************************************************
 
SPI1_BASE       EQU    0x40013000
 
SPI1_CR1        EQU    0x000
SPI1_CR2        EQU    0x004
SPI1_SR         EQU    0x008
SPI1_DR         EQU    0x00C
SPI1_CRCPR      EQU    0x010
SPI1_RXCRCR     EQU    0x014
SPI1_TXCRCR     EQU    0x018
SPI1_I2SCFGR    EQU    0x01C
SPI1_I2SPR      EQU    0x020
 
;*********************************************************************
;               SPI2
;*********************************************************************
 
SPI2_BASE       EQU    0x40003800
 
SPI2_CR1        EQU    0x000
SPI2_CR2        EQU    0x004
SPI2_SR         EQU    0x008
SPI2_DR         EQU    0x00C
SPI2_CRCPR      EQU    0x010
SPI2_RXCRCR     EQU    0x014
SPI2_TXCRCR     EQU    0x018
SPI2_I2SCFGR    EQU    0x01C
SPI2_I2SPR      EQU    0x020
 
;*********************************************************************
;               USB
;*********************************************************************
 
USB_BASE        EQU    0x40005C00    ; USB Registers Base Address
 
USB_EP0R        EQU    0X00
USB_EP1R        EQU    0X04
USB_EP2R        EQU    0X08
USB_EP3R        EQU    0X0C
USB_EP4R        EQU    0X10
USB_EP5R        EQU    0X14
USB_EP6R        EQU    0X18
USB_EP7R        EQU    0X1C
USB_CNTR        EQU    0X40          ; Control Register
USB_ISTR        EQU    0X44          ; Interrupt Status Register
USB_FNR         EQU    0X48          ; Frame Number Register */
USB_DADDR       EQU    0X4C          ; Device Address Register
USB_BTABLE      EQU    0X50          ; Buffer Table Address Register
 
;               End Point Buffer Descriptor bilesenlerinin adresleri
 
USB_PMA_ADDR    EQU    0x40006000    ; USB Packet Memory Area Address
 
Adr_Tx0         EQU    0x00          ; Adres
Cnt_Tx0         EQU    0x04          ; Adres
Adr_Rx0         EQU    0x08          ; Adres
Cnt_Rx0         EQU    0x0C          ; Adres
Adr_Tx1         EQU    0x10          ; Adres
Cnt_Tx1         EQU    0x14          ; Adres
Adr_Rx1         EQU    0x18          ; Adres
Cnt_Rx1         EQU    0x1C          ; Adres
 
 
;*********************************************************************
;               SYSTEM CONTROL BLOCK
;*********************************************************************
 
SCB_BASE        EQU    0xE000ED00
SCB_CPUID       EQU    0x00
SCB_ICSR        EQU    0x04
SCB_VTOR        EQU    0x08
SCB_AIRCR       EQU    0x0C
SCB_SCR         EQU    0x10
SCB_CCR         EQU    0x14
SCB_SHPR1       EQU    0x18
SCB_SHPR2       EQU    0x1C
SCB_SHPR3       EQU    0x20
SCB_SHCSR       EQU    0x24
SCB_CFSR        EQU    0x28
SCB_HFSR        EQU    0x2C
SCB_MMFAR       EQU    0x34
SCB_BFAR        EQU    0x38
 
 
 
;*********************************************************************
;               System Auxilary Control Register
;*********************************************************************
 
SCB_ACTLR       EQU    0xE000E008
 
 
;*********************************************************************
;               MMU
;*********************************************************************
 
MPU_BASE        EQU    0xE000ED90
MPU_TYPER       EQU    0X00
MPU_CR          EQU    0X04
MPU_RNR         EQU    0X08
MPU_RBAR        EQU    0X0C
MPU_RASR        EQU    0X10
MPU_RBAR_A1     EQU    0X14
MPU_RSAR_A1     EQU    0X18
MPU_RBAR_A2     EQU    0X1C
MPU_RSAR_A2     EQU    0X20
MPU_RBAR_A3     EQU    0X24
MPU_RSAR_A3     EQU    0X28
 
;*********************************************************************
;               NVIC
;*********************************************************************
 
NVIC_BASE       EQU    0xE000E100
 
NVIC_ISER0      EQU    0x000
NVIC_ISER1      EQU    0x004
 
NVIC_ICDR0      EQU    0x180
NVIC_ICDR1      EQU    0x184
 
NVIC_ISPR0      EQU    0x100
NVIC_ISPR1      EQU    0x104
NVIC_ICPR0      EQU    0x180
NVIC_ICPR1      EQU    0x184
NVIC_IABR0      EQU    0x200
NVIC_IABR1      EQU    0x204
 
NVIC_PRI0       EQU    0x300
NVIC_PRI1       EQU    0x304
NVIC_PRI2       EQU    0x308
NVIC_PRI3       EQU    0x30C
NVIC_PRI4       EQU    0x310
NVIC_PRI5       EQU    0x314
NVIC_PRI6       EQU    0x318
NVIC_PRI7       EQU    0x31C
NVIC_PRI8       EQU    0x320
NVIC_PRI9       EQU    0x324
NVIC_PRI10      EQU    0x328
NVIC_STIR       EQU    0xE00
 
 
 
;*********************************************************************
;               DMA
;*********************************************************************
 
DMA_BASE        EQU    0x40020000
 
DMA1_ISR        EQU    0x000;
DMA1_IFCR       EQU    0x004;
 
DMA1_CCR1       EQU    0x008;
DMA1_CNDTR1     EQU    0x00C;
DMA1_CPAR1      EQU    0x010;
DMA1_CMAR1      EQU    0x014;
 
DMA1_CCR2       EQU    0x01C;
DMA1_CNDTR2     EQU    0x020;
DMA1_CPAR2      EQU    0x024;
DMA1_CMAR2      EQU    0x028;
 
DMA1_CCR3       EQU    0x030;
DMA1_CNDTR3     EQU    0x034;
DMA1_CPAR3      EQU    0x038;
DMA1_CMAR3      EQU    0x03C;
 
DMA1_CCR4       EQU    0x044;
DMA1_CNDTR4     EQU    0x048;
DMA1_CPAR4      EQU    0x04C;
DMA1_CMAR4      EQU    0x050;
 
DMA1_CCR5       EQU    0x058;
DMA1_CNDTR5     EQU    0x05C;
DMA1_CPAR5      EQU    0x060;
DMA1_CMAR5      EQU    0x064;
 
DMA1_CCR6       EQU    0x06C;
DMA1_CNDTR6     EQU    0x070;
DMA1_CPAR6      EQU    0x074;
DMA1_CMAR6      EQU    0x078;
 
DMA1_CCR7       EQU    0x080;
DMA1_CNDTR7     EQU    0x084;
DMA1_CPAR7      EQU    0x08C;
DMA1_CMAR7      EQU    0x090;
 
DMA2_ISR        EQU    0x400;
DMA2_IFCR       EQU    0x404;
 
DMA2_CCR1       EQU    0x408;
DMA2_CNDTR1     EQU    0x40C;
DMA2_CPAR1      EQU    0x410;
DMA2_CMAR1      EQU    0x414;
 
DMA2_CCR2       EQU    0x41C;
DMA2_CNDTR2     EQU    0x420;
DMA2_CPAR2      EQU    0x424;
DMA2_CMAR2      EQU    0x428;
 
DMA2_CCR3       EQU    0x430;
DMA2_CNDTR3     EQU    0x434;
DMA2_CPAR3      EQU    0x438;
DMA2_CMAR3      EQU    0x43C;
 
DMA2_CCR4       EQU    0x444;
DMA2_CNDTR4     EQU    0x448;
DMA2_CPAR4      EQU    0x44C;
DMA2_CMAR4      EQU    0x450;
 
DMA2_CCR5       EQU    0x458;
DMA2_CNDTR5     EQU    0x45C;
DMA2_CPAR5      EQU    0x460;
DMA2_CMAR5      EQU    0x464;
 
 
;*********************************************************************
;               Debug MCU configuration register
;*********************************************************************
DBGMCU_CR       EQU    0xE0042004
 
;*********************************************************************
;               FLASH
;*********************************************************************
 
FLASH_BASE      EQU    0x40022000
 
FLASH_ACR       EQU    0x000
FLASH_KEYR      EQU    0x004
FLASH_OPTKEYR   EQU    0x008
FLASH_SR        EQU    0x00C
FLASH_CR        EQU    0x010
FLASH_AR        EQU    0x014
FLASH_OBR       EQU    0x01C
FLASH_WRPR      EQU    0x020
 
;               Flash Keys
 
RDPRT_KEY       EQU    0x5AA5
FLASH_KEY1      EQU    0x45670123
FLASH_KEY2      EQU    0xCDEF89AB
 
;               Flash Control Register definitions
 
FLASH_PG        EQU    0x00000001
FLASH_PER       EQU    0x00000002
FLASH_MER       EQU    0x00000004
FLASH_OPTPG     EQU    0x00000010
FLASH_OPTER     EQU    0x00000020
FLASH_STRT      EQU    0x00000040
FLASH_LOCK      EQU    0x00000080
FLASH_OPTWRE    EQU    0x00000100
 
;               Flash Status Register definitions
 
FLASH_BSY       EQU    0x00000001
FLASH_PGERR     EQU    0x00000004
FLASH_WRPRTERR  EQU    0x00000010
FLASH_EOP       EQU    0x00000020
 
;*********************************************************************
;               CRC
;*********************************************************************
 
CRC_BASE        EQU    0x40023000
 
CRC_DR          EQU    0x000
CRC_IDR         EQU    0x004
CRC_CR          EQU    0x008
 
;*********************************************************************
;               Unique Device ID Register
;*********************************************************************
 
UID_BASE        EQU    0x1FFFF7E8
 
UID0            EQU    0
UID1            EQU    4
UID2            EQU    8
 
 
;*********************************************************************
;               USART1
;*********************************************************************
 
USART1_BASE     EQU    0x40013800
 
USART1_CR1      EQU    0x00
USART1_CR2      EQU    0x04
USART1_CR3      EQU    0x08
USART1_BRR      EQU    0x0C
USART1_GTPR     EQU    0x10
USART1_RTOR     EQU    0x14
USART1_RQR      EQU    0x18
USART1_ISR      EQU    0x1C
USART1_ICR      EQU    0x20
USART1_RDR      EQU    0x24
USART1_TDR      EQU    0x28
 
;*********************************************************************
;               TIMER 14 (16 bit)
;*********************************************************************
 
TMR14_BASE      EQU    0x40002000                    ; TIMER 2,3,4 icin ayni base degeri kullanacagiz
 
TIM14_CR1       EQU    0x00
TIM14_DIER      EQU    0x0C
TIM14_SR        EQU    0x10
TIM14_EGR       EQU    0x14
TIM14_CCMR1     EQU    0x18
TIM14_CCER      EQU    0x20
TIM14_CNT       EQU    0x24
TIM14_PSC       EQU    0x28
TIM14_ARR       EQU    0x2C
TIM14_CCR1      EQU    0x34
TIM14_OR        EQU    0x50
 
                END
 
Son düzenleme:
dac veya pwm ile ses için analog voltaj üretebilirsin. audacity yazılımı ile elindeki sesleri istediğin örnekleme frekansında 8 bit wav dosyasına çevirebilirsin. ama wav dosyaları sıkıştırmasız olduğu için çok yer kaplar. örneğin 8bit-8khz bir wav dosyasının 1 saniyesi 8kbyte yer kaplayacak. 4khz altına inersen insan seslerinin anlaşılırlığı bozulur. süreyi uzatmak için harici spi flash chip kullanabilirsin.
 
@Mikro Step hocam ilk ve istisnai kod paylaşımınız icin teşekkür ederim. Kod yapnızı inceledikten sonra belki program aralarında asm yazmaya başlayabilirim.
Hocam Bilgilendirme için teşekkür ederim.
 
dac veya pwm ile ses için analog voltaj üretebilirsin. audacity yazılımı ile elindeki sesleri istediğin örnekleme frekansında 8 bit wav dosyasına çevirebilirsin. ama wav dosyaları sıkıştırmasız olduğu için çok yer kaplar. örneğin 8bit-8khz bir wav dosyasının 1 saniyesi 8kbyte yer kaplayacak. 4khz altına inersen insan seslerinin anlaşılırlığı bozulur. süreyi uzatmak için harici spi flash chip kullanabilirsin.
Hocam, ses dosyası illa wav olmak zorun da degil. Nette gordugum orneklerden dolayı bu yola başvurdum.
Daha farklı yolları varsa da öğrenmek isterim.
Hocam şöyle bir ornek verdiniz. "örneğin 8bit-8khz bir wav dosyasının 1 saniyesi 8kbyte yer kaplayacak"
Eger bunu denemek istersem Pwm frekansımı 8Khz yapıp ses datalarını ustune mı basacağım. (göndereceğim)

Teşekkürler.
Mehmet
 
8khz saniyede 8000 defa pwm duty değeri güncellenecek demek oluyor.
İlave Not: Pwm frekansını insan kulağının duyma aralığında yüksek tutman gerekiyor. En az 100khz yada yüksek tutarsan pi filtre için daha iyi olacağını düşünüyorum.
 
Burda suna dikkat etmen gerekiyor.

PWM uretecinde pwm frekansini belirleyen bir registeri olur.

Bu registere yuklenebilecek deger PWM duty degerine yuklenebilecek verinin bir ust degeridir.
Yada tersini soylersek duty degeri olarak yukleyebilecek en buyuk deger PWM peryod registerine yuklenen degerin 1 eksigidir.

Ornegin Peryod registerine 0x1000 degeri yuklediginde pwm frekansi 8 Khz olsun.

Bunun tam yarisi 0x0800 bizim sifir referansimizdir. Senin ses sinyalin ofsete sahipse ofset degerini ogrenmen ve ses sinyalinden cikartman ardindan bizim kendi ofset degerimiz olan 0x800 ile toplaman gerekir.

Ayrica diyelim ki ses dosyandaki veriler 8 bit. Bu 128 ofset demektir ve sinyal max +127 -128 degeri alabilir.

Fakat senin pwm uretecin max degeri 0x7FF

Eger sen 128+127 degerini yuklersen pwmin tarif ettigi voltaj cok dusuk kalir haliyle cikacak ses de ciliz kalir.

O zaman 0x7FF/7F=10 yani (okunan ses verisi - 128)*10 +0x800 islemini yapip ardindan DAC duty resgisterine yazman gerekir.

Boyle yaparsan en buyuk dinamik araligi kullanirsin.

Bu aritmetik islemleri ornek verdigim programda PC de yapip ardindan SD karta sonuclarini yazdirmis olabilirim. Aksi halde islemciye her bir sample icin ilave is cikartiriz.
 
Son düzenleme:
Hocam, ses dosyası illa wav olmak zorun da degil. Nette gordugum orneklerden dolayı bu yola başvurdum.
Daha farklı yolları varsa da öğrenmek isterim.
Hocam şöyle bir ornek verdiniz. "örneğin 8bit-8khz bir wav dosyasının 1 saniyesi 8kbyte yer kaplayacak"
Eger bunu denemek istersem Pwm frekansımı 8Khz yapıp ses datalarını ustune mı basacağım. (göndereceğim)

Teşekkürler.
Mehmet
kaliteyi düşürerek sesi bitstreame çeviren sıkıştırma algoritmaları var ama ben olsam bunlarla uğraşmam. ihtiyaç duyduğun süre ve kalite nedir buna göre harici ufak bir spi flash seçip sesleri 8 veya 16 bit mono olarak uygun örnekleme frekansına göre kaydetmek en kolayı olur.

ayrıca mikrostep'in de yazdığı gibi wav dosyasında sesler 2nd complement olarak kaydedilir buna uygun dönüşümü yaparak pwm veya adc donanımını sürmen gerekecektir. yanlış hatırlamıyorsam wav dosyasının ilk 54 byte kısmı dosya bilgileri bunu kesip atar geri kalanı kullanabilirsin.

eğer basit tonlar, alarm sesleri gibi bir şeye ihtiyacın varsa 2 adet pwm çıkışını miksleyerek bunları elde edebilirsin.

 
Evet polifonik ses uzerine benim de bir calismam olmustu.
Bu sekilde calisirsaniz muzik bilginiz varsa muzikal sesler nota duzeyine indirgenebiliyor.

Simdi hatirlamiyorum, ya 3 ya da 4 ayri kanaldan farkli sesler uretilip birlestiriliyor.


Yukaridaki calismada cipi %100 emule etmemistim.

Asagidakinde tam SID6581 emulasyonu yapildi.

 
Son düzenleme:
Bu arada ses sinyalini asiri yuksek hizda 1 bit ile ornekleyip digitallestirip de saklayabilirsiniz. Ses sinyali son degerden yuksekse 1 dusukse 0 mantigi var. Siz bu 1/0 verilerini filtreden gecirip son deger olarak kullaniyorsunuz. Son deger sesi takip etmis oluyor. Tamam muzikal anlamda birer bir es degil ancak insanin, bu sekilde digitallestirilmis insan sesinde anormallik hissetmesi mumkun degil. (Yeterince yuksek hizda sample alinmak sarti ile)

Bu teknigin adi Sigma Delta modulasyon. Zamaninda cok guzel sonuclar elde etmistim.

ADC ile falanda ugrasmiyorsunuz. Basit bir RC filtre bir FF ile bile halloluyor.
 
Mikro step hocam digital filtreler konusunda çalışmanız oldumu?
Bende kablosuz ses aktarımı üzerinde çalışıyorum.Amacım dip sesleri bastırıp anlaşılabilirligi artırmak.
Stm32 nin DSP konusunda hazır kütüphaneleri var;ancak açık kaynak şeklinde degilde entegre edilebilir düzeyde paylaşıyorlar.
Bu konuda görüş ve önerilerinizi rica edebilirmiyim.
 
Bobin iceren duzenekleri kontrol ederken kullaniyorum.

Z ya da S transfer fonskiyonu varsa ordan ayrik denklemleri elde edebilirsin.

Isin icine ses girdimi olay biraz degisir. Frequency warping konusuna da dikkat etmek gerekebilir.

Ses uzerine ciddi anlamda digital filitre uygulamam olmadi.
 
Son düzenleme:
Merhabalar,
Bu konu üzerine gecici olarak ara verdim. Sorunu mu şimdilik DF Player mini ile hallettim. ( Demo olduğu için )
Daha sonra tekrardan bu konu üzerine yoğunlaşacağım.
 

Forum istatistikleri

Konular
7,104
Mesajlar
121,019
Üyeler
2,879
Son üye
dinomiout

Son kaynaklar

Son profil mesajları

az bilgili çok meraklı
Prooffy wrote on semih_s's profile.
Merhaba, sizden DSO2C10 hakkında bilgi rica ettim. Yanıtlarsanız sevinirim...
Unal wrote on taydin's profile.
Timur Bey, Arduino kontrollü bir akü şarj cihazı yapmaya çalışıyorum. Aklımdaki fikri basit bir çizim olarak konu açmıştım. Özellikle sizin fikirlerinizi çok önemsiyorum.
hakan8470 wrote on Dede's profile.
1717172721760.png
Dedecim bu gul mu karanfil mi? Gerci ne farkeder onu da anlamam. Gerci bunun anlamini da bilmem :gulus2:
Lyewor_ wrote on hakan8470's profile.
Takip edilmeye başlanmışım :D ❤️
Back
Top