♧ STM32F0 > [STM32F0] [IAR] 12. 예제폴더 파일 구성

TODAY402 TOTAL2,431,373
사이트 이용안내
Login▼/회원가입
최신글보기 질문게시판 기술자료 동영상강좌

아두이노 센서 ATMEGA128 PWM LED 초음파 AVR 블루투스 LCD UART 모터 적외선


BASIC4MCU | ♧ STM32F0 | ◆F0x0 Value Line | [STM32F0] [IAR] 12. 예제폴더 파일 구성

페이지 정보

작성자 master 작성일2018-03-03 17:39 조회4,534회 댓글0건

본문

D:\STM32_IAR\Stm32_Nucleo\F0_30R8-Nucleo\ADC_DMA_Transfer

예제 폴더의 파일 구성을 살펴보죠


Project.ewd
Project.ewp
Project.eww
readme.txt
startup_stm32f030x8.s
stm32f030x8_flash.icf
stm32f0xx_hal_conf.h
stm32f0xx_hal_msp.c
stm32f0xx_it.c
stm32f0xx_it.h
system_stm32f0xx.c
main.c
main.h

//
Project.ewd
Project.ewp
Project.eww
이 파일들은 IAR 프로젝트 파일입니다.
프로그램 내용과 보드의 구성에 따라서 프로젝트 옵션이 달라지니 각각의 예제(프로젝트)마다 별도로 존재해야겠죠

//
startup_stm32f030x8.s
스타트업 파일입니다.
어셈블리어로 되어 있고
이 파일은 프로그램 시작 시 가장 먼저 실행 됩니다.
가장 먼저 실행 되려면 리셋 벡터에 코드가 위치 해야겠죠

        EXTERN  __iar_program_start ; 외부에서 program_start 어드레스를 얻어오고

        PUBWEAK Reset_Handler
        SECTION .text:CODE:NOROOT:REORDER(2)
Reset_Handler
        LDR     R0, =SystemInit
        BLX     R0
        LDR     R0, =__iar_program_start ; 리셋이 걸리면 program_start 어드레스로 점프 합니다.
        BX      R0
STM32의 어셈블리어를 공부하지 않았으니 확실하지 않을 수도 있지만
임베디드 컴파일러들의 처리 방식은 모두 동일하므로 별반 다를 것이 없을겁니다.

__iar_program_start
이 어드레스는 결국 c 함수의 main으로 갈텐데
startup_stm32f030x8.s 스타트업 파일안에 전역변수 초기화라든가, 스텍 처리등의 중요한 초기화 작업이 없으므로
중간에 어딘가 들러서 초기화 작업을 하고난 후 c main으로 점프하게 됩니다.
이걸 추적하려면 일단 컴파일 해서 파일 결과물을 뒤져봐야하는데
컴파일러 옵션을 변경하지 않아서 에러가 많이 발생하는 상태입니다.
우선 컴파일러 옵션부터 변경해서 컴파일 오류를 처리해야겠습니다.
잠시 오류 처리를 하고 돌아오겠습니다.^^

//
1949137565_O7VKniSs_25EC25A0259C25EB25AA25A9_25EC2597258625EC259D258C.png3Ftype3Dw740

D:\STM32_IAR\Template\F0_30R8-Nucleo-Template
지난번 강좌 시간에 이 폴더의 프로젝트 파일을 수정하는 방법을 소개 해드렸었는데
수정한 파일을 참고로 해서 ADC_DMA_Transfer 프로젝트의 컴파일 옵션을 수정 했습니다.
에러는 처리 되었고요

  BSP   d:\stm32_iar\lib\BSP\stm32f0xx_nucleo.c
  CMSIS$PROJ_DIR$\system_stm32f0xx.c           
  EWARM$PROJ_DIR$\startup_stm32f030x8.s       
  HAL 
    d:\stm32_iar\lib\HAL\stm32f0xx_hal.c         
    d:\stm32_iar\lib\HAL\stm32f0xx_hal_cortex.c 
    d:\stm32_iar\lib\HAL\stm32f0xx_hal_rcc.c     
    d:\stm32_iar\lib\HAL\stm32f0xx_hal_gpio.c   
    d:\stm32_iar\lib\HAL\stm32f0xx_hal_adc.c     
    d:\stm32_iar\lib\HAL\stm32f0xx_hal_adc_ex.c 
    d:\stm32_iar\lib\HAL\stm32f0xx_hal_dma.c     
 
    User
    $PROJ_DIR$\main.c             
    $PROJ_DIR$\stm32f0xx_hal_msp.c
    $PROJ_DIR$\stm32f0xx_it.c     
 

지난번에 만지면서 프로젝트 파일을 건드렸는지
BSP와 HAL 그룹에 파일이 하나도 없어서 추가해주었습니다.

//
__iar_program_start
다시 이 어드레스의 추적을 마져 해보죠

Project.map
출력 파일 중에서 map 파일을 열어봅니다.

  Section            Kind        Address    Size  Object
  -------            ----        -------    ----  ------
"A1":                                       0xb4
  .intvec            ro code  0x08000000    0xb4  startup_stm32f030x8.o [1]
                            - 0x080000b4    0xb4
스타트업 파일의 어드레스는 리셋 벡터였죠

__iar_program_start     0x0800166d         Code  Gb  cstartup_M.o [4]
__iar_zero_init3        0x0800153d   0x3c  Code  Gb  zero_init3.o [4]
__low_level_init        0x0800162f    0x4  Code  Gb  low_level_init.o [3]
__vector_table          0x08000000         Data  Gb  startup_stm32f030x8.o [1]
_call_main              0x08001621         Code  Gb  cmain.o [4]
_exit                   0x0800163d         Code  Gb  cexit.o [4]
_main                   0x0800162b         Code  Gb  cmain.o [4]
aADCxConvertedData      0x20000460   0x40  Data  Lc  main.o [1]
exit                    0x08001633    0x8  Code  Gb  exit.o [3]
main                    0x080012b9   0xb0  Code  Gb  main.o [1]
sConfig                 0x20000454    0xc  Data  Gb  main.o [1]
uwTick                  0x200004e4    0x4  Data  Gb  stm32f0xx_hal.o [1]
위에서 언급한 전역변수 초기화 및 스텍 설정등을 색칠한 라인에서 할 것 같습니다.
그리고는 메인함수가 실행 되겠죠

//
다시 파일 구성으로 넘어가서
startup_stm32f030x8.s 스타트업 파일의 내용은 인터럽트 벡터 정도만 들어있어서
벡터를 수정할 이유가 없다면 이 파일을 건드릴 이유가 없을테고
프로젝트 파일에 존재할 필요가 없을 것 같습니다.
그런데도 프로젝트 파일에 존재한다는 이유는 별 것 없는 내용이지만 수정할 가능성이 있다는 것이겠죠

//
stm32f030x8_flash.icf
icf는 linker configuration file 이라고 합니다.
define symbol __ICFEDIT_intvec_start__ = 0x08000000;
define symbol __ICFEDIT_region_ROM_start__ = 0x08000000;
define symbol __ICFEDIT_region_ROM_end__   = 0x0800FFFF;
define symbol __ICFEDIT_region_RAM_start__ = 0x20000000;
define symbol __ICFEDIT_region_RAM_end__   = 0x20001FFF;
define symbol __ICFEDIT_size_cstack__ = 0x400;
define symbol __ICFEDIT_size_heap__   = 0x200;
인터럽트 벡터, ROM, RAM 어드레스와 cstack, heap의 크기를 설정하고 있습니다.
이 것들도 프로젝트 구성에 따라서 변경 할 가능성이 있으니 프로젝트 파일에 넣어두었겠죠

//
stm32f0xx_hal_conf.h
#define HAL_MODULE_ENABLED         //stm32f0xx_hal.c
#define HAL_ADC_MODULE_ENABLED     //stm32f0xx_hal_adc.c //stm32f0xx_hal_adc_ex.c
/* #define HAL_CAN_MODULE_ENABLED */
/* #define HAL_CEC_MODULE_ENABLED */
/* #define HAL_COMP_MODULE_ENABLED */
#define HAL_CORTEX_MODULE_ENABLED  //stm32f0xx_hal_cortex.c
/* #define HAL_CRC_MODULE_ENABLED */
/* #define HAL_DAC_MODULE_ENABLED */
#define HAL_DMA_MODULE_ENABLED  //stm32f0xx_hal_dma.c
#define HAL_FLASH_MODULE_ENABLED //stm32f0xx_hal_flash.c //stm32f0xx_hal_flash_ex.c // 이 파일은 넣지 않았는데 문제가 생기면 프로젝트에 추가해주세요, 일단 이 파일 없이 컴파일 오류는 생기지 않았습니다.
#define HAL_GPIO_MODULE_ENABLED //stm32f0xx_hal_gpio.c
/* #define HAL_I2C_MODULE_ENABLED */
/* #define HAL_I2S_MODULE_ENABLED */
/* #define HAL_IRDA_MODULE_ENABLED */
/* #define HAL_IWDG_MODULE_ENABLED */
/* #define HAL_PCD_MODULE_ENABLED */
/* #define HAL_PWR_MODULE_ENABLED */
#define HAL_RCC_MODULE_ENABLED //stm32f0xx_hal_rcc.c
/* #define HAL_RTC_MODULE_ENABLED */
/* #define HAL_SMARTCARD_MODULE_ENABLED */
/* #define HAL_SMBUS_MODULE_ENABLED */
/* #define HAL_SPI_MODULE_ENABLED */
/* #define HAL_TIM_MODULE_ENABLED */
/* #define HAL_TSC_MODULE_ENABLED */
/* #define HAL_UART_MODULE_ENABLED */
/* #define HAL_USART_MODULE_ENABLED */
/* #define HAL_WWDG_MODULE_ENABLED */
사용하는 모듈만 나두고 나머지는 막아두고 있습니다.
파일 아래에서는 사용하는 모듈들에 따라서 필요한 초기화 작업과 헤더파일을 include 하고 있습니다.

//
stm32f0xx_hal_msp.c
MSP  MCU Specific Package  MCU 특정 패키지
보드의 MCU 관련 함수가 담긴 파일로 생각하면 되겠습니다.

#include "main.h"

void HAL_ADC_MspInit(ADC_HandleTypeDef *hadc){
  GPIO_InitTypeDef          GPIO_InitStruct;
  static DMA_HandleTypeDef         DmaHandle;
  
  /*##-1- Enable peripherals and GPIO Clocks #################################*/
  /* Enable GPIO clock ****************************************/
  __HAL_RCC_GPIOA_CLK_ENABLE();
  /* ADC1 Periph clock enable */
  ADCx_CLK_ENABLE();
  /* Enable DMA1 clock */
  __HAL_RCC_DMA1_CLK_ENABLE();
  
  /*##- 2- Configure peripheral GPIO #########################################*/
  /* ADC Channel GPIO pin configuration */
  GPIO_InitStruct.Pin = ADCx_CHANNEL_PIN;
  GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  HAL_GPIO_Init(ADCx_CHANNEL_GPIO_PORT, &GPIO_InitStruct);
  /*##- 3- Configure DMA #####################################################*/ 

  /*********************** Configure DMA parameters ***************************/
  DmaHandle.Instance                 = DMA1_Channel1;
  DmaHandle.Init.Direction           = DMA_PERIPH_TO_MEMORY;
  DmaHandle.Init.PeriphInc           = DMA_PINC_DISABLE;
  DmaHandle.Init.MemInc              = DMA_MINC_ENABLE;
  DmaHandle.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
  DmaHandle.Init.MemDataAlignment    = DMA_MDATAALIGN_HALFWORD;
  DmaHandle.Init.Mode                = DMA_CIRCULAR;
  DmaHandle.Init.Priority            = DMA_PRIORITY_MEDIUM;
  /* Deinitialize  & Initialize the DMA for new transfer */
  HAL_DMA_DeInit(&DmaHandle);
  HAL_DMA_Init(&DmaHandle);
  
  /* Associate the DMA handle */
  __HAL_LINKDMA(hadc, DMA_Handle, DmaHandle);

  /* NVIC configuration for DMA Input data interrupt */
  HAL_NVIC_SetPriority(DMA1_Channel1_IRQn, 1, 0);
  HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn);  
}

void HAL_ADC_MspDeInit(ADC_HandleTypeDef *hadc){

  /*##-1- Reset peripherals ##################################################*/
  ADCx_FORCE_RESET();
  ADCx_RELEASE_RESET();
  /* ADC Periph clock disable
   (automatically reset all ADC instances of the ADC common group) */
  __HAL_RCC_ADC1_CLK_DISABLE();

  /*##-2- Disable peripherals and GPIO Clocks ################################*/
  /* De-initialize the ADC Channel GPIO pin */
  HAL_GPIO_DeInit(ADCx_CHANNEL_GPIO_PORT, ADCx_CHANNEL_PIN);
}

main.h 헤더파일 include 하나하고, 함수 두개가 있습니다.
사용자 파일이 아닌 MCU 관련 함수들의 설정을 모아둔 파일 같군요

//
stm32f0xx_it.c
stm32f0xx_it.h
파일 이름 뒤의 it는 인터럽트의 약어입니다.
제 마음에 쏙 들게 줄여놓았군요^^
인터럽트 함수가 들어있습니다.

//
system_stm32f0xx.c
여기는 가장 중요한 클럭 설정에 관한 내용이 들어있는 것 같군요

//
main.c
main.h
기본 예제들은 내용이 단순해서 그리 길지 않으니 학습하기에 좋을겁니다.^^ 

댓글 0

조회수 4,534

등록된 댓글이 없습니다.

♧ STM32F0HOME > ♧ STM32F0 > 전체 목록

게시물 검색

2022년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2021년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2020년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2019년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2018년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
Privacy Policy
MCU BASIC ⓒ 2020
모바일버전으로보기