embeded/Cortex-M3 STM2026. 9. 10. 21:41

흐음...?

일단 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' 카테고리의 다른 글

ws2812b vs hub75  (0) 2026.09.23
네오픽셀 ws2812b-64 작동  (0) 2026.09.23
stm32f103c9t6(bluepill) + keypad  (0) 2026.09.08
stm32 usb composite / report id  (0) 2026.09.04
로터리 엔코더.. 2?  (0) 2026.08.31
Posted by 구차니