iar 로 되어 있는 프로젝트 소스를 확인해 보기로 했다.

option 의 linker 부분을 보면 config 창에

STM32F10x-FLASH.icf 가 있다. 여기부터 봐야 겠지..

 

------ STM32F10x-FLASH.ic 내용 ---------------------

/*###ICF### Section handled by ICF editor, don't touch! ****/
/*-Editor annotation file-*/
/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\a_v1_0.xml" */
/*-Specials-*/
define symbol __ICFEDIT_intvec_start__ = 0x08000000; //백터 번지가 여기부터란다.
/*-Memory Regions-*/
define symbol __ICFEDIT_region_ROM_start__ = 0x08000000 ; //ROM의 start번지 flash의 시작번지다
define symbol __ICFEDIT_region_ROM_end__ = 0x0807FFFF; //>>ROM의 끝번지 flash의 끝번지
define symbol __ICFEDIT_region_RAM_start__ = 0x20000000; //>>RAM의 첫번지 , 내부램번지
define symbol __ICFEDIT_region_RAM_end__ = 0x2000FFFF; //>>RAM의 끝번지, 내부램번지
/*-Sizes-*/
define symbol __ICFEDIT_size_cstack__ = 0x400; //>>스텍용량 0x400잡았다. 좀 더 키우는게 좋을듯 하긴하다.
define symbol __ICFEDIT_size_heap__ = 0x200; //>>heap 사이즈다. 멜록을 더잡거나 printf를 많이 쓰면 더 키워야 할듯 하다.
/**** End of ICF editor section. ###ICF###*/

//>>아래는 메모리 알아서 잡는데 위쪽 메모리 번지만 바꾸면 알아서 변경될듯 하다.

define memory mem with size = 4G;
define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__];
define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__];

define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { };
define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { };

initialize by copy { readwrite };
do not initialize { section .noinit };

place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec };

place in ROM_region { readonly };
place in RAM_region { readwrite,
block CSTACK, block HEAP };

--------------------------------

 

메모리 잡는것은 다른 CPU 잡는것보다는 명확해 보여서 좋다. keil은 ide 환경에서 바로

설정이 가능한것으로 알고 있는데 iar은 찾아보니 그런내용이 config쪽에 없네 ..

그냥 pass

부팅되면 역시 스타트 번지의 asm 쪽 코드가 실행될것이다. 자 어떤 놈이가 찾아보니

startup_stm32f10x_md.s 라는 파일이 있다.

역시 cortex 다 인터럽트 백터만 잔뜩 모여 있다. 예전 arm7이나 arm9은 이부분 source를

꼭 확인 하려면 asm을 찾아봐야 했는데. (모 예전것은 거의 레지스터에 있는것을 스텍에 넣어주는

코드가 거의 대부분 이었다.) 스텍처리를 cpu가 알아서 하니 startup code가 무지 간단해

지는구나 .. 인터럽트 속도가 무지 빨리질듯 하다.

예를 들어 DMA1의 Channel1의 인터럽트가 발생하면

인터럽트 번지에 점프를 할꺼고 거기에 아래와 같이 설정되어 있어서

 

-------------------------------------------------------

DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1 -> 인덱스를 알려줌
--------------------------------------------------------

 

해당번지의 내용 DMA1_Channel1_IRQHandler 소스쪽으로 점프를 할것이다.

 

--------------------------------------------------------

PUBWEAK DMA1_Channel1_IRQHandler
SECTION .text:CODE:REORDER(1)
DMA1_Channel1_IRQHandler -> 인덱스
B DMA1_Channel1_IRQHandler -> 요기서 csource 로 점프

--------------------------------------------------------

 

이후 stm32f10x_it.c 에 있는 void DMA1_Channel1_IRQHandler(void) 함수로

가게 된다. 나는 이 함수에 인터럽트 처리관련 source 를 짜면 된다. ㅋㅋㅋ

 

--------------------------------------------------------

void DMA1_Channel1_IRQHandler(void)
{
    Send_Buffer[0] = 0x07;

if((ADC_ConvertedValueX >>4) - (ADC_ConvertedValueX_1 >>4) > 4)
{
    Send_Buffer[1] = (uint8_t)(ADC_ConvertedValueX >>4);
    UserToPMABufferCopy(Send_Buffer, ENDP1_TXADDR, 2);
    SetEPTxCount(ENDP1, 2);
    SetEPTxValid(ENDP1);
    ADC_ConvertedValueX_1 = ADC_ConvertedValueX;
}

DMA_ClearFlag(DMA1_FLAG_TC1);
}
--------------------------------------------------------

'공부 > STM32' 카테고리의 다른 글

[STM32] Source 보기 3  (0) 2012.11.09
[STM32] SOURCE 보기 2  (0) 2012.11.09
[STM32] 프로젝트 구성 내용  (0) 2012.11.09
[STM32] 프로젝트의 제구성  (0) 2012.11.09
[STM32] WRITER ..  (0) 2012.11.09

+ Recent posts