>

다음 코드의 문제점을 이해하지 못합니다. 모두 전송에 적합하지만 수신에 대해서는 인터럽트가 호출되지 않습니다.

오실로스코프는 정확한 송수신 데이터를 보여줍니다.

#define CONSOLE_RXD_PIN   12
#define CONSOLE_TXD_PIN   11
static USART_InitTypeDef ConsoleUartConfig = {CONSOLE_BAUD_RATE, USART_WordLength_8b, USART_StopBits_1, USART_Parity_No, USART_Mode_Rx | USART_Mode_Tx, USART_HardwareFlowControl_None};
static GPIO_InitTypeDef HAL_TXDGpioConfiguration  =  {(1 << CONSOLE_TXD_PIN), GPIO_Mode_AF, GPIO_Speed_50MHz, GPIO_OType_PP, GPIO_PuPd_NOPULL};
static GPIO_InitTypeDef HAL_RXDGpioConfiguration  =  {(1 << CONSOLE_RXD_PIN), GPIO_Mode_AF, GPIO_Speed_50MHz, GPIO_OType_PP, GPIO_PuPd_UP};

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART6, ENABLE);   
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
GPIO_Init(GPIOA, (GPIO_InitTypeDef *)&HAL_TXDGpioConfiguration);
GPIO_PinAFConfig(GPIOA, CONSOLE_TXD_PIN, CONSOLE_UART_GPIO_AF);
GPIO_Init(GPIOA, (GPIO_InitTypeDef *)&HAL_RXDGpioConfiguration);
GPIO_PinAFConfig(GPIOA, CONSOLE_RXD_PIN, CONSOLE_UART_GPIO_AF);
USART_Init(USART6, &ConsoleUartConfig);
USART_ITConfig(USART6, USART_IT_TXE, ENABLE);
USART_ITConfig(USART6, USART_IT_RXNE, ENABLE); 

NVIC_InitStruct.NVIC_IRQChannel = USART6_IRQn;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;
NVIC_Init(&NVIC_InitStruct);
USART_Cmd(HAL_UartContext.Base, ENABLE);

stm32f413Z 핵 보드입니다.

업데이트 : HAL과 동일하게 시도했지만 여기에서 USART6_IRQHandler 함수도 rx에 대해 호출되지 않았습니다.

   HAL_Init();
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_USART6_CLK_ENABLE();
#define CONSOLE_TXD_PIN   LL_GPIO_PIN_11
/* Configure Tx Pin as : Alternate function, High Speed, Push pull, Pull up */
LL_GPIO_SetPinSpeed(GPIOA, CONSOLE_TXD_PIN, LL_GPIO_SPEED_FREQ_HIGH);
LL_GPIO_SetPinOutputType(GPIOA, CONSOLE_TXD_PIN, LL_GPIO_PULL_NO);
LL_GPIO_SetPinPull(GPIOA, CONSOLE_TXD_PIN, LL_GPIO_PULL_UP);
LL_GPIO_SetPinMode(GPIOA, CONSOLE_TXD_PIN, LL_GPIO_MODE_ALTERNATE);     
LL_GPIO_SetAFPin_8_15(GPIOA, CONSOLE_TXD_PIN, LL_GPIO_AF_8);
#define CONSOLE_RXD_PIN   LL_GPIO_PIN_12
/* Configure Rx Pin as : Alternate function, High Speed, Push pull, Pull up */
LL_GPIO_SetPinSpeed(GPIOA, CONSOLE_RXD_PIN, LL_GPIO_SPEED_FREQ_HIGH);
LL_GPIO_SetPinOutputType(GPIOA, CONSOLE_RXD_PIN, LL_GPIO_OUTPUT_PUSHPULL);
LL_GPIO_SetPinPull(GPIOA, CONSOLE_RXD_PIN, LL_GPIO_PULL_NO);
LL_GPIO_SetPinMode(GPIOA, CONSOLE_RXD_PIN, LL_GPIO_MODE_ALTERNATE);     
LL_GPIO_SetAFPin_8_15(GPIOA, CONSOLE_RXD_PIN, LL_GPIO_AF_8);
NVIC_SetPriority(USART6_IRQn, 0);  
NVIC_EnableIRQ(USART6_IRQn);
LL_USART_EnableIT_TXE(USART6);
LL_USART_EnableIT_RXNE(USART6);
LL_USART_SetTransferDirection(USART6, LL_USART_DIRECTION_TX_RX);
/* 8 data bit, 1 start bit, 1 stop bit, no parity */
LL_USART_ConfigCharacter(USART6, LL_USART_DATAWIDTH_8B, LL_USART_PARITY_NONE, LL_USART_STOPBITS_1);
LL_USART_SetHWFlowCtrl(USART6, LL_USART_HWCONTROL_NONE);
/* Reset value is LL_USART_OVERSAMPLING_16 */
LL_USART_SetOverSampling(USART6, LL_USART_OVERSAMPLING_16);
const uint32_t pclk = __LL_RCC_CALC_PCLK2_FREQ(SystemCoreClock,
    LL_RCC_GetAPB2Prescaler());
LL_USART_SetBaudRate(USART6, pclk, LL_USART_OVERSAMPLING_16, 9600); 
LL_USART_Enable(USART6);

인터럽트 루틴은 다음과 같습니다 :

void USART6_IRQHandler(void)
{
    uint32_t stateflg;
    if (LL_USART_IsActiveFlag_RXNE(USART6) || LL_USART_IsActiveFlag_ORE(USART6))
    {
        LL_USART_ReceiveData8(USART6);
    }
    if (LL_USART_IsActiveFlag_TXE(USART6))
    {
        uint8_t data = 0;
    }
}

  • 답변 # 1

    GPIO 핀의 일반적인 초기화 구조는 다음과 같습니다 :

    typedef struct
    {
        uint32_t GPIO_Pin;
        GPIOMode_TypeDef GPIO_Mode;
        GPIOSpeed_TypeDef GPIO_Speed;
        GPIOOType_TypeDef GPIO_OType;
        GPIOPuPd_TypeDef GPIO_PuPd;
    } GPIO_InitTypeDef;
    
    

    그래서 이것은 초기화와 일치하지 않습니다. 첫 번째 매개 변수는 사용중인 핀이어야합니다.

    일반적으로 매개 변수 위치를 쉽게 변경할 수 있으므로 이런 종류의 초기화를 사용하지 않는 것이 좋습니다. 컴파일러가 이전 버전이 아닌 경우 다음과 같이 "이름이 지정된"방식을 사용할 수 있습니다.

    static GPIO_InitTypeDef HAL_TXDGpioConfiguration  =  {
        .GPIO_Pin = GPIO_Pin_9,
    
    

    추가 :

    USART_ITConfig(GPIOA, USART_IT_TXE, ENABLE);
    USART_ITConfig(GPIOA, USART_IT_RXNE, ENABLE);
    
    

    해야합니다

    USART_ITConfig(USART6, USART_IT_TXE, ENABLE);
    USART_ITConfig(USART6, USART_IT_RXNE, ENABLE);
    
    

  • 이전 excel - 불규칙하고 일관되지 않은 데이터에서 행을 열로 변환
  • 다음 internet explorer - IE11에서 정의되지 않은 IndexedDB