FW 심화 과정/[2] STM32심화실습

0803 NVIC, BUS Interfaces

천숭이 2022. 8. 3. 13:58

- 밑 3버스가 sram과 연결됨

int tmp = *(int *)0x22000000; -> 2200만 번지에서 네바이트를 읽어서 tmp에 대입

위 구문 실행하면 data address bus 실행됨. 이 값이 bus matrix로 들어감. bus matrix 거쳐서 주소가 system bus로 들어감.

8비트에서 1비트만 뽑아내서 data

 

 

icode 

 

P.27

*** Atomic ***

rSFR의 끝 두비트는 11로 변경 -> 3

하지만, 인터럽트 발생시점에 따라서 3이 되지 않을 수도 있음

 

INTERRUPT는 해당 명령어(ORR) 끝나고 실행됨.

하지만 ISR 이 무시됨 따라서 결과는 10

 

INTERRUPT MASKING DISABLE 이므로 중간에 ISR발생해도 이동하지 않음

실행이 완료된 후  INTERRUPT MASKING ENABLE 로 값이 바뀜, 이때 ISR 실행

 

22000004번지는 물리적으로 존재하지않음. 

Normal Routine -> 임계영역

 

bit number 계산

 

<** NVIC **>  **중요

 

실습

// ALIAS
#define rRCC_AHB1ENR (*(int *)0x40023830)
#define rGPIOA_MODER (*(int *)0x40020000)
#define rGPIOA_IDR (*(int *)0x40020010)
#define rGPIOD_MODER (*(int *)0x40020C00)
#define rGPIOD_ODR (*(int *)0x40020C14)
#define bGPIOA_IDR_0 (*(int *)(0x42000000 + 32*0x20010 + 4*0))
#define bGPIOD_ODR_12 (*(int *)(0x42000000 + 32*0x20C14 + 4*12))	

// TIMER
#define rSCSR			(*(int *) 0xE000E010)
#define rSRVR			(*(int *) 0xE000E014)
#define rSCVR			(*(int *) 0xE000E018)



/*  ORGINAL
#define rRCC_AHB1ENR (*(int *)0x40023830)
#define rGPIOA_MODER (*(int *)0x40020000)
#define rGPIOA_IDR (*(int *)0x40020010)
#define rGPIOD_MODER (*(int *)0x40020C00)
#define rGPIOD_ODR (*(int *)0x40020C14)
*/


#include "lib.h"
#include <stdio.h>

extern void gpio_control();
unsigned int gTickCount;

void MySystemTimerIsr()
{
	gTickCount = gTickCount + 1;
}

int main()
{
	// TIMER
	rSRVR = 16000 - 1;
	rSCSR = 0x7;
	
	
	
	// clock enable for PORT-D, PORT-A
	rRCC_AHB1ENR = rRCC_AHB1ENR | (0x1<<3) | (0x1<<0);
	// PD12 --> output
	int tmp = rGPIOD_MODER & ~ (0x3<<24);
	rGPIOD_MODER = tmp | (0x1<<24);
	// PA0 --> input
	rGPIOA_MODER = rGPIOA_MODER & ~ (0x3<<0);
	while (1)
	{
		if (rGPIOA_IDR & (0x1<<0)) { rGPIOD_ODR = rGPIOD_ODR | (0x1 << 12); } 
		else { rGPIOD_ODR = rGPIOD_ODR & ~(0x1 << 12); }
		if (bGPIOA_IDR_0)
		{
		bGPIOD_ODR_12 = 1;
		}
		else
		{
			bGPIOD_ODR_12 = 0;
		}
	}
}

인터럽트 추가

 

 

 

p.59 <타이머>

SYSTICK -> NVIC 인터럽트 요청을 보냄

 

 

p.53 TIMER SFR

RELOAD에 1MSEC 시간이 소요됨