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); } } |
RE:STM32串口问题,好奇怪的问题!!!
回复:STM32串口问题,好奇怪的问题!!!
没有用过重映射,我用115200和9600都是可以的,是不是与重映射有关呢?
这个配置,我用好多产品上都没有问题,不知道这个怎么回事,难道真和重映射有关系。问题是这样的,我把ARM配置成9600,然后电脑用115200与其通信的时候,就会出现HardFault,电脑用9600正常与其通信是没有问题的,我又试了其它的波特率,19200也没有问题,就到115200就出错了,好奇怪
RE:STM32串口问题,好奇怪的问题!!!
这里,如果下一次进来Uart1_Rxcount=RX_BUFFER1_SIZE_MAX,这个时候操作应该是会超出数组范围。比如RX_BUFFER1_SIZE_MAX=100;你最大只能操作到99,而不能操作100。
另外,你说外部连接了一个485,是否这个485不支持115200呢?
回复:STM32串口问题,好奇怪的问题!!!
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波特率的
RE:STM32串口问题,好奇怪的问题!!!
RE:STM32串口问题,好奇怪的问题!!!
回复:STM32串口问题,好奇怪的问题!!!
这个错误中断很多是因为数组超范围写入引起的。
出差刚回来,回头仔细查下程序,谢了。
回复:STM32串口问题,好奇怪的问题!!!
出现HardFault_Handler多半都是,访问越界。检查下是否有这个情况
出差刚回来,回头仔细查下程序,谢了。