SDK 2.0 의 UART 드라이버 에서 Handle 의 용법 을 볼 수 있 습 니 다.

5536 단어 C
1.
/* Create UART1 handle */ UART_TransferCreateHandle(TEST_UART1_BASE, &g_uart1_handle, uart_interrupt_callback, NULL);
세 개의 인자:
  • art 기본 주소 TESTUART1_BASE
  • Uart handle 구조 체 변수 주소
  • allback 함수 의 주소
  • 구조 체 유형 정 의 는 다음 과 같다.
    ! @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

    좋은 웹페이지 즐겨찾기