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

STM32串口问题,好奇怪的问题!!!

[复制链接]
tjluping 提问时间:2013-10-8 08:56 /
1.问题:我串口1配置的9600波特率,当用9600进行数据通信时,没有问题,当我用115200和它进行通信时,马上就进入HardFault_Handler中断程序,波特率低于115200不出现上述情况,我反复试验了好多次,现象每次都重复。
2.出现问题后的各种尝试:
尝试1:怀疑波特率太高,中断太频繁,在进入串口中断函数后,清中断标识,关闭串口接收中断,出中断程序时再打开,问题依旧
尝试2:改变串口中断优先级,问题依旧
尝试3:提高系统主频,当前是32M,提高到64M,问题依旧
尝试4:将串口发送也改成中断模式,问题依旧
 
3.硬件配置:主芯片STM32F103C8T6 ,串口1重映射PB6,PB7,外接485进行通信
4.软件配置:
//串口初始化
void Usart1_init(void)
{
 
  NVIC_InitTypeDef NVIC_InitStructure;
  GPIO_InitTypeDef GPIO_InitStructure;
  USART_InitTypeDef USART_InitStructure;
 
  /* Enable GPIOx clock */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
 
   /* Enable USART1 clock */
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
 
  NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
 
  /* Enable the USART1 Pins Software Remapping */
  GPIO_PinRemapConfig(GPIO_Remap_USART1, ENABLE); 
  /* Configure USART1 Rx as input floating */   //usart1
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
  
  /* Configure USARTy Tx as alternate function push-pull */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_Init(GPIOB, &GPIO_InitStructure); 
 
  /*Configure USART1 RS485 enable pin PB8*/
  GPIO_InitStructure.GPIO_Pin = USART1_RS485_CTR_PIN;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(USART1_RS485_CTR_PORT, &GPIO_InitStructure);
 
  USART_InitStructure.USART_BaudRate = 9600
  USART_InitStructure.USART_StopBits = USART_StopBits_1;
  USART_InitStructure.USART_Parity = USART_Parity_No;//无效验
  USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  /* Configure USARTy */
  USART_Init(USART1, &USART_InitStructure);  
  /* Enable USARTy Receive and Transmit interrupts */
  USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);

  USART_Cmd(USART1, ENABLE);
}
 
 
//中断处理函数
void USART1_IRQHandler(void)
{
   if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
  {
   
        USART_ClearITPendingBit(USART1, USART_IT_RXNE);
  
      if(Uart1_Rxcount > RX_BUFFER1_SIZE_MAX)
      {
         Uart1_Rxcount = 0;
        Uart1_Flag = INSTRUCTION_TOO_LONG;
     }
 
       RX_Buffer1[Uart1_Rxcount++] = (u8)USART_ReceiveData(USART1);
    }

 
 
   if(USART_GetITStatus(USART1, USART_IT_TC) != RESET)
   {  
        USART_ClearITPendingBit(USART1, USART_IT_TC);
   }  
}
收藏 评论8 发布时间:2013-10-8 08:56

举报

8个回答
feiante-155820 回答时间:2013-10-8 09:18:11

RE:STM32串口问题,好奇怪的问题!!!

没有用过重映射,我用115200和9600都是可以的,是不是与重映射有关呢?
tjluping 回答时间:2013-10-8 09:25:36

回复:STM32串口问题,好奇怪的问题!!!

回复第 2 楼 于2013-10-08 09:18:11发表:
没有用过重映射,我用115200和9600都是可以的,是不是与重映射有关呢? 

这个配置,我用好多产品上都没有问题,不知道这个怎么回事,难道真和重映射有关系。问题是这样的,我把ARM配置成9600,然后电脑用115200与其通信的时候,就会出现HardFault,电脑用9600正常与其通信是没有问题的,我又试了其它的波特率,19200也没有问题,就到115200就出错了,好奇怪
回答时间:2013-10-8 14:16:38

RE:STM32串口问题,好奇怪的问题!!!

Uart1_Rxcount > RX_BUFFER1_SIZE_MAX,
这里,如果下一次进来Uart1_Rxcount=RX_BUFFER1_SIZE_MAX,这个时候操作应该是会超出数组范围。比如RX_BUFFER1_SIZE_MAX=100;你最大只能操作到99,而不能操作100。
另外,你说外部连接了一个485,是否这个485不支持115200呢?
tjluping 回答时间:2013-10-8 17:15:25

回复:STM32串口问题,好奇怪的问题!!!

回复第 4 楼 于2013-10-08 14:16:38发表:
Uart1_Rxcount > RX_BUFFER1_SIZE_MAX,
这里,如果下一次进来Uart1_Rxcount=RX_BUFFER1_SIZE_MAX,这个时候操作应该是会超出数组范围。比如RX_BUFFER1_SIZE_MAX=100;你最大只能操作到99,而不能操作100。
另外,你说外部连接了一个485,是否这个485不支持115200呢? 

RX_BUFFER1_SIZE_MAX这个我设置的500,不过应该不会超过这个最大值,我有个接收数据处理函数,当接收到一包数据的话,我就会清零Uart1_Rxcount,收到一包数据的判别,我是靠字节之间的间隔来判断,当两个字节之间的间隔大于3个字节长度(MODBUS_RTU协议规定)时,认为接收到一包数据,我用电脑访问的时间间隔是1秒一个,所以肯定会清零Uart1_Rxcount。晚上我再把RX_BUFFER1_SIZE_MAX改大点试一下,确认下。
至于那个485芯片,应该没问题,其它产品也在用,也有115200波特率的
回答时间:2013-10-8 21:10:39

RE:STM32串口问题,好奇怪的问题!!!

出现HardFault_Handler多半都是,访问越界。检查下是否有这个情况
回答时间:2013-10-9 17:31:15

RE:STM32串口问题,好奇怪的问题!!!

这个错误中断很多是因为数组超范围写入引起的。
tjluping 回答时间:2013-10-14 13:32:09

回复:STM32串口问题,好奇怪的问题!!!

回复第 7 楼 于2013-10-09 17:31:15发表:
这个错误中断很多是因为数组超范围写入引起的。 

出差刚回来,回头仔细查下程序,谢了。
tjluping 回答时间:2013-10-14 13:32:33

回复:STM32串口问题,好奇怪的问题!!!

回复第 6 楼 于2013-10-08 21:10:39发表:
出现HardFault_Handler多半都是,访问越界。检查下是否有这个情况 

出差刚回来,回头仔细查下程序,谢了。
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版