BASIC4MCU | ♧ STM32F0 | ◆F0x0 Value Line | [STM32F0] [IAR] 12. 예제폴더 파일 구성
페이지 정보
작성자 master 작성일2018-03-03 17:39 조회5,061회 댓글0건본문
D:\STM32_IAR\Stm32_Nucleo\F0_30R8-Nucleo\ADC_DMA_Transfer
예제 폴더의 파일 구성을 살펴보죠Project.ewdProject.ewpProject.ewwreadme.txtstartup_stm32f030x8.sstm32f030x8_flash.icfstm32f0xx_hal_conf.hstm32f0xx_hal_msp.cstm32f0xx_it.cstm32f0xx_it.hsystem_stm32f0xx.cmain.cmain.h//Project.ewdProject.ewpProject.eww이 파일들은 IAR 프로젝트 파일입니다.프로그램 내용과 보드의 구성에 따라서 프로젝트 옵션이 달라지니 각각의 예제(프로젝트)마다 별도로 존재해야겠죠//startup_stm32f030x8.s스타트업 파일입니다.어셈블리어로 되어 있고이 파일은 프로그램 시작 시 가장 먼저 실행 됩니다.가장 먼저 실행 되려면 리셋 벡터에 코드가 위치 해야겠죠EXTERN __iar_program_start ; 외부에서 program_start 어드레스를 얻어오고PUBWEAK Reset_HandlerSECTION .text:CODE:NOROOT:REORDER(2)Reset_HandlerLDR R0, =SystemInitBLX R0LDR R0, =__iar_program_start ; 리셋이 걸리면 program_start 어드레스로 점프 합니다.BX R0STM32의 어셈블리어를 공부하지 않았으니 확실하지 않을 수도 있지만임베디드 컴파일러들의 처리 방식은 모두 동일하므로 별반 다를 것이 없을겁니다.__iar_program_start이 어드레스는 결국 c 함수의 main으로 갈텐데startup_stm32f030x8.s 스타트업 파일안에 전역변수 초기화라든가, 스텍 처리등의 중요한 초기화 작업이 없으므로중간에 어딘가 들러서 초기화 작업을 하고난 후 c main으로 점프하게 됩니다.이걸 추적하려면 일단 컴파일 해서 파일 결과물을 뒤져봐야하는데컴파일러 옵션을 변경하지 않아서 에러가 많이 발생하는 상태입니다.우선 컴파일러 옵션부터 변경해서 컴파일 오류를 처리해야겠습니다.잠시 오류 처리를 하고 돌아오겠습니다.^^//D:\STM32_IAR\Template\F0_30R8-Nucleo-Template지난번 강좌 시간에 이 폴더의 프로젝트 파일을 수정하는 방법을 소개 해드렸었는데수정한 파일을 참고로 해서 ADC_DMA_Transfer 프로젝트의 컴파일 옵션을 수정 했습니다.에러는 처리 되었고요BSP d:\stm32_iar\lib\BSP\stm32f0xx_nucleo.cCMSIS$PROJ_DIR$\system_stm32f0xx.cEWARM$PROJ_DIR$\startup_stm32f030x8.sHALd:\stm32_iar\lib\HAL\stm32f0xx_hal.cd:\stm32_iar\lib\HAL\stm32f0xx_hal_cortex.cd:\stm32_iar\lib\HAL\stm32f0xx_hal_rcc.cd:\stm32_iar\lib\HAL\stm32f0xx_hal_gpio.cd:\stm32_iar\lib\HAL\stm32f0xx_hal_adc.cd:\stm32_iar\lib\HAL\stm32f0xx_hal_adc_ex.cd:\stm32_iar\lib\HAL\stm32f0xx_hal_dma.cUser$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.icficf는 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.cMSP 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.cstm32f0xx_it.h파일 이름 뒤의 it는 인터럽트의 약어입니다.제 마음에 쏙 들게 줄여놓았군요^^인터럽트 함수가 들어있습니다.//system_stm32f0xx.c여기는 가장 중요한 클럭 설정에 관한 내용이 들어있는 것 같군요//main.cmain.h기본 예제들은 내용이 단순해서 그리 길지 않으니 학습하기에 좋을겁니다.^^
댓글 0
조회수 5,061등록된 댓글이 없습니다.