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