이번 강좌에서는 이전 강좌에 이어 GPIO Input 컨트롤을 해볼까 합니다.
앞의 예제를 그대로 이용할 생각이며, J7-4 번 핀을 Switch등을 통해 입력으로 받아 Low/High에 따라 J7 - 3번 핀의 출력을 제어해보는 것이 목적입니다.
Base Code는 http://lifeseed.tistory.com/75 게시물의 첨부파일이며, 컴파일 Error가 발생할 경우 http://lifeseed.tistory.com/76 의 1번항목을 정독 부탁드립니다.
void setup(void) RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB , ENABLE ); /* J7-3 PB2 */
/* J7-4 PB10 */ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
void loop(void) if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_10)) } } |
arch/main.c 의 setup 및 loop함수에 위와 같이 코딩하고 cs-make를 통하여 Build합니다.
컴파일 에러가 날 경우 gpio library를 include해야 합니다.
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 7392 134234112 .data 40 536870912 .heap 3072 536870952 .stack_dummy 1024 536870952 .ARM.attributes 41 0 .comment 48 0 .debug_info 17905 0 .debug_abbrev 3908 0 .debug_aranges 328 0 .debug_line 5727 0 .debug_str 7140 0 .debug_frame 3292 0 .debug_loc 12151 0 .debug_ranges 192 0 Total 62260 |
================== 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! |
- SmartRobot Board의 J7-3 번핀은 PB2번이 할당되어 있습니다. 위의 코드는 GPIOB port에 Clock을 인가해 실제 GPIO가 동작하도록 합니다. 모든 Peri. 들은 사용전에 반드시 Clock을 인가해 주어야 합니다.
2) GPIOB Pin2를 Output으로 설정 - 지난 강좌와 동일합니다.
GPIO_InitTypeDef GPIO_InitStructure; |
3) GPIOB Pin10를 Input으로 설정
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; |
4) GPIOB 10번핀 입력값 읽어오기
GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_10); |
GPIO_WriteBit(GPIOB, GPIO_Pin_2, 1); |
void setup(void) pinMode(BUTTON_PIN, INPUT);
void loop(void) if(digitalRead(BUTTON_PIN)==HIGH) { } else { digitalWrite(BOARD_LED_PIN, LOW); } |
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 );
// PB2 Output reg_value = *(volatile unsigned int *)0x40010c00; reg_value &= (~0xF00);
// PB10 Input reg_value = *(volatile unsigned int *)0x40010c04; reg_value &= (~0xF00); }
void loop(void)
reg_value = *(volatile unsigned int *)0x40010c0c; input_value = *(volatile unsigned int *)0x40010c08;
if(input_value & 0x400) { reg_value |= (0x4); } else { reg_value &= (~0x4); } |