OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3250|回复: 8

STM32串口发送数据只能发送一段时间,然后就不发了

[复制链接]

4

主题

21

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2019-5-20
在线时间
7 小时
发表于 2019-7-29 14:07:51 | 显示全部楼层 |阅读模式
3金钱
我问的那个MPU6050的问题可能找到问题所在了,就是当我只开启串口时,串口发送正常(printf函数),一旦开启其他中断,串口就会发一段数据就不发了,好像整个程序都卡住了

最佳答案

查看完整内容[请看2#楼]

找到问题了。USB转TTL电平不对,哎呦
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

21

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2019-5-20
在线时间
7 小时
 楼主| 发表于 2019-7-29 14:07:52 | 显示全部楼层
找到问题了。USB转TTL电平不对,哎呦
回复

使用道具 举报

4

主题

21

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2019-5-20
在线时间
7 小时
 楼主| 发表于 2019-7-29 14:45:44 | 显示全部楼层
DEBUG调试,还是执行了几次就卡在这里
bug.png
回复

使用道具 举报

4

主题

21

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2019-5-20
在线时间
7 小时
 楼主| 发表于 2019-7-29 15:34:38 | 显示全部楼层
又遇到了一个玄学问题,我把j-link拔掉,串口一个字都不发了,j-link插上去,串口才能发。。。这是什么问题
回复

使用道具 举报

0

主题

54

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
272
金钱
272
注册时间
2019-3-6
在线时间
36 小时
发表于 2019-7-29 15:37:20 | 显示全部楼层
把你的串口初始化代码贴上来
回复

使用道具 举报

10

主题

778

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6745
金钱
6745
注册时间
2017-4-12
在线时间
1258 小时
发表于 2019-7-29 16:22:00 | 显示全部楼层
仿真调试,记录日志,找出bug所在
回复

使用道具 举报

4

主题

21

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2019-5-20
在线时间
7 小时
 楼主| 发表于 2019-7-29 16:36:20 | 显示全部楼层
QuiGonJinn 发表于 2019-7-29 15:37
把你的串口初始化代码贴上来

/**
  * @brief  配置嵌套向量中断控制器NVIC
  * @param  无
  * @retval 无
  */
static void NVIC_Configuration(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;
  
  /* 嵌套向量中断控制器组选择 */
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  
  /* 配置USART为中断源 */
  NVIC_InitStructure.NVIC_IRQChannel = DEBUG_USART_IRQ;
  /* 抢断优先级为1 */
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  /* 子优先级为1 */
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  /* 使能中断 */
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  /* 初始化配置NVIC */
  NVIC_Init(&NVIC_InitStructure);
}

/**
  * @brief  USART1 GPIO 配置,工作模式配置。115200 8-N-1
  * @param  无
  * @retval 无
  */
void Debug_USART_Config(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  USART_InitTypeDef USART_InitStructure;
               
  RCC_AHB1PeriphClockCmd( DEBUG_USART_RX_GPIO_CLK|DEBUG_USART_TX_GPIO_CLK, ENABLE);

  /* Enable UART clock */
  RCC_APB2PeriphClockCmd(DEBUG_USART_CLK, ENABLE);
  
  /* Connect PXx to USARTx_Tx*/
  GPIO_PinAFConfig(DEBUG_USART_RX_GPIO_PORT,DEBUG_USART_RX_SOURCE, DEBUG_USART_RX_AF);

  /* Connect PXx to USARTx_Rx*/
  GPIO_PinAFConfig(DEBUG_USART_TX_GPIO_PORT,DEBUG_USART_TX_SOURCE,DEBUG_USART_TX_AF);

  /* Configure USART Tx as alternate function  */
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;

  GPIO_InitStructure.GPIO_Pin = DEBUG_USART_TX_PIN  ;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  GPIO_Init(DEBUG_USART_TX_GPIO_PORT, &GPIO_InitStructure);

  /* Configure USART Rx as alternate function  */
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_Pin = DEBUG_USART_RX_PIN;
  GPIO_Init(DEBUG_USART_RX_GPIO_PORT, &GPIO_InitStructure);
                       
  /* USART1 mode config */
  USART_InitStructure.USART_BaudRate = DEBUG_USART_BAUDRATE;
  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(DEBUG_USART, &USART_InitStructure);
       
       
  USART_Cmd(DEBUG_USART, ENABLE);
       
        USART_ClearFlag(DEBUG_USART, USART_FLAG_TC);                //清串口发送标志
  
}

///重定向c库函数printf到USART1
int fputc(int ch, FILE *f)
{
                /* 发送一个字节数据到USART1 */
                USART_SendData(DEBUG_USART, (uint8_t) ch);
               
                /* 等待发送完毕 */
                while (USART_GetFlagStatus(DEBUG_USART, USART_FLAG_TXE) == RESET){}       
       
                return (ch);
}

///重定向c库函数scanf到USART1
int fgetc(FILE *f)
{
                /* 等待串口1输入数据 */
                while (USART_GetFlagStatus(DEBUG_USART, USART_FLAG_RXNE) == RESET);

                return (int)USART_ReceiveData(DEBUG_USART);
}

这是我发送数据的串口
回复

使用道具 举报

4

主题

21

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2019-5-20
在线时间
7 小时
 楼主| 发表于 2019-7-29 16:37:46 | 显示全部楼层
/**
  * @brief  配置嵌套向量中断控制器NVIC
  * @param  无
  * @retval 无
  */
static void NVIC2_Configuration(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;
  
  /* 嵌套向量中断控制器组选择 */
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  
  /* 配置USART为中断源 */
  NVIC_InitStructure.NVIC_IRQChannel = MPU6050_USART_IRQ;
  /* 抢断优先级为1 */
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  /* 子优先级为1 */
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
  /* 使能中断 */
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  /* 初始化配置NVIC */
  NVIC_Init(&NVIC_InitStructure);
}

/**
  * @brief  配置MPU6050串口中断
  * @param  无
  * @retval 无
  */
void MPU6050_USART_Config(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  USART_InitTypeDef USART_InitStructure;
                          /* 嵌套向量中断控制器NVIC配置 */
        NVIC2_Configuration();
                         
  RCC_AHB1PeriphClockCmd( MPU6050_USART_RX_GPIO_CLK, ENABLE);

  /* Enable UART clock */
  RCC_APB1PeriphClockCmd(MPU6050_USART_CLK, ENABLE);
  
  /* Connect PXx to USARTx_Tx*/
  GPIO_PinAFConfig(MPU6050_USART_RX_GPIO_PORT,MPU6050_USART_RX_SOURCE, MPU6050_USART_RX_AF);

  /* Configure USART Rx as alternate function  */
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_Pin = MPU6050_USART_RX_PIN;
  GPIO_Init(MPU6050_USART_RX_GPIO_PORT, &GPIO_InitStructure);

  /* USART1 mode config */
  USART_InitStructure.USART_BaudRate = MPU6050_USART_BAUDRATE;
  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_Init(MPU6050_USART, &USART_InitStructure);
       

        /* 使能串口接收中断 */
        USART_ITConfig(MPU6050_USART, USART_IT_RXNE, ENABLE);
        USART_ClearITPendingBit(USART2,USART_IT_RXNE);
  USART_Cmd(MPU6050_USART, ENABLE);

}

/*串口中断*/
void MPU6050_USART_IRQHandler(void)
{
//  uint8_t ucTemp;
        if(USART_GetITStatus(MPU6050_USART,USART_IT_RXNE)!=RESET)
        {               
               
//                ucTemp = USART_ReceiveData( DEBUG_USART );
//    USART_SendData(DEBUG_USART,ucTemp);
      Temp[counter] = USART_ReceiveData(MPU6050_USART);   //接收数据
          if(counter == 0 && Temp[0] != 0x55) return;      //第 0 号数据不是帧头,跳过
      counter++;
      if(counter==11) //接收到 11 个数据
      {
         memcpy(Re_buf,Temp,11);
         counter=0; //重新赋值,准备下一帧数据的接收
         sign=1;
      }                
        }         
}
void Data_config()
{
        if(sign)
      {  
         memcpy(Temp,Re_buf,11);
         sign=0;
         if(Re_buf[0]==0x55)       //检查帧头
         {  
            switch(Re_buf[1])
            {
//               case 0x51: //标识这个包是加速度包
//                  a[0] = ((short)(Temp[3]<<8 | Temp[2]))/32768.0*16;      //X轴加速度
//                  a[1] = ((short)(Temp[5]<<8 | Temp[4]))/32768.0*16;      //Y轴加速度
//                  a[2] = ((short)(Temp[7]<<8 | Temp[6]))/32768.0*16;      //Z轴加速度
//                  T    = ((short)(Temp[9]<<8 | Temp[8]))/340.0+36.25;      //温度
//                  break;
//               case 0x52: //标识这个包是角速度包
//                  w[0] = ((short)(Temp[3]<<8| Temp[2]))/32768.0*2000;      //X轴角速度
//                  w[1] = ((short)(Temp[5]<<8| Temp[4]))/32768.0*2000;      //Y轴角速度
//                  w[2] = ((short)(Temp[7]<<8| Temp[6]))/32768.0*2000;      //Z轴角速度
//                  T    = ((short)(Temp[9]<<8| Temp[8]))/340.0+36.25;      //温度
//                  break;
               case 0x53: //标识这个包是角度包
                  angle[0] = ((short)(Temp[3]<<8| Temp[2]))/32768.0*180;   //X轴滚转角(x 轴)
                  angle[1] = ((short)(Temp[5]<<8| Temp[4]))/32768.0*180;   //Y轴俯仰角(y 轴)
                  angle[2] = ((short)(Temp[7]<<8| Temp[6]))/32768.0*180;   //Z轴偏航角(z 轴)
                  T        = ((short)(Temp[9]<<8| Temp[8]))/340.0+36.25;   //温度

//                  printf("X轴角度:%.2f   Y轴角度:%.2f   Z轴角度:%.2f\r\n",angle[0],angle[1],angle[2]);
                  break;
               default:  break;
            }
//                                                NIming_Debug(angle[1],angle[0],angle[2]);
                                        }
                }
//                Delay_ms(50);

}

这是我新买的串口陀螺仪(以前的MPU6050也是串口发送一段就不发送了)
回复

使用道具 举报

4

主题

21

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2019-5-20
在线时间
7 小时
 楼主| 发表于 2019-8-7 11:39:47 | 显示全部楼层
板子有问题,进入硬件错误中断
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-26 04:47

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表