鸣蜩伍 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 (标签-matlab)
  • ¥200 基于同花顺supermind的量化策略脚本编辑
  • ¥20 Html备忘录页面制作
  • ¥15 黄永刚的晶体塑性子程序中输入的材料参数里的晶体取向参数是什么形式的?
  • ¥20 数学建模来解决我这个问题
  • ¥15 计算机网络ip分片偏移量计算头部是-20还是-40呀
  • ¥15 stc15f2k60s2单片机关于流水灯,时钟,定时器,矩阵键盘等方面的综合问题
  • ¥15 YOLOv8已有一个初步的检测模型,想利用这个模型对新的图片进行自动标注,生成labellmg可以识别的数据,再手动修改。如何操作?
  • ¥30 NIRfast软件使用指导
  • ¥20 matlab仿真问题,求功率谱密度