클럭생성 및 클럭설정, 시스템이 동작하기 위한 System Clock/Bus Clock/Flash Clock을 생성하는 부분이다.

void SOSC_init_8MHz(void){
	SCG->SOSCDIV=SCG_SOSCDIV_SOSCDIV1(1)|
			SCG_SOSCDIV_SOSCDIV2(1);
	SCG->SOSCCFG = SCG_SOSCCFG_RANGE(2)|
			SCG_SOSCCFG_EREFS_MASK;

	while(SCG->SOSCCSR&SCG_SOSCCSR_LK_MASK);
	SCG->SOSCCSR=SCG_SOSCCSR_SOSCEN_MASK;

	while(!(SCG->SOSCCSR & SCG_SOSCCSR_SOSCVLD_MASK));

}

void SPLL_init_160MHz(void){
	while(SCG->SPLLCSR &SCG_SPLLCSR_LK_MASK);
	SCG->SPLLCSR &= ~SCG_SPLLCSR_SPLLEN_MASK;
	SCG->SPLLDIV |= SCG_SPLLDIV_SPLLDIV1(2)|
			SCG_SPLLDIV_SPLLDIV2(3);
	SCG->SPLLCFG = SCG_SPLLCFG_MULT(24);

	while(SCG->SPLLCSR & SCG_SPLLCSR_LK_MASK);
	SCG->SPLLCSR |=SCG_SPLLCSR_SPLLEN_MASK;

	while(!(SCG->SPLLCSR &SCG_SPLLCSR_SPLLVLD_MASK));
}


void NormalRUNmode_80MHz(void){
	SCG->SIRCDIV = SCG_SIRCDIV_SIRCDIV1(1)
			| SCG_SIRCDIV_SIRCDIV2(1);

	SCG->RCCR=SCG_RCCR_SCS(6)
			|SCG_RCCR_DIVCORE(0b01)
			|SCG_RCCR_DIVBUS(0b01)
			|SCG_RCCR_DIVSLOW(0b10);

	while(((SCG->CSR & SCG_CSR_SCS_MASK) >>SCG_CSR_SCS_SHIFT) != 6){}
}

 

 

48번째 interrupt인 LPIT Channel 0 interrupt에 대한 NVIC설정을 한다.

void NVIC_init_IRQs(void){
	S32_NVIC->ICPR[1] |= 1 << (48 % 32);
	S32_NVIC->ISER[1] |= 1 << (48 % 32);
	S32_NVIC->IP[48] = 0xA;

}

 

 

LPIT Channel 0 Interrupt를 사용하기 위한 설정을 한다.

더보기

<관련 순서 참고>

① PCC_LPIT 레지스터를 통해 Source Clock을 SPLLDIV2_CLK로 설정하고, Clock enable을 한다.

② MCR 레지스터를 통해 모듈의 Clock enable을 한다.

③ MIER 레지스터를 통해 Channel 0에 대한 Interrupt를 Enable 한다.

④ 1초마다 Interrupt가 발생하도록 TVAL 레지스터를 설정한다 ( TVAL = 40000000 )

⑤ TCTRLn 레지스터를 통해 모드를 32-bit periodic counter 모드로 설정하고, LPIT를 동작시킨다 (TCTRLn 레지스터의 Reset value가 0이기 때문에 MODE/TSOT/TSOI/TROT/TRG_SRC/TRG_SEL은 따로 설정하지 않는다).

void LPIT0_init(void){
	PCC->PCCn[PCC_LPIT_INDEX] &= ~PCC_PCCn_PCS_MASK;
	PCC->PCCn[PCC_LPIT_INDEX]|=PCC_PCCn_PCS(6);
	PCC->PCCn[PCC_LPIT_INDEX] |= PCC_PCCn_CGC_MASK;

	LPIT0->MCR |= LPIT_MCR_M_CEN_MASK;

	LPIT0->MIER |=LPIT_MIER_TIE0_MASK;
	LPIT0->TMR[0].TVAL =40000000;
	LPIT0->TMR[0].TCTRL |=LPIT_TMR_TCTRL_T_EN_MASK;
}


void LPIT0_Ch0_IRQHandler(void){
	lpit0_ch0_flag_counter++;
	PTD->PTOR |=1<<0;
	LPIT0->MSR |= LPIT_MSR_TIF0_MASK;
}

 

 

 

포트 설정에관한 부분

void PORT_init(void){
	PCC->PCCn[PCC_PORTD_INDEX] |=PCC_PCCn_CGC_MASK;
	PORTD->PCR[0]&=~PORT_PCR_MUX_MASK;
	PORTD->PCR[0] |= PORT_PCR_MUX(1);
	PTD->PDDR |=1<<0;
}

 

 

 

main 함수

int main(void){
	PORT_init();
	SOSC_init_8MHz();
	SPLL_init_160MHz();
	NormalRUNmode_80MHz();
	NVIC_init_IRQs();
	LPIT0_init();
	for(;;){
		idle_counter++;
	}
}

 

 

 

 

LPIT0_init 에서 설정한대로 1초마다 한번씩 깜빡이는것을 확인할 수 있다.

'NXP&S32DesignStudio' 카테고리의 다른 글

전자시계 만들기  (0) 2021.01.17
PWM  (0) 2021.01.17
ADC  (0) 2021.01.17
GPIO & Switch  (0) 2021.01.17

Interrupt를 사용하기위해 NVIC모듈에서 interrupt 설정bit를 set 한다.

void NVIC_init_IRQs(void){
	S32_NVIC->ICPR[1] |= 1<<(61%32);
	S32_NVIC->ISER[1] |= 1<<(61%32);
	S32_NVIC->IP[61] = 0xB;
}

 

 

Switch 포트와 LED포트를 각각 설정해준다.

void PORT_init(void){
	PCC->PCCn[PCC_PORTD_INDEX] |=PCC_PCCn_CGC_MASK;
	PORTD->PCR[0]&=~PORT_PCR_MUX_MASK;
	PORTD->PCR[0] |= PORT_PCR_MUX(1);
	PTD->PDDR |=1<<0; //Blue

	/////////switch/////////
	PCC-> PCCn[PCC_PORTC_INDEX] |= PCC_PCCn_CGC_MASK;

	PORTC->PCR[12] &= ~PORT_PCR_MUX_MASK;
	PORTC->PCR[12] |= PORT_PCR_MUX(1);
	PTC->PDDR &= ~(1<<12);
	PORTC->PCR[12] |= (9<<16);
}

 

 

인터럽트를 처리하기위한 ISR을 작성한다.

인터럽트가 들어올시 PTD0 LED가 켜지도록 하였다.

또한 ISR이 끝나기전에 ISF비트에 다시 1을 써야 Flag가 0이 되어 다시 인터럽트를 받을수 있는 상태가 된다.

void PORTC_IRQHandler(void){
	PTD->PTOR |= 1<<PTD0;
	PORTC->PCR[12] |= 0x01000000;
}

 

main함수

int main(void){
	PORT_init();
	NVIC_init_IRQs();

	for(;;){
		idle_counter++;
	}
	return 0;
}

 

 

 

실행결과 : 스위치2번을 누를때마다 외부 interrupt를 통해 처리가되어 LED가 들어온다는 결과를 확인하였다

헤더 선언부분에서 LED 포트로 사용할 PTD15,16,0번포트와 PTC12,13

#include "S32K144.h"
#include "device_registers.h"

#define PTD15 15
#define PTD16 16
#define PTD0 0

#define PTC12 12
#define PTC13 13

 

 

 

 

 

Switch포트의 MUX bits를 설정하여 해당 핀이 GPIO로 사용될 수 있도록 한다.

PCC-> PCCn[PCC_PORTC_INDEX] |= PCC_PCCn_CGC_MASK;

PORTC->PCR[12] &= ~PORT_PCR_MUX_MASK;
PORTC->PCR[12] |= PORT_PCR_MUX(1);
PTC->PDDR &= ~(1<<PTC12);



PORTC->PCR[13] &= ~PORT_PCR_MUX_MASK;
PORTC->PCR[13] |= PORT_PCR_MUX(1);
PTC->PDDR &= ~(1<<PTC13);

 

 

 

 

LED 포트의 MUX bits를 설정하여 해당 핀이 GPIO로 사용될 수 있도록 한다.

PCC-> PCCn[PCC_PORTD_INDEX] |= PCC_PCCn_CGC_MASK;

PORTD->PCR[0] &= ~PORT_PCR_MUX_MASK;
PORTD->PCR[0] |= PORT_PCR_MUX(1);

PTD->PDDR |= 1<<PTD0; /////Blue

PORTD->PCR[15] &= ~PORT_PCR_MUX_MASK;
PORTD->PCR[15] |= PORT_PCR_MUX(1);

PTD->PDDR |= 1<<PTD15; /////Red

PORTD->PCR[16] &= ~PORT_PCR_MUX_MASK;
PORTD->PCR[16] |= PORT_PCR_MUX(1);

PTD->PDDR |= 1<<PTD16;  /////Green

 

 

main 문에서는 해당 스위치가 입력됨에따라 다른 LED 색을 출력하도록 하였다.

for(;;){
	 if((PTC->PDIR & (1<<PTC12)) &&(PTC->PDIR & (1<<PTC13)) ){
				PTD-> PCOR |= 1<<PTD16;
	}else{
		PTD-> PSOR |= 1<<PTD16;

	}

	 if((PTC->PDIR & (1<<PTC12)) && !(PTC->PDIR & (1<<PTC13)) ){

		PTD-> PCOR |= 1<<PTD0;
	}else{
		PTD-> PSOR |= 1<<PTD0;
	}


	if(!(PTC->PDIR & (1<<PTC12)) && (PTC->PDIR & (1<<PTC13)) ){
			PTD-> PCOR |= 1<<PTD15;
		}else{
			PTD-> PSOR |= 1<<PTD15;
		}
}

 

 

 

 

 

실행화면

'NXP&S32DesignStudio' 카테고리의 다른 글

전자시계 만들기  (0) 2021.01.17
PWM  (0) 2021.01.17
ADC  (0) 2021.01.17
Timer Interrupt  (0) 2021.01.17

 

 

man : 매뉴얼

sudo : 명령어 root 권한 부여

tab : 명령어 자동완성

df : 파일디스크 사용량

 

pwd : 현재 디렉토리

ls : 현재 디렉토리 내 파일

ls -a : 현재 디렉토리 내 모든 파일

ls -l : 현재 디렉토리 내 파일(자세히) - 3개의 권한(소유자, 그룹, 나머지) 표시 및 생성날짜 등을 알수있다.

 

cd : 홈디렉토리로 이동

cd ~ : 해당 디렉토리 이동

cd .. : 이전디렉토리로 이동

mkdir : 디렉토리 생성

rmdir : 디렉토리 삭제

cp A B : A를 B에 파일 카피

cp -r A B : A를 B에 디렉토리 카피

mv A B: A를 B로 이동

find : 파일찾기

where is : 전체디렉토리 찾기

which : 실행되는 파일의 디렉토리

touch 빈파일 생성

 

chmod :  권한변경

chmod u/g/o/a ± r/w/x : user혹은 group 혹은 others 에서의 해당권한 추가 혹은 삭제

umask : 해당 설정 권한으로 다음파일생성

 

stat : 파일 스탬프시간 확인

cat : 해당파일 내용보기

tac : 해당파일 내용 뒤에서부터 보기

head : 끝에 10줄보기

head : 처음 10줄 보기

grep ~ : 해당 문자열이 들어간 파일 검색

wc : 파일내의 라인 단어수 문자 개수

diff : 두 파일의 차이

 

ctrl + c : 실행중인 프로세스 종료

ctrl + z : 실행중인 프로세스 중지

jobs 현재 백그라운드 프로세스 상태

fg : 포그라운드 프로세스 전환

bg : 백그라운드 프로세스 전환

htop : cpu 상태 확인

ps : 현재 사용되고있는 프로세스

kill : 실행중인 프로세스 종료

 

 

'System Programming' 카테고리의 다른 글

Linux System Programming  (0) 2021.01.15
[Linux] 디바이스 드라이버 led 불켜기  (0) 2020.07.10
[Linux]좀비프로세스와 고아프로세스  (0) 2020.06.21
[Linux] gdb 디버깅  (0) 2020.06.16
[Linux] signal  (0) 2020.06.16

1. Linux

 

앞으로 System Programming 카테고리에서는 Linux 를 활용한 기본적인 명령어부터 기초적인 드라이버까지

알아보는 리눅스 시스템에 대해 다루어 볼 예정이다.

 

리눅스 커널 마스코트인 Tux

리눅스는 윈도우와 다른 서버 및 개발용 OS로 알고있지만 사실 커널이름이다. 

역사로 보자면 UNIX 시기부터 여러 변천이 많지만, 1991년도에 Linux Torvalds 가 처음 만든 Linux Kernel로부터 시작되었다고 보면 될것 같다. 이때가 1.0 이었고 아래와 같은 명령어를 치면 시스템의 커널 버전을 알 수 있다.

uname -a

 

 

앞으로는 UBUNTU 라는 명칭의 배포판을 이용하게 될건데, 이러한 배포판들은 Linux라는 커널과

사용자영역의 인터페이스들을 갖추어 합쳐나오는것이다. 이에는 UBUNTU 를 제외하고도 Centos, Debian, Red Hat, Fedora, SuSe등이 존재한다. 

그중 UBUNTU 를 교육용으로도 많이쓰는 이유는 우분투 재단의 지원이 풍부하고 배포판중에서도 커널의 가장 많이 담고있다고는 한다. 그외에도 FIrefox 나 Libre Office 같이 쓸만한 것들도 배포판 내에 많이 포함된다.

 


2. Terminal & Shell

Linux Terminal

 

위는 우분투에서 띄운 Terminal 이다.

사실 이 터미널이란 것은 터미널 애뮬레이터로써 소프트웨어 적으로 터미널창을 볼수 있게끔 구현한 것이다.

그리고 이 내부를 동작시키는 것을 쉘(Shell) 이라고 한다.

가령 명령어를 입력시키면 프로그램을 실행시키고 결과를 보여주는 등의 역할을 하는데 이를통해 사용자와 커널영역간의 연결고리 역할을 한다. 이러한 쉘도 여러종류가 있는데 현재 우리는 'Bash' 를 쓰고있다.

 

쉘, 커널, 사용자영역

 

 

 

 

'System Programming' 카테고리의 다른 글

Linux Terminal Basic Command  (0) 2021.01.16
[Linux] 디바이스 드라이버 led 불켜기  (0) 2020.07.10
[Linux]좀비프로세스와 고아프로세스  (0) 2020.06.21
[Linux] gdb 디버깅  (0) 2020.06.16
[Linux] signal  (0) 2020.06.16

리눅스 커널 스터디를 시작하도록 했다.

시작하기 앞서, 개발보드로 Raspberry pi 3B+ 를 사용할 것이다.

 

1.라즈베리파이 os 설치

 

micro sd칩이 준비가 되었다면 www.raspberrypi.org/software/operating-systems/ 사이트에서 os 설치를 하도록 하자.

예전 라즈비안 일때와 명칭이나 다운방법이 조금 달라진것 같아 다시 정리가 필요할 것 같다.

 

파티션 확인

기존의  sd칩을 포맷할 일이 있다면 위와 같은 파티션 분할이 없는지 체크하도록 하자. 쓰던 라즈베리파이 sd카드를 확인해보면 파티션이 나누어져있어 반드시 다시 포맷하기위해 볼륨 삭제를 해주어야 한다. (윈도우 기준 컴퓨터관리 - 저장소 - 디스크 관리)

 

공식 사이트 다운로드

공식사이트에서 최신이미지를 다운받기 위해서는 recommended software 이넘으로 다운받아 준다.

하지만 앞으로는 4.19커널버전에 맞추어 2019- 버전을 사용할 것이기 때문에, 따로 사이트에서 받아주도록 하였다.

downloads.raspberrypi.org/raspbian/images/raspbian-2019-07-12/

 

Index of /raspbian/images/raspbian-2019-07-12

 

downloads.raspberrypi.org

요넘으로 해주면 된다.

 

 

압축을 풀면 img 파일이 생성되는데 win32 Disk Imager를 통해 sd card에 넣어주도록 하자.

 

Win32 Disk Imager

 


 

2. 환경 및 언어설정

 

일단 초반 진입하자마자 모두 next를 해주어 default로 맞추어 준다. (Locale은 일단은 신경쓰지 않는다)

와이파이 까지 설정을 마쳤다면, 소프트웨어 업데이트를 해준다.

 

<언어설정단계>

 

터미널 창에 raspi-config 진입

4. Localisation Options 

Locale 

목록에서 스페이스바를 이용해 en_GB.UTF-8 UTF-8 및 en_US.UTF8 UTF-8 , ko_kr.UTF-8 UTF-8 을 선택해준다.

터미널-> cd /home/pi 디렉토리 이동

sudo apt-get update

sudo apt-get upgrade



이후

apt-get install ibus

apt-get install ibus-hangul

apt-get install fonts-unfonts-core

sudo reboot

이후 네이버창을 띄어 확인해보자.


3. 기타

 

라즈베리 파이에서는 아래 명령어를 이용해 루트디렉토리로써의 권한을 부여했다.

그냥 파일생성을 하니 먹히지 않았다. 따라서 다음과 같은 명령어를 이용해 권한을 부여한 후 mkdir등을 하자.

 

sudo su

 

아래는 별개로 바탕화면 파일관리자가 먹히지 않아 다음의 명령어로 수정한후 재부팅하였다.

sudo apt-get install --reinstall pcmanfm

 


4.사용 커널 버전

 

라즈베리파이os 버전 : 2019-07-10-rasbian-buster-full.zip

라즈비안 커널 브랜치 : rpi-4.19.y

리눅스 커널 버전 : 4.19.60