鸣蜩伍 2023-09-27 15:32 采纳率: 20%
浏览 22
已结题

stm32f103zet6 串口5无法接收数据

stm32f103zet6 串口5无法接收数据
相同配置下串口3和串口1能够收发数据
不能进入中断函数

/* UART3 Buffer Defines */
#define USART5_RX_BUFFER_SIZE 64     /* 2,4,8,16,32,64,128 or 256 bytes */
#define USART5_TX_BUFFER_SIZE 256     /* 2,4,8,16,32,64,128 or 256 bytes */
#define USART5_RX_BUFFER_MASK ( USART5_RX_BUFFER_SIZE - 1 )
#define USART5_TX_BUFFER_MASK ( USART5_TX_BUFFER_SIZE - 1 )


UartRxBuffer  USART5_Rx_Buffer;

void UartInit(void)
{
    UartBufferInit();
    Uart5Init();
    UartNVIC();  
}

void UartBufferInit()
{      
    USART5_Rx_Buffer.buffer = (u8*)malloc(USART5_RX_BUFFER_SIZE);
    memset(USART5_Rx_Buffer.buffer,0,USART5_RX_BUFFER_SIZE);
    USART5_Rx_Buffer.index = 0;
    USART5_Rx_Buffer.maxSize = USART5_RX_BUFFER_SIZE; 
}

void Uart5Init(void)
{
   RCC_APB1PeriphClockCmd(RCC_APB1 Periph_UART5,ENABLE);
    USART_InitTypeDef USART_InitStructure;
    USART_InitStructure.USART_BaudRate = 115200;
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    USART_InitStructure.USART_StopBits = USART_StopBits_1;
    USART_InitStructure.USART_Parity = USART_Parity_No ;
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
    USART_Init(UART5, &USART_InitStructure);    
    USART_ITConfig(UART5, USART_IT_RXNE, ENABLE);
      USART_Cmd(UART5, ENABLE);
      USART_ClearFlag(UART5, USART_FLAG_TC);  
}

 void UartNVIC(void)
{    
        NVIC_InitTypeDef NVIC_InitStructure;
    NVIC_InitStructure.NVIC_IRQChannel = UART5_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
}

void UART5_IRQHandler(void)
{
    u8 res;
    if(USART_GetFlagStatus(UART5,USART_FLAG_ORE)==SET)
    {
        USART_ClearFlag(UART5,USART_FLAG_ORE);                         
        res = USART_ReceiveData(UART5);
        if(USART5_Rx_Buffer.index < USART5_Rx_Buffer.maxSize)
        {
            USART5_Rx_Buffer.buffer[USART5_Rx_Buffer.index] = res;
            USART5_Rx_Buffer.index ++;
        }
    }    
    if(USART_GetITStatus(UART5, USART_IT_RXNE) != RESET)  
    {
        res =USART_ReceiveData(UART5);    
        if(USART5_Rx_Buffer.index < USART5_Rx_Buffer.maxSize)
        {
            USART5_Rx_Buffer.buffer[USART5_Rx_Buffer.index] = res;
            USART5_Rx_Buffer.index ++;
        }
    } 
    if(USART_GetITStatus(UART5, USART_FLAG_TC) != RESET)
    {
        return ;
    }
}

void IoInit(void)  
{
    //PORTA
     GPIO_InitTypeDef  GPIO_InitStructure;
     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOE|RCC_APB2Periph_GPIOG|RCC_APB2Periph_GPIOF|
     RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO, ENABLE);     
     GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);    
    
         
     GPIO_InitStructure.GPIO_Pin= GPIO_Pin_12;
     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
     GPIO_Init(GPIOC, &GPIO_InitStructure);
     
     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
     GPIO_Init(GPIOD, &GPIO_InitStructure);
    
}

  • 写回答

7条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2023-09-27 15:35
    关注

    引自免费微信小程序-皆我百晓生,希望对题主有所帮助,如有帮助,还望采纳。


    在你提供的代码中,我发现了一些问题。

    首先,你没有在代码中实现串口数据的发送功能。在你的UartBufferInit()函数中,你只初始化了接收缓冲区,但没有初始化发送缓冲区。你需要添加以下代码来初始化发送缓冲区:

    UartTxBuffer USART5_Tx_Buffer;
    
    void UartBufferInit()
    {      
        USART5_Rx_Buffer.buffer = (u8*)malloc(USART5_RX_BUFFER_SIZE);
        memset(USART5_Rx_Buffer.buffer, 0, USART5_RX_BUFFER_SIZE);
        USART5_Rx_Buffer.index = 0;
        USART5_Rx_Buffer.maxSize = USART5_RX_BUFFER_SIZE; 
    
        USART5_Tx_Buffer.buffer = (u8*)malloc(USART5_TX_BUFFER_SIZE);
        memset(USART5_Tx_Buffer.buffer, 0, USART5_TX_BUFFER_SIZE);
        USART5_Tx_Buffer.index = 0;
        USART5_Tx_Buffer.maxSize = USART5_TX_BUFFER_SIZE; 
    }
    

    然后,你的中断服务程序中有一些错误。当USART5_Rx_Buffer.index等于USART5_Rx_Buffer.maxSize时,你不应该继续接收数据,否则可能会导致缓冲区溢出。你需要添加一个条件来检查缓冲区是否已满,并在缓冲区满时停止接收数据。你可以按照以下代码修改你的中断服务程序:

    void UART5_IRQHandler(void)
    {
        u8 res;
        if(USART_GetFlagStatus(UART5,USART_FLAG_ORE)==SET)
        {
            USART_ClearFlag(UART5,USART_FLAG_ORE);                         
            res = USART_ReceiveData(UART5);
            if(USART5_Rx_Buffer.index < USART5_Rx_Buffer.maxSize)
            {
                USART5_Rx_Buffer.buffer[USART5_Rx_Buffer.index] = res;
                USART5_Rx_Buffer.index ++;
            }
        }    
        if(USART_GetITStatus(UART5, USART_IT_RXNE) != RESET && USART5_Rx_Buffer.index < USART5_Rx_Buffer.maxSize)  
        {
            res = USART_ReceiveData(UART5);    
            USART5_Rx_Buffer.buffer[USART5_Rx_Buffer.index] = res;
            USART5_Rx_Buffer.index ++;
        } 
        if(USART_GetITStatus(UART5, USART_FLAG_TC) != RESET)
        {
            return ;
        }
    }
    

    此外,由于UartNVIC()函数中没有包含NVIC_InitStructure的定义和初始化,你需要在该函数之前添加以下代码:

    NVIC_InitTypeDef NVIC_InitStructure;
    

    最后,你需要在你的main()函数中调用UartInit()IoInit()函数来初始化串口和IO口。

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 10月4日
  • 修改了问题 9月28日
  • 修改了问题 9月28日
  • 修改了问题 9月28日
  • 展开全部

悬赏问题

  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同
  • ¥50 如何openEuler 22.03上安装配置drbd
  • ¥20 ING91680C BLE5.3 芯片怎么实现串口收发数据
  • ¥15 无线连接树莓派,无法执行update,如何解决?(相关搜索:软件下载)
  • ¥15 Windows11, backspace, enter, space键失灵