Stack_Size EQU 0x00000400 AREA STACK, NOINIT, READWRITE, ALIGN=3 Stack_Mem SPACE Stack_Size __initial_sp Heap_Size EQU 0x00000200 AREA HEAP, NOINIT, READWRITE, ALIGN=3 __heap_base Heap_Mem SPACE Heap_Size __heap_limit PRESERVE8 THUMB AREA RESET, DATA, READONLY EXPORT __Vectors EXPORT __Vectors_End EXPORT __Vectors_Size __Vectors DCD __initial_sp ; Top of Stack DCD Reset_Handler ; Reset Handler DCD NMI_Handler ; NMI Handler DCD HardFault_Handler ; Hard Fault Handler DCD MemManage_Handler ; MPU Fault Handler DCD BusFault_Handler ; Bus Fault Handler DCD UsageFault_Handler ; Usage Fault Handler DCD 0 ; Reserved DCD 0 ; Reserved DCD 0 ; Reserved DCD 0 ; Reserved DCD SVC_Handler ; SVCall Handler DCD DebugMon_Handler ; Debug Monitor Handler DCD 0 ; Reserved DCD PendSV_Handler ; PendSV Handler DCD SysTick_Handler ; SysTick Handler __Vectors_End __Vectors_Size EQU __Vectors_End - __Vectors AREA |.text|, CODE, READONLY Reset_Handler PROC EXPORT Reset_Handler [WEAK] LDR R0, =Main BX R0 ENDP NMI_Handler PROC EXPORT NMI_Handler [WEAK] B . ENDP HardFault_Handler\ PROC EXPORT HardFault_Handler [WEAK] B . ENDP MemManage_Handler\ PROC EXPORT MemManage_Handler [WEAK] B . ENDP BusFault_Handler\ PROC EXPORT BusFault_Handler [WEAK] B . ENDP UsageFault_Handler\ PROC EXPORT UsageFault_Handler [WEAK] B . ENDP SVC_Handler PROC EXPORT SVC_Handler [WEAK] B . ENDP DebugMon_Handler\ PROC EXPORT DebugMon_Handler [WEAK] B . ENDP PendSV_Handler PROC EXPORT PendSV_Handler [WEAK] B . ENDP SysTick_Handler PROC EXPORT SysTick_Handler [WEAK] B . ENDP RCC EQU 0x40023800 GPIOA EQU 0x40020000 GPIOB EQU 0x40020400 GPIOC EQU 0x40020800 I2C1 EQU 0x40005400 FLASH EQU 0x40023C00 ENTRY Main PROC LDR R0, =RCC ;PLL çikis frekansi 168Mhz MOVW R1, #0x5408 MOVT R1, #0x0740 STR R1, [R0, #0x04] ;HSE aktif, PLL aktif MOVT R1, #0x0101 LDR R2, [R0, #0x00] ORR R1, R1, R2 STR R1, [R0, #0x00] ;Prefetch Aktif, 5WS LDR R0, =FLASH MOVW R1, #0x0705 STR R1, [R0, #0x00] ;Çekirdek clock kaynagi : PLL LDR R0, =RCC MOV R1, #0x02 STR R1, [R0, #0x08] ;APB1 = 84 Mhz, APB2 = 42 Mhz LDR R1, [R0, #0x08] MOV R2, #0x940A ORR R1, R1, R2 STR R1, [R0, #0x08] ;AHB1 üzerindeki GPIOB ve GPIOC clock hatlarini aktiflestir MOV R1, #0x0006 STR R1, [R0, #0x30] ;APB1 üzerindeki I2C1 clock hattini aktiflestir MOVT R1, #0x0020 STR R1, [R0, #0x40] ;GPIOB portunun 6. ve 7. bacaklarini alternate function olarak tanimla LDR R0, =GPIOB LDR R1, [R0] ORR R1, R1, #0xA000 STR R1, [R0, #0] ;GPIOB portunun 6. ve 7. bacaklarini Open-Drain olarak tanimla LDR R1, [R0, #0x04] ORR R1, R1, #0x00C0 STR R1, [R0, #0x04] ;GPIOB portunun 6. ve 7. bacaklarindaki Pull-Up direncini aktif et LDR R1, [R0, #0x0C] ORR R1, R1, #0x5000 STR R1, [R0, #0x0C] ;GPIOB portunun 6. ve 7. bacaklarini I2C donanimina bagla LDR R1, [R0, #0x20] ORR R1, R1, #0x44000000 STR R1, [R0, #0x20] ;GPIOC portunun 6. ve 7. bacaklarindaki PUll-Up irencini aktif et LDR R0, =GPIOC LDR R1, [R0, #0x0C] ORR R1, R1, #0x5000 STR R1, [R0, #0x0C] ;I2C1 donanimini 42Mhz de çalisacak sekilde ayarla LDR R0, =I2C1 LDR R1, [R0, #0x04] ORR R1, R1, #0x002A STR R1, [R0, #0x04] ;I2C1 donanimina slave adres olarak 0x02 ata MOV R1, #0x0002 STR R1, [R0, #0x08] ;I2C1 donaniminin clock ayarini yap MOV R1, #0x8023 STRH R1, [R0, #0x1C] ;I2C1 donaniminin maksimum rise zamanini ayarla MOV R1, #0x0D STRH R1, [R0, #0x20] ;I2C1 donanimini aktif et LDR R1, [R0, #0x00] ORR R1, R1, #0x0001 STR R1, [R0, #0x00] ;I2C1 donanimina ACK gönderimini aktif et LDR R1, [R0, #0x00] ORR R1, R1, #0x0400 STR R1, [R0, #0X00] I2C_Dongusu ;Adresin eslesmesini bekle Adres_eslesene_kadar_bekle LDRH R1, [R0, #0x14] LDRH R2, [R0, #0x18] LSLS R2, R2, #16 ORR R3, R1, R2 AND R3, R3, #0x00FFFFFF MOV R4, #0x0082 MOVT R4, #0x0006 AND R3, R3, R4 CMP R3, R4 BNE Adres_eslesene_kadar_bekle ;Oknmak istenen register adresinin gelmesini bekle Veri_Gelmesini_Bekle LDRH R1, [R0, #0x14] LDRH R2, [R0, #0x18] LSLS R2, R2, #16 ORR R3, R1, R2 AND R3, R3, #0x00FFFFFF MOV R4, #0x0040 MOVT R4, #0x0002 AND R3, R3, R4 CMP R3, R4 BNE Veri_Gelmesini_Bekle ;Veriyi R5'e al LDRH R5, [R0, #0x10] ;Istenen registere ait veriyi göndereblmek için bekle Veri_GOndermek_Icin_Bekle LDRH R1, [R0, #0x14] LDRH R2, [R0, #0x18] LSLS R2, R2, #16 ORR R3, R1, R2 AND R3, R3, #0x00FFFFFF MOV R4, #0x0080 MOVT R4, #0x0006 AND R3, R3, R4 CMP R3, R4 BNE Veri_GOndermek_Icin_Bekle ;Okunmak istenen register adresi (R5) '0x00' ise PC6 bacaginin durumunu oku ve okunan degeri gönder Button0 CMP R5, #0x00 BNE Button1 LDR R1, =GPIOC LDR R1, [R1, #0x10] AND R1, R1, #0x0040 CMP R1, #0x0040 MOVEQ R1, #0x00 MOVNE R1, #0x01 STRH R1, [R0, #0x10] B I2C_Dongusu ;Okunmak istenen register adresi (R5) '0x01' ise PC7 bacaginin durumunu oku ve okunan degeri gönder Button1 CMP R5, #0x01 BNE Default_Button LDR R1, =GPIOC LDR R1, [R1, #0x10] AND R1, R1, #0x00000080 CMP R1, #0x00000080 MOVEQ R1, #0x00 MOVNE R1, #0x01 STRH R1, [R0, #0x10] B I2C_Dongusu ;Okunmak istenen register adresi (R5) bilinen bir adres degil ise 0x00 degerini gönder Default_Button MOV R1, #0x00 STRH R1, [R0, #0x10] B I2C_Dongusu B . ENDP ALIGN END