你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F103 USART1配置后无法接收数据

[复制链接]
触不可及0.0 提问时间:2021-9-5 22:55 /
UART我按照书上的范例配置的,现在的测试情况是:发送数据正常,但是不能接收数据,仿真发现接收中断完全没有被触发,我有试过把TX口和RX口直接短接,这样还是不能触发接收中断。
我也不想当伸手党,但是这个问题我查了好久,实在不知道问题出在那里。UART初始化及中断函数如图所示,望大佬指点一下。



初始化函数.png
中断服务函数1.png
收藏 评论7 发布时间:2021-9-5 22:55

举报

7个回答
触不可及0.0 回答时间:2021-9-5 22:56:42
  1. //*****************************************************************************
  2. void  Usart_Init(u32 bound)
  3. {
  4.         USART_InitTypeDef  USART_InitStruct;                        //定义USART初始化结构体
  5.         GPIO_InitTypeDef   GPIO_InitStruct;                                //定义GPIO初始化结构体
  6.         NVIC_InitTypeDef   NVIC_InitStruct;                                //定义NVIC(中断管理)初始化结构体
  7.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA,ENABLE);        //使能外设时钟
  8.         //*************************************************************************       
  9.         USART_DeInit(USART1);                                                                                        //复位USART1       
  10.         //*************************************************************************       
  11.         GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;                                        //端口配置为推挽输出
  12.         GPIO_InitStruct.GPIO_Speed= GPIO_Speed_50MHz;                                        //IO口时钟为50MHZ
  13.         GPIO_InitStruct.GPIO_Pin  = GPIO_Pin_9;
  14.         GPIO_Init(GPIOA,&GPIO_InitStruct);                                                                //初始化USART_TX端口
  15.                        
  16.         GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;                                //端口配置为浮空输入
  17.         GPIO_InitStruct.GPIO_Pin  = GPIO_Pin_10;
  18.         GPIO_Init(GPIOA,&GPIO_InitStruct);                                                                //初始化USART_RX端口       
  19.         //*************************************************************************
  20.         USART_InitStruct.USART_BaudRate = bound;                                                //设置波特率
  21.         USART_InitStruct.USART_WordLength = USART_WordLength_8b;                //USART数据位8bit
  22.         USART_InitStruct.USART_StopBits = USART_StopBits_1;                                //一个停止位
  23.         USART_InitStruct.USART_Parity = USART_Parity_No;                                //无校验位
  24.         USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;        //无硬件流
  25.         USART_InitStruct.USART_Mode =  USART_Mode_Rx | USART_Mode_Tx;        //使能发送和接收
  26.         USART_Init(USART1, &USART_InitStruct);                                                        //初始化UART1
  27.         //*************************************************************************       
  28.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);                                        //NVIC中断分组为1:2级抢占优先级,8级响应优先级
  29.         NVIC_InitStruct.NVIC_IRQChannel = USART1_IRQn;                                        //设置中断通道为USART1
  30.         NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;                        //抢占优先级为1
  31.         NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;                                        //响应优先级为1
  32.         NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;                                        //使能中断
  33.         NVIC_Init(&NVIC_InitStruct);                                                                        //初始化USART1中断
  34.         //*************************************************************************               
  35.         USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);                                        //使能USART1接收中断
  36. //        USART_ITConfig(USART1,USART_IT_TXE,DISABLE);                                        //除能发送中断
  37.         USART_Cmd(USART1, ENABLE);                                                                                //使能USART1
  38.         //*************************************************************************                       
  39. }
  40. //*****************************************************************************
复制代码


触不可及0.0 回答时间:2021-9-5 22:57:30

  1. //*****************************************************************************
  2. void  USART1_IRQHandler(void)
  3. {
  4.         u8  ReadUsart1Data = 0;       
  5.         u8  ReadUsartStatus = 0;       
  6.         if(USART_GetITStatus(USART1,USART_IT_PE) != RESET){ReadUsartStatus = 1;}                //奇偶错误中断
  7.         if(USART_GetITStatus(USART1,USART_IT_TXE) != RESET){ReadUsartStatus = 2;}                //发送中断
  8.         if(USART_GetITStatus(USART1,USART_IT_TC) != RESET){ReadUsartStatus = 3;}                //发送完成中断
  9.         if(USART_GetITStatus(USART1,USART_IT_RXNE) != RESET){ReadUsartStatus = 4;}                //接收中断
  10.         if(USART_GetITStatus(USART1,USART_IT_IDLE) != RESET){ReadUsartStatus = 5;}                //空闲总线中断
  11.         if(USART_GetITStatus(USART1,USART_IT_LBD) != RESET){ReadUsartStatus = 6;}                //LIN中断探测中断
  12.         if(USART_GetITStatus(USART1,USART_IT_CTS) != RESET){ReadUsartStatus = 7;}                //CTS中断
  13.         if(USART_GetITStatus(USART1,USART_IT_ORE) != RESET){ReadUsartStatus = 8;}                //溢出错误中断               
  14.         if(USART_GetITStatus(USART1,USART_IT_NE) != RESET){ReadUsartStatus = 9;}                //噪音错误中断
  15.         if(USART_GetITStatus(USART1,USART_IT_FE) != RESET){ReadUsartStatus = 10;}                //幁中断               
  16.         //**************************************************************************************       
  17.         if(USART_GetITStatus(USART1,USART_IT_TC) != RESET)                //UART1发送中断
  18.         {
  19.                 if(Usart1Sndingflag)
  20.                 {
  21.                         Usart1SndingTime = 0;
  22.                         if(Usart1Status.Usart1SndBUF[++Usart1SndNUM] != '\0')
  23.                         {
  24.                                 USART_SendData(USART1,Usart1Status.Usart1SndBUF[Usart1SndNUM]);
  25.                         }
  26.                         else
  27.                         {
  28.                                 Usart1Sndingflag = 0;
  29.                                 USART_ITConfig(USART1,USART_IT_TC,DISABLE);        //发送完成后除能UART发送中断
  30.                         }
  31.                 }       
  32.                 else
  33.                 {
  34.                         USART_ITConfig(USART1,USART_IT_TC,DISABLE);        //发送完成后除能UART发送中断
  35.                 }
  36.                 USART_ClearITPendingBit(USART1,USART_IT_TC);
  37.                 USART_ClearFlag(USART1,USART_IT_TC);
  38.         }
  39.         //**************************************************************************************
  40.         if(USART_GetITStatus(USART1,USART_IT_RXNE) != RESET)        //UART1接收中断
  41.         {
  42.                 ReadUsart1Data = USART_ReceiveData(USART1);                        //读取接收数据       
  43.                
  44.                 USART_ClearFlag(USART1,USART_IT_RXNE);                                        //清理接收中断标志
  45.                 USART_ClearITPendingBit(USART1,USART_IT_RXNE);                        //清理接收中断标志
  46.         }
  47.         if(USART_GetFlagStatus(USART1,USART_FLAG_ORE) == SET)                 // 检查 ORE 标志
  48.         {
  49.                 ReadUsart1Data = USART_ReceiveData(USART1);
  50.         }
  51.         //**************************************************************************************
  52. }
  53. //*****************************************************************************


复制代码


myxiexing 回答时间:2021-9-6 00:13:48
你这个RX的IO,实际是配上拉了吧?配浮空试下,好像是有影响的。
触不可及0.0 回答时间:2021-9-6 08:43:29
myxiexing 发表于 2021-9-6 00:13
你这个RX的IO,实际是配上拉了吧?配浮空试下,好像是有影响的。

RX端口配置为上拉或者浮空输入我都测试过,都没法接收数据。
废鱼 回答时间:2021-9-6 08:57:33

                        GPIO_PinRemapConfig(GPIO_Remap_USART1, ENABLE);
楼主,你加上这句话试试。

触不可及0.0 回答时间:2021-9-6 17:08:31
飞羽一条 发表于 2021-9-6 08:57
GPIO_PinRemapConfig(GPIO_Remap_USART1, ENABLE);
楼主,你加上这句话试试。

我晚上测试下
xmshao 回答时间:2021-9-7 15:40:42
辛苦了!我看你晒出来的代码开启的中断挺多的,其实不用开那么多。看你代码是基于标准库组织的,如果可能,尽量通过CUBEMX进行配置,这对于新手来说非常有利。建议重点检查下管脚有无复用、有无remap,注意开启相关时钟包括AFIO的时钟。
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版