[STM32F10x-StdPeriph] 1. SmartRobot Board 실습 - GPIO Output Control
이번 강좌에서는 GPIO컨트롤을 해볼까 합니다.
GroundZero님이 http://cafe.naver.com/openrt/2669 게시물에 올리신 아두이노를 이용한 J7-3 번 핀에 대한 컨트롤을 Standard Peripheral Library를 이요하여 구현해보는 것이 목적입니다.
Base Code는 http://lifeseed.tistory.com/75 게시물의 첨부파일이며, 1초마다 LED가 켜졌다, 꺼졌다를 반복하는 코드입니다.
void setup(void) RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB , ENABLE ); /* J7-3 PB2 */
void loop(void) |
arch/main.c 의 setup 및 loop함수에 위와 같이 코딩하고 cs-make를 통하여 Build합니다.
. . . ./arch/main.c:53:2: warning: implicit declaration of function 'GPIO_WriteBit' [- |
라이브러리에서 제공하는 함수가 define이 안되어 있다는 군요.
모든 라이브러리를 한번에 include를 하고 빌드를 하면 좋겠지만, 코드 사이즈가 커져서 Flash용량보다 커지는 경우가 발생할 수 있어 필요한 라이브러리만 include하여 사용하게 됩니다.
필요한 라이브러리를 include하는 방법은 다음과 같이 2개의 파일을 수정합니다.
1) arch/include/stm32f10x_conf.h 의 38라인의 주석을 풀어줍니다.
/* #include "stm32f10x_gpio.h" */ => #include "stm32f10x_gpio.h"
2) arch/STM32F10x_StdPeriph_Driver/src/Makefile.inc 의 18번째 라인의 주석을 풀어 줍니다.
#STM32F10X_DRV_SRC += stm32f10x_gpio.c => STM32F10X_DRV_SRC += stm32f10x_gpio.c
그리고 다시 빌드를 하면
arm-none-eabi-objcopy -O binary stm32f103cb.elf stm32f103cb.bin arm-none-eabi-objdump -h -S -C stm32f103cb.elf > stm32f103cb.lss arm-none-eabi-nm -n stm32f103cb.elf > stm32f103cb.sym arm-none-eabi-size -A stm32f103cb.elf stm32f103cb.elf : section size addr .text 7356 134234112 .data 40 536870912 .heap 3072 536870952 .stack_dummy 1024 536870952 .ARM.attributes 41 0 .comment 48 0 .debug_info 17894 0 .debug_abbrev 3895 0 .debug_aranges 328 0 .debug_line 5702 0 .debug_str 7094 0 .debug_frame 3288 0 .debug_loc 12151 0 .debug_ranges 192 0 Total 62125 |
================== Main Menu ============================ Download Image To Flash ------- 1 Upload Image From Flash ------- 2 Execute ------------------------------ 3 ========================================================== Waiting for the file to be sent ... (press 'a' to abort) Programming Completed Successfully! |
그러면 J7-3번 핀에 연결된 LED가 1초마다 한번씩 깜빡이는 것을 확인 할 수 있습니다.
- SmartRobot Board의 J7-3 번핀은 PB2번이 할당되어 있습니다. 위의 코드는 GPIOB port에 Clock을 인가해 실제 GPIO가 동작하도록 합니다. 모든 Peri. 들은 사용전에 반드시 Clock을 인가해 주어야 합니다.
2) GPIOB Pin2를 Output으로 설정
GPIO_InitTypeDef GPIO_InitStructure; |
- GPIOB의 2번핀을 Output push-pull 모드로 설정합니다.
GPIO_WriteBit(GPIOB, GPIO_Pin_2, 1); |
void setup(void)
void loop(void) delay(1000); |
GPIO A ~ D Base Address : [0x40010800, 0x40010C00, 0x40011000, 0x40011400]
GPIO E ~ G Base Address : [0x40011800, 0x40011C00, 0x40012000] |
void setup(void) int reg_value;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB , ENABLE );
reg_value = *(volatile unsigned int *)0x40010c00; reg_value &= (~0xF00); }
void loop(void)
reg_value = *(volatile unsigned int *)0x40010c0c;
reg_value |= (0x4);
osa_mdelay(1000); |