SDK 2.0 의 UART 드라이버 에서 Handle 의 용법 을 볼 수 있 습 니 다.
5536 단어 C
/* Create UART1 handle */ UART_TransferCreateHandle(TEST_UART1_BASE, &g_uart1_handle, uart_interrupt_callback, NULL);
세 개의 인자:
! @brief UART handle structure. */
struct _uart_handle
{
uint8_t *volatile txData; /*!< Address of remaining data to send. */
volatile size_t txDataSize; /*!< Size of the remaining data to send. */
size_t txDataSizeAll; /*!< Size of the data to send out. */
uint8_t *volatile rxData; /*!< Address of remaining data to receive. */
volatile size_t rxDataSize; /*!< Size of the remaining data to receive. */
size_t rxDataSizeAll; /*!< Size of the data to receive. */
uint8_t *rxRingBuffer; /*!< Start address of the receiver ring buffer. */
size_t rxRingBufferSize; /*!< Size of the ring buffer. */
volatile uint16_t rxRingBufferHead; /*!< Index for the driver to store received data into ring buffer. */
volatile uint16_t rxRingBufferTail; /*!< Index for the user to get data from the ring buffer. */
uart_transfer_callback_t callback; /*!< Callback function. */
void *userData; /*!< UART callback function parameter.*/
volatile uint8_t txState; /*!< TX transfer state. */
volatile uint8_t rxState; /*!< RX transfer state */
};
2. void UART_TransferCreateHandle (UART Type * base, uart handle t * handle, uart transfer callback t callback, void * userData) {handle 구조 체 a. TX / RX 상 태 를 설정 합 니 다. b. 콜백 과 사용자 데 이 터 를 설정 합 니 다. c. static uart handle t * s uartHandle [UART HANDLE ARRAY SIZE]; s urt Handle 은 포인터 배열 로 그 안에 Uart 0 Uart 1... 각자 Hander 구조 체 의 주 소 를 넣 는 데 사 용 됩 니 다.
/* Get instance from peripheral base address. */
instance = UART_GetInstance(base);
/* Save the handle in global variables to support the double weak mechanism. */
s_uartHandle[instance] = handle;
d. s uartIsr 는 함수 포인터 입 니 다. UART Transfer HandleIRQ 라 는 함수 의 주 소 를 이 함수 포인터 에 할당 합 니 다. 이렇게 UART 0 DriverIRQ Handler 라 는 시스템 이 결정 하 는 인 터 럽 트 처리 함수 에 s uartIsr (UART 0, s uartHandle [0) 를 고정 적 으로 쓸 수 있 습 니 다.; 이 한 마디; 실제로 중단 되면 호출 되 는 함 수 는 확실히 제 사용자 app. c 가 UART TransferCreate Handle 이라는 함 수 를 통 해 주 소 를 전 달 했 습 니 다.
UART 0 DriverIRQHandler 가 호출 한 함수 가 어떻게 들 어 오 는 지 만 해결 되 었 습 니 다. 이 함수 에 인자 가 필요 하 다 면 어떻게 하 시 겠 습 니까? 여기 가 s urt Handle 이라는 c 항목 을 통 해 언급 된 포인터 배열 입 니 다.
/* Typedef for interrupt handler. */ typedef void (*uart_isr_t)(UART_Type *base, uart_handle_t *handle); /* UART ISR for transactional APIs. */ static uart_isr_t s_uartIsr;
void UART0_DriverIRQHandler(void) { s_uartIsr(UART0, s_uartHandle[0]); }
s_uartIsr = UART_TransferHandleIRQ;
e.
/* Enable interrupt in NVIC. */
EnableIRQ(s_uartIRQ[instance]);
}
3. 총괄: app. c 에서 fsl 호출urt. c 이 유 니 버 설 구동 함수 의 UARTTransferCreate Handle 함수.
UART_TransferCreate Handle 함 수 는 들 어 오 는 callback and user data 데 이 터 를 Handle 구조 체 에 넣 고 Handle 구조 체 의 주 소 를 s 에 게 주 었 습 니 다.urt Handle 이라는 Handle 구조 체 지침 배열 에서 이 배열 지침 은 모든 UART 에 적용 된다.이렇게 surtHandle 이거 fslurt. c 에서 정의 하 는 Handle 구조 체 포인터 배열 은 각 UART 의 Handle 구조 체 에 도착 할 수 있 습 니 다.
s_uartIsr = UART_TransferHandleIRQ; UART_Transfer HandleIRQ 이 함수 에 서 는 Handle 구조 체 를 통 해 callback 함 수 를 호출 합 니 다.
4. 위의 구동 은 모든 UART 에 시스템 이 기본적으로 정의 한 함수 입구 에 적 용 됩 니 다.
그러나 KM 34 에서 UART 0123 는 하나의 함수 입 구 를 공유 합 니 다. 즉, fsl 가 존재 하지 않 습 니 다.urt. c 기본 정의 UART 0DriverIRQHandler UART1_DriverIRQHandler 。。。이 함수 들.그 러 니까 나 도 UART 를 호출 하지만TransferCreate Handle surt Handle 포인터 배열 과 surt Isr 함수 포인터 가 할당 되 었 지만 처리 되 지 않 습 니 다.이 럴 때 어 떡 하지??
그럼 직접 app. c 에 쓰 세 요.공용 이기 때문에 guart1_interrupt_enabled,g_uart2_interrupt_enabled 이 플래그 들 은 UART 의 처리 함 수 를 결정 합 니 다.
#if TEST_UART1_UART2_SHARE_IRQn
void UART0_UART1_UART2_UART3_IRQHandler(void)
{
if (g_uart1_interrupt_enabled)
{
UART_TransferHandleIRQ(TEST_UART1_BASE, &g_uart1_handle);
}
if (g_uart2_interrupt_enabled)
{
UART_TransferHandleIRQ(TEST_UART2_BASE, &g_uart2_handle);
}
}
#endif
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Visual Studio에서 파일 폴더 구분 (포함 경로 설정)Visual Studio에서 c, cpp, h, hpp 파일을 폴더로 나누고 싶었습니까? 어쩌면 대부분의 사람들이 있다고 생각합니다. 처음에 파일이 만들어지는 장소는 프로젝트 파일 등과 같은 장소에 있기 때문에 파일...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.