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

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管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版