STM32WL 계열에서의 Sub-GHz 무선 인터럽트

STM32WL 계열의 마이크로컨트롤러는 Semtech의 SX1261 및 SX1262 트랜시버에 기반한 Sub-GHz 무선을 내장하고 있습니다. SX126x 소자와 마찬가지로, Sub-GHz 무선 시스템은 SPI 인터페이스, BUSY 제어 라인 그리고 세 개의 인터럽트(IRQ) 라인으로 제어합니다. 유일한 차이점은, 무선 트랜시버가 STM32WL에 집적되어 있어서 이 신호들(그림 1에 표시)이 SoC의 나머지 부분과 내부적으로 연결된다는 것입니다.


그림 1: Sub-GHz 무선 시스템 인터페이스 신호 (RM0453의 그림 9로부터 발췌)

이와 같이, STM32WL Sub-GHz 무선 시스템의 인터럽트 방식은 Semtech SX126x 트랜시버의 인터럽트 방식과 동일합니다. 즉, 10개의 인터럽트 신호원을 활성/비활성화하여 세 개의 IRQ 라인 중 하나에 매핑할 수 있습니다. 이 인터럽트 신호원에 대한 설명이 아래 표 1에 있습니다.

표 1: Sub-GHz 무선 시스템 인터럽트 신호원 (RM0453의 표 37로부터 발췌)

비트 신호원 설명 패킷 유형 동작
0 TxDone 패킷 전송 종료 LoRa와 GFSK TX
1 RxDone 패킷 수신 종료 LoRa와 GFSK RX
2 PreambleDetected 프리앰블 감지 LoRa와 GFSK RX
3 SyncDetected 동기 워드가 유효함 GFSK RX
4 HeaderValid 헤더가 유효함 LoRa RX
5 HeaderErr 헤더 CRC 오류 LoRa RX
6 Err 프리앰블, 동기 워드, 주소, CRC 또는 길이 오류 GFSK RX
6 CrcErr CRC 오류 LoRa RX
7 CadDone 채널 활동 감지 종료 LoRa CAD
8 CadDetected 채널 활동 감지 LoRa CAD
9 Timeout RX 또는 TX 타임아웃 LoRa와 GFSK RX와 TX
15:10 N/A 리저브드 N/A N/A

본 게시글에서는 STM32WL와의 인터페이스에 Sub-GHz 파이 미들웨어용 로우 레벨 드라이버를 사용할 것입니다. 제공된 코드를 (하이 레벨 드라이버를 포함하여) 전체 미들웨어를 사용하는 응용 프로그램에도 적용할 수 있지만, 구현 세부 정보의 대부분이 하이 레벨 계층에 의해 추상화되기 때문에 그렇게 할 필요가 없습니다. STM32WL 프로젝트에 로우 레벨 Sub-GHz 드라이버를 사용하는 것에 대한 보다 자세한 정보는 STM32WL 계열에 로우 레벨 Sub-GHz 무선 드라이버 사용하기를 읽어 보시길 바랍니다.

다음 코드는 STM32WL 무선 인터럽트를 사용하는 기본 절차를 보여줍니다. 첫 번째 단계는 목록 1에 나와 있으며, 호출 함수에 대한 포인터를 드라이버 초기화 루틴의 인수로 전달하는 것입니다. 이 호출 함수는 Sub-GHz 무선 시스템이 인터럽트를 발생할 때마다 실행될 것입니다. 인터럽트 신호원(표 1 참조)을 결정하기 위해, 이 함수는 switch 문(또는 기타 조건부 논리)이 각 개별 인터럽트 신호원을 처리할 수 있도록 단일 매개변수 타입인 RadioIrqMasks_t를 포함해야만 합니다.

목록 1: Sub-GHz 무선 호출 함수 설정 및 구현을 위한 템플릿

// Initialize the hardware (SPI bus, TCXO control, RF switch)
SUBGRF_Init(RadioOnDioIrq);

.
.
.

// Callback function - executed once for each (enabled) interrupt issued from sub-GHz radio
void RadioOnDioIrq(RadioIrqMasks_t radioIrq)
{
  switch (radioIrq)
  {
    case IRQ_TX_DONE:
      // do something
      break;
    case IRQ_RX_DONE:
      // do something
      break;
    case IRQ_RX_TX_TIMEOUT:
      // do something
      break;
    case IRQ_CRC_ERROR:
      // do something
      break;
    default:
      break;
  }
}

Sub-GHz 무선 서브시스템에 의해 인터럽트 요청이 발생되기 위해서는, 하나 이상의 인터럽트 신호원이 전역적으로 활성화되어 세 개의 IRQ 라인 중 하나에 매핑되어 있어야만 합니다. 목록 2에서 볼 수 있듯이, 이는 SUBGRF_SetDioIrqParams() 함수를 호출함으로써 수행됩니다. 이 함수의 첫 번째 매개변수는 전역적 인터럽트 활성화 마스크로, 지정된 인터럽트 신호원을 활성화/비활성화시킵니다. 마지막 세 개의 매개변수는 개별 IRQ 라인에 대한 마스크로, 인터럽트 신호원을 해당하는 라인에 매핑합니다. 예를 들어, 목록 2에서 TxDone, Timeout 및 RxDone 인터럽트는 첫 번째 인수에 의해 전역적으로 활성화됩니다. 두 번째 인수는 TxDone 또는 Timeout 인터럽트가 발생될 때 IRQ1 라인이 로우에서 하이로 전환되어야 함을 나타냅니다. 마찬가지로, IRQ2 라인은 RxDone 인터럽트가 발생되면 로우에서 하이로 전환되어야 합니다. 이 예에서는 IRQ3 라인에 매핑된 인터럽트 신호원은 없습니다.

목록 2: Sub-GHz 무선 시스템에서 인터럽트 활성화하기

SUBGRF_SetDioIrqParams( IRQ_TX_DONE | IRQ_RX_TX_TIMEOUT | IRQ_RX_DONE,
                      IRQ_TX_DONE | IRQ_RX_TX_TIMEOUT,
                      IRQ_RX_DONE,
                      IRQ_RADIO_NONE );

참고: 동일한 IRQ 라인에 매핑된 여러 개의 인터럽트 신호원이 동시에 트리거 되는 경우, 호출 함수는 각 신호원의 이벤트를 처리하기 위해 여러 번 호출될 것입니다.

안타깝게도, Sub-GHz 파이 미들웨어를 직접 수정하는 것 외에는 개별 IRQ 라인에 각각의 호출 함수를 할당할 수 있는 방법이 없습니다. 즉, 트리거 된 인터럽트가 어느 IRQ 라인에 매핑되는지와 관계없이 동일한 호출 함수가 실행될 것입니다. 대부분의 응용 프로그램이 일반적으로 IRQ1 라인만 사용하는 것은 이러한 이유입니다. 어느 IRQ 라인이 트리거 되었는지 응용 프로그램이 밝혀야만 하는 상황이 발생한다면 목록 3에 제공된 코드를 사용할 수 있습니다. 내부 IRQ 라인을 외부로 만들어 GPIO IDR(Input Data Register)을 폴링하여 각 라인의 상태를 가져오는 해결 방법을 사용합니다. 내부 Sub-GHz 무선 신호를 외부로 만드는 것에 대한 자세한 내용은 내부 STM32WL Sub-GHz 무선 인터페이스 신호를 GPIO 핀에 매핑하기를 확인해 보시기 바랍니다.

목록 3: IRQ[0:2] 라인을 GPIO 핀에 라우팅하고 현재 상태 확인하기

#define GPIO_PIN_RF_IRQ1 GPIO_PIN_3
#define GPIO_PIN_RF_IRQ2 GPIO_PIN_5
#define GPIO_PIN_RF_IRQ3 GPIO_PIN_8

/**************************** Initialization Code *****************************/
// Enable GPIOB Clock
__HAL_RCC_GPIOB_CLK_ENABLE();

// Configure RF_{IRQ0, IRQ1, IRQ2} pins
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = GPIO_PIN_RF_IRQ1 | GPIO_PIN_RF_IRQ2 | GPIO_PIN_RF_IRQ3;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF6_RF_BUSY;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);


/************ Conditional logic to be placed in callback function *************/
// Check status of each IRQ line
if (READ_BIT(GPIOB->IDR, GPIO_PIN_RF_IRQ1))
{
  // IRQ1 line triggered
}
else if (READ_BIT(GPIOB->IDR, GPIO_PIN_RF_IRQ2))
{
  // IRQ2 line triggered
}
else if (READ_BIT(GPIOB->IDR, GPIO_PIN_RF_IRQ3))
{
  // IRQ3 line triggered
}

대부분의 경우, STM32WL 계열의 소자에서 Sub-GHz 무선 시스템의 인터럽트들을 관리한다는 것은 외부 RF 트랜시버와 인터페이스하는 것과 동일합니다. 무선 제어 신호의 내재화로 인해 유연성에 있어 약간의 손실이 있을 뿐입니다. 무선 인터럽트를 사용하는 몇 가지 완전한 예제 응용 프로그램이 STM32CubeWL MCU Package에서 이용 가능합니다.



영문 원본: Sub-GHz Radio Interrupts on the STM32WL Series