티스토리 뷰

전자회로/임베디드교육

5

쥬브62 2020. 5. 4. 10:45

(월)

- blog.naver.com/guile21c

 

volatile unsigned int* HW_GPGCON = (unsigned int*) 0x56000060;
volatile unsigned int* HW_GPGDAT = (unsigned int*) 0x56000064;
*HW_GPGCON = (*HW_GPGCON & ~(3<<8)) | (1<<8);  // GPG4를 출력으로 설정
*HW_GPGDAT = (*HW_GPGDAT & ~(1<<4)); // GPG4를 LOW로

 

- LED 켜기

#define rGPGCON    (*(volatile unsigned *)0x56000060)	//Port G control
#define rGPGDAT    (*(volatile unsigned *)0x56000064)	//Port G data
void Led_Port_Init(void)
{	
	/* 
	 * LED On : Active Low 
	 * Initialize GPGDAT[7:4] : high
	 * Setup GPGCON[15:8] : 01-> GPG7~4 Output mode
	 * GPGUP pull up function disable
	 * 
	 */
	/* YOUR CODE HERE */  
    	rGPGDAT = (rGPGDAT | (0xf<<4));		  	   // 1. 값을 세팅하고
	rGPGCON = (rGPGCON & ~(0xff << 8)) | (0x55 << 8);  // 2. 출력으로 설정
	
}
void Led_Display(int data)
{
	/* 
 	 * LED On : Active high 
    	 * LED Off: Active low
	 * GPGDAT[7:4]
	 */
	/* YOUR CODE HERE */  
	rGPGDAT = (rGPGDAT | (0xf<<4)) & ~(((data<<4) & (0xf<<4))); 
}
void Main(void)
{
	int i, j;
	
	Uart_Init(115200);
	Uart_Send_String("\nLED Test !!!\n");

	/* LED Test */
	Led_Port_Init();
	while(1)
    	{
		for(i=0;i<16;i++) 
		{
			Led_Display(i);
			for(j=0;j<0x1ffff;j++); //시간지연
		}
	}
}

 

-

rGPGCON = (rGPGCON & ~(0xff << 8)) | (0x55 << 8); 

 

vs.

 

rGPGCON = (rGPGCON & ~(0xff << 8)); //input에서

rGPGCON = rGPGCON | (0x55 << 8); //output으로 온다. 잠깐이라도 input이 된다.

 

 

- key matrix

. GPF2를 input으로 사용, GPF7은 0을 출력(GND로 사용)시 스위치 스캔 가능.

 

void Key_Port_Init(void)
{
	/* GPFCON -Input Mode GPF[2:6] */
	/* YOUR CODE HERE */
	rGPFCON &= ~(0x3ff<<4);
		
	/* GPFCON, GPGCON - outputmode GPF7, GPG0 */
	/* YOUR CODE HERE */	
	rGPFDAT |= 1<<7;
	rGPFCON = (rGPFCON & ~(0x3<<14)) | (0x1<<14);
	rGPGDAT |= 1; 
	rGPGCON = (rGPGCON & ~(0x3)) | (0x1);
}
int Key_Wait_Get_Pressed(void)
{
	/* YOUR CODE HERE */
	int a; 
	while (! (a= Key_Get_Pressed()));
	return a; 
}
int Key_Get_Pressed(void)
{
	int i, keyval;
	
	/* YOUR CODE HERE */
	for(i=0; i<2; i++)
	{	
		rGPFDAT |= 0x1<<7;
		rGPGDAT |= 0x1<<0;
		(i==1)?(rGPGDAT &= ~0x1):(rGPFDAT &= ~(0x1<<7));

		keyval = (~rGPFDAT) & 0x7C; // 누르면 1이 되게하고 5개 bit를 마스킹
		switch(keyval)
		{
			case 1 : return (1+(5*i)); // 1 or 6
			case 2 : return (2+(5*i));
			case 4 : return (3+(5*i));
			case 8 : return (4+(5*i));
			case 16 : return (5+(5*i));
		}	
	}
	return 0;
}
void Key_Wait_Get_Released(void)
{
	/* YOUR CODE HERE */
	while (Key_Get_Pressed());
	Uart_Send_String("released\n");
}
void Main(void)
{
	Uart_Init(115200);
	Uart_Send_String("\nHello ARM !!!\n\n");
	Uart_Send_String("Press any key : waiting .....\n");

	Key_Port_Init();

	while(1)
	{
		Uart_Printf("Key Value =%d\n",  Key_Wait_Get_Pressed()); 
		Key_Wait_Get_Released(); //키 채터링 방지
	}
}

 

- 풀업/풀다운 저항과 회로

 . floating 상태를 방지

 

- GPIO(General purpose input/output)

 . 활용

  1. LED

  2. KEYPAD

  3. 클럭 생성(I2C SCL, SDA)

  4. 리셋 신호

0을 출력하면 리셋신호 걸림

 5. SDCARD DETECT, EARPHONE DETECT

 6. NAND FLASH의 READY/BUSY PIN

 등...

 

- 컴파일러

 . KEIL의 MDK (ARM에서 인수함)

 . IAR embedded workbench

 . STM의 STM32-CubeIDE(전, TrueStudio IDE)

 . GCC(오픈소스)

 

- 와치독 : 프로그램이 무한루프, lock up에 빠진 것을 감지

 

- 감을 잡는데는 실습이 중요!!!!

 

- start code, boot code : main함수 시작전에 동작, 어셈블리어로 코드를 짠다.

 

- 클럭 변경

.equ MPLLCON, 0x4c000010 /*MPLL Control*/

 

/* CONFIG_CLK_534_133_66 */
.equ Startup_MDIV, 267  // 이걸 변경하면 clock 변경 가능. 
.equ Startup_PDIV, 3      // 클럭을 변경하면 연결된 장치의 클럭도 변경해줘야 함
.equ Startup_SDIV, 1      // 안그러면 통신이 불안정해 짐
.equ Startup_EPLLSTOP, 0
.equ Startup_ARMCLKdiv, 0
.equ Startup_PREdiv, 0x1
.equ Startup_HCLKdiv, 0x1
.equ Startup_PCLKdiv, 1

 

.equ MPLL_VAL, ((Startup_EPLLSTOP<<24)|(Startup_MDIV<<14)|(Startup_PDIV<<5)|(Startup_SDIV)) 

 

- AMBA(ARM의 버스 표준)

 . AHB(고속의 버스) : HCLK

 . APB(저속 주변장치 버스) : PCLK

 

- local label

ex)

0:  // 1

0:  // 2

  bne 0b(2로 감) or 0f(3으로 감) // 1로는 못감

0:  //3

 

 

(수)

- RS232C Transceiver(Transmitter + Receiver)

- 데이터시트 레지스터 보는 법

1. 몇비트 짜리 레지스터 인가?

2. 나한테 필요한 기능인가?

3. 예제코드를 보면서 필요한 부분은 데이터시트를 참고

 . 0으로 초기화 된 것은 쓰지않을 가능성이 높다.

 

LF(0xA) : 라인피드, 줄바꿈

CR(0xD) : 캐리지리턴, 맨앞으로 커서 이동

 

. WIN의 리턴처리는 CR, LF가 사용됨

. UNIX, LINUX의 리턴처리는 LF가 사용됨(CR이 있어도 상관없음)

 

ex)

 

- 비동기 : 클럭이 없기 때문에 보내는 쪽과 받는 쪽의 속도가 같아야 한다(baud rate), start bit와 stop bit 사용, 신뢰성이 높지 않음 

 

- parity mode : 1의 개수로 신뢰도 체크하는 것인데 신뢰성이 높지 않아서 잘 쓰지 않음

 

- 깊숙히 팔 분야(나의 무기)를 정해야 한다. 

 

- 스트레스 받지 말자

 

- TIMER의 용도

1. 시간지연(delay)

2. 시간측정(measure)

3. PWM(펄스 폭 변조) wave 생성

4. 운영체제(OS) 커널의 시계로 활용

 

 

- 타이머

더보기

- TCFG0(프리스케일러, 데드존 길이 조절)

- TCFG1(디바이더 설정, DMA 모드 설정)

- TCON(manual update를 하고 start를 해야 타이머가 작동한다)

 

- 예제코드(시간지연)

 

- 예제코드(시간측정)

 

- 예제코드(PWM Buzzer)

 

 

 

(목)

-

 . Timer input clock frequency = PCLK / (prescaler value + 1) / divider value

 . 

 

- RTC(Real time clock)의 활용

1. 시계

2. 달력

3. 알람

4. 저전력상태의 CPU를 깨움

-

. 초, 분, 시, 요일, 일, 월, 년을 BCD(Binary coded decimal)로 저장 

 

- RTC 예제코드

 

 

- WDT의 활용

1. 소프트웨어 락업을 탐지하여 리셋을 작동

2. 하드웨어 오류도 탐지할 수 있다

 

- 예제코드(WDT)

 

- 인터럽트

 . 인터럽트가 동시에 걸린다면 어떻게 처리해야 할까? 쪼금이라도 늦게 걸린 인터럽트는 대기(pending)하게 된다.

 . PIC에는 MASK REGISTER가 있어서 인터럽트 ON,OFF 가능

 . 인터럽트에 우선순위가 있다.

 . 인터럽트 중첩(Nested interrupt) : 인터럽트 처리중이어도 우선순위 높은게 걸리면 중지하고 높은걸 처리, 시스템의 복잡도가 높아질 수 있다.

 . 인터럽트 상태클리어 : 인터럽트가 걸리면 PIC의 STATUS REGISTER에 흔적이 남는다. 인터럽트를 처리하면 STATUS REGISTER를 클리어 해주어야 한다(④가 없어짐)

 . falling edge(상승시 인터럽트 걸림), rising edge(하강시 입터럽트 걸림)

 . 

 

- 어셈블리어 변수 선언 방식

 

- 예제코드(인터럽트, 1초마다 출력)

인터럽트 상태 클리어하는 방법 중요!!!! & 동시복원

 

- 예제코드(key 인터럽트)

 

- Exception vector

 

- 직접해보아야 내것이 된다

 

 

- 리셋이 발생하는 경우

1. POR(파워온리셋)

2. 하드웨어 리셋(리셋버튼 조작)

3. 소프트웨어 리셋 

4. WDT 리셋

 

- SWI(Software interrupt)

user mode에서 svc mode로 권한이 바뀐다.

 

- Abort(bus error)의 원인 3가지

1. 비정렬 엑세스(data abort)

 

2. 보호(금지)된 메모리 엑세스 (prefetch abort or data abort)

ex) user모드에서 다른 모드의 메모리 접근

3. 존재하지 않는(None) 가상 메모리

ex) 가상주소에 갔더니 아무 것도 없다

 

- FIQ(fast interrupt request)

. IRQ의 우선순위를 뛰어 넘어서 제일 먼저 처리 된다.

. 인터럽트 핸들러를 바로 뒤에 배치하여 파이프라인이 깨지지 않게 할수 있다.

 

- ARM11 전후로 인터럽트 방식이 많이 달라짐

. PIC -> NVIC(Nested vectored interrupt controller)

. 테이블이 NVIC에 내장되어서 ARM은 함수주소만 받아서 실행하면 된다.

 

 

(금)

- DMA의 활용

다양한 멀티미디어, 네트워크, 스토리지 장치의 성능을 개선하는 목적으로 사용

장점 : 1. 속도가 빠르다 2. CPU를 대신하여 데이터 전송을 처리

 

- 예제코드(MEMORY TO MEMORY DMA)

.2450's DMA 전송 크기 계산법

전송크기(바이트) = TSZ(1/4) * DSZ(1/2/4) * TC

ex) 480 = 1 * 4 * TC

 

- 다양한 메모리 복사 방법

1. memcpy(dst, src, 1024);               x1

2. memcopy_single; //ldr, str            x4

3. memcopy_multiple; //ldm, stm      x8

4. dma;     x10

 

- 예제코드(UART TO MEMORY DMA)

트리거 시켜줄 필욘 없다

- D캐시를 OFF시키고 DMA를 사용한다.

 

- 아날로그보다는 디지털의 노이즈를 제거하는게 용이하다

 

convert -geometry 480x272! -type truecolor a.jpg b.bmp

bin2c b.bmp c.h sample

 

- ffmpeg

 

- IIC

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

'전자회로 > 임베디드교육' 카테고리의 다른 글

7주차  (0) 2020.05.18
6  (0) 2020.05.11
4  (0) 2020.04.27
MMU(memory management unit) -수정중  (0) 2020.04.21
3  (0) 2020.04.20
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함