흐음...?
일단 gpio 읽을 row high + col read 조합으로 하는데 (풀때는 row low)
col 하나가 눌리면 다른 row에서 해당 col은 읽히지가 않아서 찾아보니
high-z로 가야지 읽을수 있다고 한다. 테스트는 필요함
by claude
| STM32 HAL에는 "Hi-Z로 쓰기" 함수가 없어서, 핀 모드를 **입력(No Pull)**으로 바꿔야 Hi-Z가 됩니다. 행을 스캔할 때만 출력으로 바꾸고, 끝나면 다시 입력으로 돌리면 됩니다. static void row_pin_mode(uint16_t pin, uint32_t mode) { GPIO_InitTypeDef init = {0}; init.Pin = pin; init.Mode = mode; init.Pull = GPIO_NOPULL; init.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOA, &init); } static inline void pin_hiz(GPIO_TypeDef *port, uint16_t pin) { uint32_t pos = __builtin_ctz(pin) * 2U; port->MODER &= ~(0x3U << pos); // 00: Input (Hi-Z) } static inline void pin_output(GPIO_TypeDef *port, uint16_t pin) { uint32_t pos = __builtin_ctz(pin) * 2U; port->MODER = (port->MODER & ~(0x3U << pos)) | (0x1U << pos); // 01: Output } |
by chatgpt
| GPIOA->CRL &= ~(0xF << (1 * 4)); GPIOA->CRL |= (0x4 << (1 * 4)); 여기서 0x4는: MODE = 00 → Input CNF = 01 → Floating input 여러 핀을 한꺼번에 예를 들어 PA1, PA2, PA3을 모두 Hi-Z로: GPIOA->CRL &= ~( (0xF << (1 * 4)) | (0xF << (2 * 4)) | (0xF << (3 * 4)) ); GPIOA->CRL |= ( (0x4 << (1 * 4)) | (0x4 << (2 * 4)) | (0x4 << (3 * 4)) ); |
'embeded > Cortex-M3 STM' 카테고리의 다른 글
| stm32f103c9t6(bluepill) + keypad (0) | 2026.09.08 |
|---|---|
| stm32 usb composite / report id (0) | 2026.09.04 |
| 로터리 엔코더.. 2? (0) | 2026.08.31 |
| bluepill / 로터리 엔코더 테스트 (0) | 2026.08.28 |
| stm32 port 전체 한번에 출력 변경하기 (0) | 2026.06.22 |













