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))
);
Posted by 구차니
embeded/Cortex-M3 STM2026. 9. 8. 16:22

귀찮으니 오늘도 대충대충

그나저나 고스팅이란걸 겪어보니 참 난해하구만?

 

핀은 아래처럼 구성하고

 

C1~C4는 A0~A3에 연결함 (C1을 LSB로 보게 하기 위해서)

 

코드는 효율적이진 못하지만 일단 대충 이런느낌으로 작성

row를 high / low로 바꾸면서 col을 읽는구조로 해놨고(col - pin 0~3, row - pin 4~7)

#define BUF_SIZE 50
uint8_t usb_buf[BUF_SIZE];
uint32_t count = 0;
#if 1
int prev_val = 0;
void gpio_proc()
{
  int val = 0;
  // row
  // val |= (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_4) << 4);
  // val |= (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_5) << 5);
  // val |= (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_6) << 6);
  // val |= (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_7) << 7);

  char *swname[4][4] = {
    {"S1", "S2", "S3", "S4"},
    {"S5", "S6", "S7", "S8"},
    {"S9", "S10", "S11", "S12"},
    {"S13", "S14", "S15", "S16"}
  };

  for(uint16_t row_idx = 0; row_idx < 4; row_idx ++)
  {
    uint16_t pin_arr[] = {GPIO_PIN_4, GPIO_PIN_5, GPIO_PIN_6, GPIO_PIN_7};
    HAL_GPIO_WritePin(GPIOA, pin_arr[row_idx], GPIO_PIN_SET);
    HAL_Delay(1);

    // column
    val |= (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) << 0);
    val |= (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_1) << 1);
    val |= (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_2) << 2);
    val |= (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_3) << 3);

    HAL_GPIO_WritePin(GPIOA, pin_arr[row_idx], GPIO_PIN_RESET);

    int col_idx = 0;
    for(int col_idx = 0; col_idx < 4; col_idx++)
    {
      if((val >> col_idx) & 0x01)
      {
        char *name = swname[row_idx][col_idx];
        sprintf((char*)usb_buf + strlen(usb_buf), "%s ", name);
      }
    }

    val = 0;
  }

  sprintf((char*)usb_buf + strlen(usb_buf), " --- %d %X\r\n", count, val);
  CDC_Transmit_FS(usb_buf, BUF_SIZE);
  memset(usb_buf,0,BUF_SIZE);
  count++;

}
#endif

 

한 행에 누르면 전부 인식되지만 (열은 구분 문제 없음)

 

한 열에 누르면 (S4 + S8 + S12)

해당 라인 자체가 눌리지 않은것으로 나온다. 이래서 다이오드 다는건가?

'embeded > Cortex-M3 STM' 카테고리의 다른 글

stm32 gpio hi-z  (0) 2026.09.10
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
Posted by 구차니
embeded/Cortex-M3 STM2026. 9. 4. 10:30

composite는 별도 소스를 넣어야지 cubeMX를 통해서 지원하지 않은것 같고

report id 쪽은 좀더 봐야 알 것 같은데

얘도 cubeMX로 하는건 아닌것 같은 느낌이..

 

[링크 : https://controllerstech.com/stm32-usb-hid-mouse-and-keyboard-combined/] report id 이용

[링크 : https://controllerstech.com/stm32-usb-composite-class-cdc-hid/] 복합클래스

    [링크 : https://controllerstech.com/stm32-usb-hid-mouse-keyboard/]

 

 

'embeded > Cortex-M3 STM' 카테고리의 다른 글

stm32 gpio hi-z  (0) 2026.09.10
stm32f103c9t6(bluepill) + keypad  (0) 2026.09.08
로터리 엔코더.. 2?  (0) 2026.08.31
bluepill / 로터리 엔코더 테스트  (0) 2026.08.28
stm32 port 전체 한번에 출력 변경하기  (0) 2026.06.22
Posted by 구차니
embeded/Cortex-M3 STM2026. 8. 31. 18:23

동료직원 괴롭혀서 실장!

R1_1에 10k가 없었는데 하나 달았다.

 

PB5 에 SW가 있고

 

 

uint8_t CDC_Transmit_FS(uint8_t* Buf, uint16_t Len);
void USB_CDC_RxHandler(uint8_t* Buf, uint32_t Len)
{
  for(int idx = 0; idx < Len;idx++)
  if(Buf[idx] == 0x0D) Buf[idx] = 0x0A;
CDC_Transmit_FS(Buf, Len);
}


#define BUF_SIZE 50
uint8_t usb_buf[BUF_SIZE];
uint32_t count = 0;

char prev_gpio = 0;
void gpio_proc()
{
  char curr_gpio = 0;
  GPIO_PinState gpios[3];
  curr_gpio |= (gpios[0] = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_3));
  curr_gpio |= (gpios[1] = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_4)) << 1;
  curr_gpio |= (gpios[2] = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_5)) << 2;

  char lut[4] = {0, 1, 3, 2};

  if(prev_gpio != curr_gpio)
  {
    char isCW = 0;
    char prev = lut[prev_gpio & 0x03];
    char curr = lut[curr_gpio & 0x03];
    if((prev  + 1) % 4 == curr)
    { isCW = 1; }

    sprintf((char*)usb_buf, "%ld %d %d %s, %d %s\r\n", count, gpios[1], gpios[0], isCW?"CW":"CCW",
     gpios[2], gpios[2]?"rel":"push");
    CDC_Transmit_FS(usb_buf, BUF_SIZE);
    memset(usb_buf,0,BUF_SIZE);
    count++;

    prev_gpio = curr_gpio;
  }
}

 

풀업되어있다가 누르면 떨어지는거라

1이면 안누른거

0이면 누른걸로 인식된다.

35 1 0 CW, 1 rel
36 0 0 CW, 1 rel
37 0 1 CW, 1 rel
38 1 1 CW, 1 rel
39 1 0 CW, 1 rel
40 0 0 CW, 1 rel
41 0 1 CW, 1 rel
42 1 1 CW, 1 rel
43 0 1 CCW, 1 rel
44 0 0 CCW, 1 rel
45 1 0 CCW, 1 rel
46 1 1 CCW, 1 rel
47 0 1 CCW, 1 rel
48 0 0 CCW, 1 rel
49 1 0 CCW, 1 rel
50 1 1 CCW, 1 rel
51 0 1 CCW, 1 rel
52 0 0 CCW, 1 rel
53 0 0 CCW, 0 push
54 0 0 CCW, 1 rel

 

도대체 왜! 이거 부품이 안달려 있는거야?!

'embeded > Cortex-M3 STM' 카테고리의 다른 글

stm32f103c9t6(bluepill) + keypad  (0) 2026.09.08
stm32 usb composite / report id  (0) 2026.09.04
bluepill / 로터리 엔코더 테스트  (0) 2026.08.28
stm32 port 전체 한번에 출력 변경하기  (0) 2026.06.22
stm32 uart data bit  (0) 2026.03.17
Posted by 구차니
embeded/Cortex-M3 STM2026. 8. 28. 12:40

오래되서 기억도 안나네 ㅋㅋ

PB5 - SW (스위치) <- 먼가 오작동.  + 쪽 3V3과 연결되지 않고 따로 전원 연결해줘야 하는 듯.

PB4 - CLK (로터리)

PB3 - DT (로터리)

귀찮아서 USB CDC 를 통해서 출력하게 함.

#define BUF_SIZE 50
uint8_t usb_buf[BUF_SIZE];
uint32_t count = 0;
int prev_gpio = 0;
void gpio_proc()
{
  int curr_gpio = 0;
  GPIO_PinState gpios[3];
  curr_gpio |= (gpios[0] = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_3));
  curr_gpio |= (gpios[1] = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_4)) << 1;
  curr_gpio |= (gpios[2] = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_5)) << 2;

  if(prev_gpio != curr_gpio)
  {
    sprintf((char*)usb_buf, "%ld %d %d %d\r\n", count, gpios[2], gpios[1], gpios[0]);
    CDC_Transmit_FS(usb_buf, BUF_SIZE);
    memset(usb_buf,0,BUF_SIZE);
    count++;

    prev_gpio = curr_gpio;
  }
}

 

시계방향 회전. 두 번 딱딱 걸리고 다시 0 0 0  으로 돌아온다.

[2026-08-28 12:20:17.496] 1897 0 0 0                                            
[2026-08-28 12:20:20.417] 1898 0 0 1                                            
[2026-08-28 12:20:20.469] 1899 0 1 1                                            
[2026-08-28 12:20:20.735] 1900 0 1 0                                            
[2026-08-28 12:20:20.767] 1901 0 0 0

 

반시계방향 회전

[2026-08-28 12:20:20.767] 1901 0 0 0                                            
[2026-08-28 12:20:21.906] 1902 0 1 0                                            
[2026-08-28 12:20:21.959] 1903 0 1 1                                            
[2026-08-28 12:20:22.202] 1904 0 0 1                                            
[2026-08-28 12:20:22.233] 1905 0 0 0  

 

정방향 0 - 1 - 3 - 2 - 0 으로

역방향 0 - 2 - 3 - 1 - 0 으로

표현되긴한데.. gray code 같기도 하고?

[링크 : https://woodforest.tistory.com/147]

 

그래서 저 값을 가지고 판단을 하면 이제 CW 방향인지 CCW 방향인지 판단이 가능해진다.

char prev_gpio = 0;
void gpio_proc()
{
  char curr_gpio = 0;
  GPIO_PinState gpios[3];
  curr_gpio |= (gpios[0] = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_3));
  curr_gpio |= (gpios[1] = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_4)) << 1;
  // curr_gpio |= (gpios[2] = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_5)) << 2;

  char lut[4] = {0, 1, 3, 2};

  if(prev_gpio != curr_gpio)
  {
    char isCW = 0;
    char prev = lut[prev_gpio];
    char curr = lut[curr_gpio];
    if((prev  + 1) % 4 == curr)
    { isCW = 1; }

    sprintf((char*)usb_buf, "%ld %d %d %s\r\n", count, gpios[1], gpios[0], isCW?"CW":"CCW");
    CDC_Transmit_FS(usb_buf, BUF_SIZE);
    memset(usb_buf,0,BUF_SIZE);
    count++;

    prev_gpio = curr_gpio;
  }
}

 

테스트 끝!

[2026-08-28 12:33:57.522] 0 0 1 CW                                              
[2026-08-28 12:33:57.555] 1 1 1 CW                                              

[2026-08-28 12:33:58.521] 2 1 0 CW                                              
[2026-08-28 12:33:58.553] 3 0 0 CW                                              

[2026-08-28 12:33:59.452] 4 1 0 CCW                                             
[2026-08-28 12:33:59.496] 5 1 1 CCW                                             

[2026-08-28 12:34:00.156] 6 1 0 CW                                              
[2026-08-28 12:34:00.178] 7 0 0 CW                                              

[2026-08-28 12:34:00.729] 8 1 0 CCW // 반시계 방향 한번 돌리기
[2026-08-28 12:34:00.779] 9 1 1 CCW                                             

[2026-08-28 12:34:04.895] 10 0 1 CCW // 드륵 느낌이 안나게 반시계 방향으로 천천히 돌림

[2026-08-28 12:34:06.098] 11 1 1 CW    // 드륵 느낌이 날때까지 시계 방향으로 돌림

[2026-08-28 12:34:07.518] 12 0 1 CCW  // 드륵 느낌이 안나게 반시계 방향으로 천천히 돌림

[2026-08-28 12:34:08.590] 13 1 1 CW  // 드륵 느낌이 날때까지 시계 방향으로 돌림

[2026-08-28 12:34:09.858] 14 0 1 CCW                                            
[2026-08-28 12:34:09.916] 15 0 0 CCW                                            

[2026-08-28 12:34:11.124] 16 1 0 CCW                                            
[2026-08-28 12:34:11.154] 17 1 1 CCW                                            

[2026-08-28 12:34:12.087] 18 1 0 CW                                             
[2026-08-28 12:34:12.127] 19 0 0 CW                                             

[2026-08-28 12:34:12.444] 20 0 1 CW                                             
[2026-08-28 12:34:12.476] 21 1 1 CW                                             

[2026-08-28 12:34:12.673] 22 1 0 CW                                             
[2026-08-28 12:34:12.693] 23 0 0 CW                                             

[2026-08-28 12:34:12.746] 24 0 1 CW                                             
[2026-08-28 12:34:12.778] 25 1 1 CW                                             

[2026-08-28 12:34:12.913] 26 1 0 CW  

 

역시 딴짓은 시원한 에어컨과

회사 전기와, 월급을 받으면서 딴짓을 해야 잘됨 ㅋㅋㅋ

'embeded > Cortex-M3 STM' 카테고리의 다른 글

stm32 usb composite / report id  (0) 2026.09.04
로터리 엔코더.. 2?  (0) 2026.08.31
stm32 port 전체 한번에 출력 변경하기  (0) 2026.06.22
stm32 uart data bit  (0) 2026.03.17
stm32 다른 영역으로 점프(부트로더)  (0) 2026.03.06
Posted by 구차니
embeded/Cortex-M3 STM2026. 6. 22. 12:21

AVR 때는 자주 쓴거 같은데

stm32 되면서 함수를 통해 1개 핀에 대해서만 바꾸다 보니 불편해서 찾아보는데

머.. 결국은 레지스터 건드릴 수 밖에 없는 듯

 

ODR 값 읽고 마스킹 후에 한번에 갈아 치우는게 나을 듯

If you want the whole port (all 16 pins) get the value, then you simply write it to the ODR register:
GPIOB->ODR = 0xFFFF; //writing 1/0 in a bit position, 
sets/resets that bit. ALL BITS ARE AFFECTED no matter the value your write in.

If you want to set some pins, but not altering the other pins, with one instruction:
GPIOB->BSRR = 0x00F; //writing 1 in a bit position, 
sets that bit leaves the others as they are

If you want to reset some pins, but not altering the other pins, with one instruction:
GPIOB->BRR = 0x00F; //writing 1 in a bit position, 
clears that bit and leaves the others as they are

If you want a "portion" of a GPIO port to get an specific value, this method is 2 instructions instead of "read-change-write":
GPIOB->BRR = 0x00F; //clear the first 4 bits
GPIOB->BSRR = 0x00A; //set the desired bits in that 4-bit field

 

 ODR 정도는 low level 함수로 존재하나 보다.

using LL API:

LL_GPIO_WriteOutputPort(GPIOA,x);

[링크 : https://electronics.stackexchange.com/questions/683401/can-i-write-a-8-bit-or-16-bit-data-to-the-outport-of-the-stm32-directly]

 

wtite_bits(uint16_t cmd)
{
    uint32_t data = GPIOA -> ODR;

    data &= ~(0x1fff);
    data |= cmd & 0x1fff;
    GPIOA -> ODR = data;

    data = GPIOB -> ODR;
    data &= ~(0x0007);
    data |= (cmd & 0x8fff) >> 13;
    GPIOB -> ODR = data;
}

[링크 : https://stackoverflow.com/questions/48365156/stm32f4-write-read-16bits-into-two-8-bit-gpio-port]

'embeded > Cortex-M3 STM' 카테고리의 다른 글

로터리 엔코더.. 2?  (0) 2026.08.31
bluepill / 로터리 엔코더 테스트  (0) 2026.08.28
stm32 uart data bit  (0) 2026.03.17
stm32 다른 영역으로 점프(부트로더)  (0) 2026.03.06
stm32cubeide cpp 변환이후 generate code  (0) 2026.02.25
Posted by 구차니
embeded/Cortex-M3 STM2026. 3. 17. 10:35

including parity가 좀 헷갈리는데

stm32g473 의 경우 data가 7bit / 8bit / 9bit을 지원한다.

 

f469, f103 은 8bit / 9bit 를 지원한다.

 

 

modbus ascii / 7bit data를 일부 stm32는 사용하지 못하고 stm32F4 나 L4 이후로는 가능한것으로 생각

[링크 : https://blog.naver.com/kim1417/222499708921]

 

정말로.. parity가 1비트 먹어서 data 9 bit 이면 parity none으로 밖에 못쓰나?

[링크 : https://www.st.com/resource/en/reference_manual/rm0008-stm32f101xx-stm32f102xx-stm32f103xx-stm32f105xx-and-stm32f107xx-advanced-armbased-32bit-mcus-stmicroelectronics.pdf]

 

Posted by 구차니
embeded/Cortex-M3 STM2026. 3. 6. 10:33

이런식으로 코드가 보이길래 했더니 실행이 안되서 디버거 물려보니

그냥 먼가.. 무한루프만 돌고 원하는 곳의 코드가 실행이 되지 않길래

/* USER CODE BEGIN 1 */
typedef  void (*pFunction)(void);
uint32_t JumpAddress;
void (*Jump_To_Application)();
/* USER CODE END 1 */

/* USER CODE BEGIN 2 */
  if (HAL_GPIO_ReadPin(Firmup_Pin_GPIO_Port, Firmup_Pin_Pin) != GPIO_PIN_RESET)
  {
    if (((*(__IO uint32_t*)USBD_DFU_APP_DEFAULT_ADD - 1) & 0x2FFFB000 ) == 0x20000000)
    {
      JumpAddress = *(__IO uint32_t*) (USBD_DFU_APP_DEFAULT_ADD + 4);
      Jump_To_Application = (pFunction) JumpAddress;
      __set_MSP(*(__IO uint32_t*) USBD_DFU_APP_DEFAULT_ADD);
      Jump_To_Application();
    }
  }
  MX_USB_DEVICE_Init();
  /* USER CODE END 2 */

[링크 : https://www.os4all.com/69]

 

먼가 더 필요한거 같아서 검색!

​1. 링커스크립트에서 인터럽트벡터가 있는 .isr_vector 섹션의 위치를 수정
2. SystemInit() 함수에서 SCB->VTOR 레지스터를 변경하고자 하는 섹션의 위치로 수정

SCB->VTOR = (uint32_t)&__isr_vector_addr;

[링크 : https://m.blog.naver.com/chcbaram/222580261732]

[링크 : https://m.blog.naver.com/chcbaram/221347218232]

 

먼가 초기화 하면서 손대는게 점점 많아지는 느낌..

아무튼 스택포인터를 옮겨주고 isr 테이블의 리셋 핸들러를 실행해줌으로서 초기화 하고 전체 프로그램을 다시 돌리는 구조인 듯.

void JumpToBootloader(void) {
    // Deinit HAL and Clocks
    HAL_DeInit();
    HAL_RCC_DeInit();
    
    // Disable all interrupts
    __disable_irq();

    // Disable Systick
    SysTick->CTRL = 0;
    SysTick->LOAD = 0;
    SysTick->VAL = 0;

    // Disable interrupts and clear pending ones
    for (size_t i = 0; i < sizeof(NVIC->ICER)/sizeof(NVIC->ICER[0]); i++) {
        NVIC->ICER[i]=0xFFFFFFFF;
        NVIC->ICPR[i]=0xFFFFFFFF;
    }

    // Re-enable interrupts
    __enable_irq();

    // Map Bootloader (system flash) memory to 0x00000000. This is STM32 family dependant.
    __HAL_SYSCFG_REMAPMEMORY_SYSTEMFLASH();
    
    // Set embedded bootloader vector table base offset
    WRITE_REG(SCB->VTOR, SCB_VTOR_TBLOFF_Msk & 0x00000000);

    // Switch to Main Stack Pointer (in case it was using the Process Stack Pointer)
    __set_CONTROL(0);
    
    // Instruction synchronization barrier
    __ISB();

    // Set Main Stack Pointer to the Bootloader defined value.
    __set_MSP(BOOTLOADER_VECTOR_TABLE->stack_pointer);

    __DSB(); // Data synchronization barrier
    __ISB(); // Instruction synchronization barrier

    // Jump to Bootloader Reset Handler
    BOOTLOADER_VECTOR_TABLE->reset_handler();
    
    // The next instructions will not be reached
    while (1){}
}

[링크 : https://gist.github.com/gonzabrusco/fd47e89e4c6fb302fc54b83637a3a101

[링크 : https://blog.naver.com/alfee0/224043194861]

 

'embeded > Cortex-M3 STM' 카테고리의 다른 글

stm32 port 전체 한번에 출력 변경하기  (0) 2026.06.22
stm32 uart data bit  (0) 2026.03.17
stm32cubeide cpp 변환이후 generate code  (0) 2026.02.25
mbed + stm32cube hal...?  (0) 2026.02.23
Mbed studio on ubuntu 22.04  (0) 2026.02.23
Posted by 구차니
embeded/Cortex-M3 STM2026. 2. 25. 16:39

어.. 그냥 얘네는 먼가 하나씩 엇박인 느낌이냐..

CubeIDE 에서 해당 프로젝트를 cpp로 바꾸어도

CubeMX 로 생성되는 파일은 main.c로 나온다. -_-

그냥 알아서(?) 복사해서 넣던가, 아니면 cpp를 c로 바꾸고 generate code 해주던가

영 귀찮네..

 

[링크 : https://community.st.com/t5/stm32cubemx-mcus/generating-c-projects-with-stm32cubemx/td-p/53253]

'embeded > Cortex-M3 STM' 카테고리의 다른 글

stm32 uart data bit  (0) 2026.03.17
stm32 다른 영역으로 점프(부트로더)  (0) 2026.03.06
mbed + stm32cube hal...?  (0) 2026.02.23
Mbed studio on ubuntu 22.04  (0) 2026.02.23
stm32f103c8t6 cpp std::cout 실패  (0) 2026.02.18
Posted by 구차니
embeded/Cortex-M3 STM2026. 2. 23. 21:58

[링크 : https://os.mbed.com/forum/mbed/topic/33580/]

[링크 : https://m.blog.naver.com/rlackd93/222449859004]

 

대충 본걸로는 두 개 같이 정상적(?)으로 사용하는건 쉽지않거나 사실상 불가능한 수준?

 

가능 + 방향

일단 mbed 는 cpp 이고

stm32 hal은 c로 되어있는데 cpp 컴파일러에서 extern c를 통해서 c를 끌어올수 있으니

mbed에서 stm32 hal을 끌어올수는 있다 정도?

 

차이점

arm 의 레지스터를 접근해서 설정하도록 구현되어 있어서

mbed hal과 stm32 hal은 코드레벨에서 호환되지 않는다.

서로 관리하는 구조체도 달라서 두개를 무작정 쓰다 보면 충돌나기 쉽고

isr이 관련될 경우 mbed쪽은 다시 덮어 써버리면서 stm32 hal쪽이 정상작동하지 않게 될 가능성이 높아 보인다.

 

추가로 라이브러리 레벨에서는.. mbed가 cpp를 써서 그런가

isr을 런타임중에 교체 가능하도록 구성되어 있어서 이걸 stm32 hal로 구현하려면 어우..

함수 포인터로 비슷하게 할순 있겠지만 아무튼.. 제법 깊게 짱박혀 있어서 구현해보려면 좀 더 깊숙히 봐야할 것 같다.

mbed 예제보다가 가장 신기했던 타이머 이벤트 추가하는 Timeout 클래스

#include "mbed.h"
Timeout response;
DigitalIn button (p14);
DigitalOut led1(LED1);
DigitalOut led2(LED2);
DigitalOut led3(LED3);

void blink() {
  led2 = 1;
  wait(0.5);
  led2 = 0;
}

int main() {
  while(true) {
    if(button == 1){
      response.attach(&blink, 3.0);
      led3=1;
    } else {
      led3=0;
    }
    led1=!led1;     
    wait(0.2);
  }
}

[링크 : https://os.mbed.com/teams/TVZ-Mechatronics-Team/wiki/Timers-interrupts-and-tasks]

 

[링크 : https://os.mbed.com/docs/mbed-os/v6.16/apis/timeout.html]

 

 

'embeded > Cortex-M3 STM' 카테고리의 다른 글

stm32 다른 영역으로 점프(부트로더)  (0) 2026.03.06
stm32cubeide cpp 변환이후 generate code  (0) 2026.02.25
Mbed studio on ubuntu 22.04  (0) 2026.02.23
stm32f103c8t6 cpp std::cout 실패  (0) 2026.02.18
stm32 rtc tamper  (0) 2026.01.29
Posted by 구차니