/*
 * Main.s
 *
 *  Created on: Aug 24, 2022
 *      Author: rozman
 */

		  .syntax unified
		  .cpu cortex-m7
		  .thumb


///////////////////////////////////////////////////////////////////////////////
// Definitions
///////////////////////////////////////////////////////////////////////////////
// Definitions section. Define all the registers and
// constants here for code readability.

// Constants

// Register Addresses
	.equ     DWT_CYCCNT,   	0xE0001004 // DWT_CYCCNT reg (RM, pp.3211)

// Start of data section
 		.data

 		.align

STEV1: 	.word 	0x10   	// 32-bitna spr.
STEV2: 	.word 	0x40   	// 32-bitna spr.
VSOTA: 	.word 	0      	// 32-bitna spr.

// RCC base address is 0x58024400
// AHB4ENR register offset is 0xE0
.equ RCC_AHB4ENR, 0x580244E0 // RCC AHB4 peripheral clock reg
.equ GPIOI_BASE, 0x58022000 // GPIOI base address)
.equ GPIOJ_BASE, 0x58022400 // GPIOJ base address)


.equ GPIOx_MODER, 0x00 // GPIOx port mode register
.equ GPIOx_ODR, 0x14 // GPIOx output data register
.equ GPIOx_BSRR, 0x18 // GPIOx port set/reset register
// Values for BSSR register - pin 13: LED is on, when GPIO is off

.equ LEDs_OFF, 0x00002000 // Setting pin to 1 -> LED is off
.equ LEDs_ON, 0x20000000 // Setting pin to 0 -> LED is on

.equ LED2s_OFF, (1<<2) // Setting pin to 1 -> LED is off
.equ LED2s_ON, (1<<18) // Setting pin to 0 -> LED is on

// Start of text section
  		.text

  		.type  main, %function
  		.global main

   	   	.align
main:

		bl INIT_IO
loop: 	bl LED_ON
		bl LED2_ON

		mov r0,#500
		bl DELAY

		bl LED_OFF
		bl LED2_OFF

		mov r0,#500
		bl DELAY

		b loop


__end: 	b 	__end

LED_ON:
		push {r5, r6, lr}
		// Set GPIOx Pins to 0 (through BSSR register)
		ldr r6, =GPIOI_BASE // Load GPIOI BASE address to r6
		mov r5, #LEDs_ON
		str r5, [r6,#GPIOx_BSRR] // Write to BSRR register
		pop {r5, r6, pc}


LED_OFF:
		push {r5, r6, lr}
		// Set GPIOx Pins to 1 (through BSSR register)
		ldr r6, =GPIOI_BASE // Load GPIOI BASE address to r6
		mov r5, #LEDs_OFF
		str r5, [r6,#GPIOx_BSRR] // Write to BSRR register
		pop {r5, r6, pc}

LED2_ON:
		push {r5, r6, lr}
		// Set GPIOx Pins to 0 (through BSSR register)
		ldr r6, =GPIOJ_BASE // Load GPIOI BASE address to r6
		mov r5, #LED2s_ON
		str r5, [r6,#GPIOx_BSRR] // Write to BSRR register
		pop {r5, r6, pc}


LED2_OFF:
		push {r5, r6, lr}
		// Set GPIOx Pins to 0 (through BSSR register)
		ldr r6, =GPIOJ_BASE // Load GPIOI BASE address to r6
		mov r5, #LED2s_OFF
		str r5, [r6,#GPIOx_BSRR] // Write to BSRR register
		pop {r5, r6, pc}

INIT_IO:
		push {r5, r6, lr}

		// Enable GPIOI Peripheral Clock (bit 8 in AHB4ENR register)
		ldr r6, = RCC_AHB4ENR // Load peripheral clock reg address to r6
		ldr r5, [r6] // Read its content to r5
		orr r5, #0x00000300 // Set bit 8,9 to enable GPIOI,J clock
		str r5, [r6] // Store result in peripheral clock register

		ldr r6, =GPIOI_BASE // Load GPIOD BASE address to r6
		ldr r5, [r6,#GPIOx_MODER] // Read GPIOD_MODER content to r5
		and r5, #0xF3FFFFFF // Clear bits 27-26 for P13
		orr r5, #0x04000000 // Write 01 to bits 27-26 for P13
		str r5, [r6] // Store result in GPIO MODER register

		ldr r6, =GPIOJ_BASE // Load GPIOD BASE address to r6
		ldr r5, [r6,#GPIOx_MODER] // Read GPIOD_MODER content to r5
		and r5, #0xFFFFFFCF // Clear bits 5-4 for PJ2
		orr r5, #0b10000 // Write 01 to bits 5-4 for PJ2
		str r5, [r6] // Store result in GPIO MODER register

		pop {r5, r6, pc}

DELAY:
		push {r1, lr}

MSEC:	ldr  r1,=64000
LOOP:   subs r1,r1,#1
        bne  LOOP

		subs r0,r0,#1
		bne  MSEC

		pop {r1, pc}
