1. CCS3.3 DSP/BIOS semaphore 를이용한 COM1 시리얼통신 기존의예제프로그램을바탕으로실제현장에적용가능한 BIOS 프로그램을시작하겠습니다. 이장에서사용할 H/W 는 F28335 내부에있는 UART0 포트를사용해 PC 와 RS-232 통신을 프로세서간동기를맞추는데사용하는 semaphore 를사용해작성해보겠습니다. -Semaphore 란 C 프로그램을작성해보신분이라면광역변수의 0 과 1 상태만가지는 flag 정도라생각하시면됩니다. DSP/BIOS 에서는이플레그기능에전시간에설명한시간지연 (TSK_sleep()) 기능이추가되어있습니다. 결론은 BIOS 에서각 TASK 간이벤트동기와시간지연을동시에사용할수있게만든함수라생각 하시면됩니다. -semaphore 설정방법 CCS BIOS TOOL 에서 1 개또는여러개의 semaphore 를사용자에맞춰생성합니다. - 변수명, 초기치.. - semaphore 사용법 1. SEM_post(&sem_com1_rx_eflg); _ 이벤트를발생시킬때사용하는함수입니다. Item1: CCS BIOS에서생성한 SEM 변수명을 () 에사용합니다. 2. SEM_pend(&sem_com1_rx_eflg,SYS_FOREVER); <- 리턴있음이벤트를대기할때사용하는함수입니다. Item1: CCS BIOS에서생성한 SEM 변수명을 () 에사용합니다. Item2: 함수내시간지연방법설정입니다. SYS_FOREVER : 이벤트가 SEM_post() 될때까지영원히기다림. 1 이상숫자 : 1은 1TICK을의미하며이 TICK동안 SEM_post() 를기다리다탈출합니다. 위경우는리턴되는값을확인하여처리합니다. 리턴 : 0 이면지정한 TICK 동안이벤트가발생하지않았음. 1 이면지정한 TICK 동안이벤트가발생함.. - TEST 환경 (115200Bps,8 Bit, NON Parity, 1STOP) - PC : RS-232 PORT - DSP 보드 : UART0 RS-232 1. 디렉토리구성.. cmd..dsp2833x_headers.. include.. semprj.. semsrc : Linker 컴맨드파일 : Chip 관련헤더파일및헤더용 Linker 컴맨드파일 : 사용자인쿠르드파일 : 사용자프로젝트파일및실행파일 (.HEX) : 사용자소스파일
- CCS3.3 DSP/BIOS Semaphore 구성 TASK Task1_proc UART0 프로그램관리 Semaphore 처리 TIMER Tick 서비스 Taskxx_proc 사용자프로그램 Software Interrupt TASK Uart1_RxSwi UART0 수신처리 Semaphore 처리생성 Scheduling Task 반환 TI-BIOS Event Scheduling BIOS Timer PRD 500Tick. GPIO32 Toggle ntick. 사용자프로그램 H/W Interrupt -> SWI 로변환 통신 (UART0) SWI_post(&Uart1_RxSwi). UART0 수신인터럽트 1. Main_Bios.c 설명 void Uart1_RxSwi(void) { int i,rsr,len; <- SWI 스케줄함수명 :: 실제 UART0 수신처리 rsr = SciaRegs.SCIRXST.all & 0xff; <- 수신상태레지스터 if((rsr & 0x9c)!= 0){ <- 에러검사 SciaRegs.SCICTL1.bit.SWRESET=0; <- reset SciaRegs.SCICTL1.bit.SWRESET=1; <- non reset else{ <- 에러없음. en = (SciaRegs.SCIFFRX.all >> 8) & 0x1f; <- 수신 FIFO에서수신된개수읽음. for(i = 0; i < len; i++){ <- 데이터중최종만읽음. com1_rx_data = SciaRegs.SCIRXBUF.all; SEM_post(&sem_com1_rx_eflg); eflg); <- semaphore 생성 ( 수신된데이터있음.) SciaRegs.SCIFFRX.bit.RXFFOVRCLR=1; <- Clear Overflow flag SciaRegs.SCIFFRX.bit.RXFFINTCLR=1; <- Clear Interrupt flag
2. 소스코드설명 (Main_Bios.c) #include "DSP2833x_Device.h <- DSP 초기화및설정관련 #include "F28335_example.h <- 사용자외부함수, 변수, 정의관리 void main(void) { InitSysCtrl(); <- CPU 클럭설정 ((30*10) / 2 = 150M) InitPieCtrl(); <- 인터럽트관련초기화 InitWatchdog(); <- watch-dog 설정및초기화 InitGpio(); <- CPU I/O 설정 (IN,OUT, 기본기능..) _EX_BUS_ON정의에따라외부버스 ON InitXintf(); <- 내부주변디바이스클럭설정및외부버스타이밍설정 ** DSP/BIOS 관련설정 ** memcpy(&secureramfuncs_runstart, runstart &secureramfuncs_loadstart,&secureramfuncs_loadend - &secureramfuncs_loadstart); InitFlash(); com_init(_com1,115200l,non_p,8,1);<- COM1 설정 (DSP2833x_sci.c) asm(" EALLOW"); <- Enable EALLOW protected register access GpioCtrlRegs.GPBMUX1.bit.GPIO32 = 0;<- GPIO032 GPIO GpioCtrlRegs.GPBDIR.bit.GPIO32 = 1; <- GPIO32 output GpioDataRegs.GPBSET.bit.GPIO32 = 1; <- GPIO32 pin is set to 1 asm(" EDIS"); // Disable EALLOW protected register access ** DSP/BIOS에서 TINT2,DLOGINT를사용하므로 BIOS사용인터럽트허가 ** SetDBGIER(IER 0x6000); <- Enable everything in IER, plus TINT2 and DLOGINT *(volatile unsigned int *)0x00000C14 = 0x0C00;<- Set TIMER2 FREE=SOFT=1 ** 아래 main() 를종료하면 DSP/BIOS 가동작.. ** void UserInit(void){ <- 이함수는리셋시 DSP/BIOS 초기화부분에서한번수행후 DSP/BIOS 관련및사용자초기화함수추가 void task1_proc(void){ <- 이함수는스케줄러에관리되는 TASK (OM1 수신처리 ) void Io_Blink(void){ <- PRD 스케줄함수명 Void Uart1_RxSwi(void){ <- COM1_RX SWI 스케줄함수명 3. 소스코드설명 1. DefaultIsr_BIOS.c void SCIRXINTA_ISR(void){ ISR(void){ <- UART0 H/W(PIE9.1) 인터럽트를바로처리하지않고 SWI 로변환하여실행. PieCtrlRegs.PIEACK.all = PIEACK_GROUP9; SWI_post(&UART1_Rx_Swi); <- Must acknowledge the PIE group <- SWI 로변환
2. Main_Bios.c 설명 void Uart1_RxSwi(void) { int i,rsr,len; <- SWI 스케줄함수명 :: 실제 UART0 수신인터럽트처리 rsr = SciaRegs.SCIRXST.all SCIRXST & 0xff; <- 수신상태레지스터 if((rsr & 0x9c)!= 0){ <- 에러검사 SciaRegs.SCICTL1.bit.SWRESET=0; <- reset SciaRegs.SCICTL1.bit.SWRESET=1; <- non reset else{ <- 에러없음. en = (SciaRegs.SCIFFRX.all >> 8) & 0x1f; <- 수신 FIFO에서수신된개수읽음. for(i = 0; i < len; i++){ <- 데이터중최종만읽음. com1_rx_data = SciaRegs.SCIRXBUF.all; SEM_post(&sem_com1_rx_eflg); <- semaphore 생성 ( 수신된데이터있음.) SciaRegs.SCIFFRX.bit.RXFFOVRCLR=1; <- Clear Overflow flag SciaRegs.SCIFFRX.bit.RXFFINTCLR=1; <- Clear Interrupt flag void task1_proc(void) <- 사용자 TASK :: UART0 관리 { while(1) { SEM_pend(&sem_com1_rx_eflg,SYS_FOREVER);<- 1바이트가수실될때까지무한정기다림 com1_putch(com1_rx_data); <- 받은데이터송신 ( 폴링방식 ) TICK 을지정할경우 void task1_proc(void) <- 사용자 TASK :: UART0 관리 { while(1) { if(sem_pend(&sem_com1_rx_eflg,500)){ <- 1바이트가수실될때까지 500 TICK 기다린후처리 ( 리턴참조 ) com1_putch(com1_rx_data); <- 받은데이터송신 ( 폴링방식 )
* CCS3.3 DSP/BIOS 구성및설명 1. Setup CCStudio v3.3 이나 CCSStudio3.3 을실행합니다. 2. 아래와같이 Project 를오픈합니다.(Project->Open) FLASH 에서실행되는프로젝트 버튼클릭
3. Projects Source 파일구성 DSP/BIOS Config 파일 Watch-dog disable 후 C 를실행할때사용, 필요시 project->build option 에서 code entry piont 에서등록하여사용 인터럽트서비스루틴 DelayUs() 함수지원 전역데이터및데이터섹션정의 통신프로그램소스 Flash Memory 관련지원및초기화 CPU I/O 핀초기화 Main() 프로그램 Flash Passwords 관련 CPU 인터럽트초기화 BIOS 인터럽트지원 CPU 클럭설정 Watch-Dog 관련초기화 외부버스초기화 (wait 설정 ) DSP/BIOS Config 에서컴파일시생성 기본 CMD 파일정의 DSP/BIOS Config 에서컴파일시생성
4. DSP/BIOS Config->*.tcf 를실행한다. TASK 생성, LOG_printf 생성법은기존자료참조하세요. 더블클릭 5. System->MEM->L5,L6,L7SARAM 을삭제한다.( 마우스고정후삭제키 ) BIOS 사용메모리확장 Delete 키
6. System->MEM->L4SARAM 내용수정 오른쪽마우스 선택 ( 왼쪽마우스 ) 메모리크기수정 (0x4000) L4-L7 메모리영역모두지정
7. 하드웨어인터럽트를 SWI 로변환 (Scheduling ->HWI->PIE INTERRUPTS->PIE_INT9.1 오른쪽마우스 (PIE_INT9.1) 선택 ( 왼쪽마우스 ) * 하드웨어인터럽트등록 (HWI) 호출되는함수명앞에 _ 를붙임 * 소프트웨어인터럽트허가 (SWI) 체크하지않으면 HWI, 체크하면 SWI 허가
8. Scheduling SWI 등록 (. Scheduling ->Software Interrupt Manager) 오른쪽마우스 선택 ( 왼쪽마우스 ) * SWI 관리명을입력한다.( 프로그램에서호출주소가됨.) 입력후확인
* 생성한 SWI 에사용자환경을설정한다.(UART1_Rx_Swi 선택후오른쪽버튼 ) 오른쪽마우스 선택 ( 왼쪽마우스 ) * General 에서기본정보를설정한다. 주석호출되는함수명앞에 _ 를붙임호출되는함수우선순위레벌 (1( 저 )-15( 고 ))
9. Semaphore 등록 (Synchronization->SEM semaphore Manager) 왼쪽버튼누름 선택 * semaphore 명을입력한다.( 프로그램에서호출변수가됨.) 입력후확인
* 생성한 SEM 에사용자환경을설정한다.(sem_com1_rx_eflg 선택후오른쪽버튼 ) 오른쪽마우스 선택 ( 왼쪽마우스 ) * General 에서기본정보를설정한다. 주석 Semaphore 초기치
* Scheduling SWI 에서생성된 UART1_Rx_Swi 를확인후 *.tcf 파일을종료합니다.
- CCS3.3 DSP/BIOS 실행 1. JTAG 및에뮬레이터를연결합니다. 선택후마우스왼쪽버튼클릭 2. 내부램으로프로그램을실행할경우아래와같이설정합니다.(Option->Customize) 체크
3. 컴파일하기 (Project->Rebuild All) 에러확인
4. FLASH 에프로그램하기 * 아래 CLOCK 설정메뉴를사용자에맞게설정합니다. * API Interface 파일을등록합니다. 선택
Browe.. 창에서파일을선택후 Excute Operation 탭을실행합니다. * TI 실행파일은 *.OUT 로현재작업디렉토리.. debug 에있습니다. 체크후확인 닫음
5. 프로그램을로딩후 Debug 탭에서 Go Main -> RUN 기능을실행합니다. 실행 Main( ) 함수위치로이동 6. BIOS 디버그방법은기존 BIOS 자료를참고하세요.
* TEST 프로그램실행 1. 하이퍼터미널을시작함니다. 2. 하이퍼터미널에서통신포트를설정함니다. 보레이트 데이터비트는반드시재설정 ( 하이퍼에러 )
3. 하이터미널이실행되면아무키나누르면반송됩니다.