首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >USART无法接收数据

USART无法接收数据
EN

Stack Overflow用户
提问于 2019-05-22 12:21:59
回答 1查看 237关注 0票数 1

我不明白下面的代码有什么问题。对于传输,一切都是正确的,但是对于接收,中断不会被调用。

示波器向我显示正确的数据发送和接收。

代码语言:javascript
复制
#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相同的方法,但这里也没有为rx调用函数USART6_IRQHandler。

代码语言:javascript
复制
    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);

下面是中断例程:

代码语言:javascript
复制
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;
    }

}
EN

回答 1

Stack Overflow用户

发布于 2019-05-22 13:54:59

GPIO引脚的正常初始化结构如下所示:

代码语言:javascript
复制
typedef struct
{
    uint32_t GPIO_Pin;
    GPIOMode_TypeDef GPIO_Mode;
    GPIOSpeed_TypeDef GPIO_Speed;
    GPIOOType_TypeDef GPIO_OType;
    GPIOPuPd_TypeDef GPIO_PuPd;
} GPIO_InitTypeDef;

因此,这与您的初始化不匹配。第一个参数应该是您正在使用的引脚。

一般来说,最好不要使用这种初始化,因为您可以很容易地更改参数位置。如果你的编译器不是太老,你可以使用“命名”的方式,比如:

代码语言:javascript
复制
static GPIO_InitTypeDef HAL_TXDGpioConfiguration  =  {
    .GPIO_Pin = GPIO_Pin_9,

其他:

代码语言:javascript
复制
USART_ITConfig(GPIOA, USART_IT_TXE, ENABLE);
USART_ITConfig(GPIOA, USART_IT_RXNE, ENABLE);

应该是

代码语言:javascript
复制
USART_ITConfig(USART6, USART_IT_TXE, ENABLE);
USART_ITConfig(USART6, USART_IT_RXNE, ENABLE);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56249269

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档