新手上路
- 积分
- 23
- 金钱
- 23
- 注册时间
- 2016-3-21
- 在线时间
- 4 小时
|
1金钱
板子用的是STM32 F103VCT6,使用UCOS III接收串口UART4的数据,但是一旦我在电脑端用串口调试助手发送数据给板子,板子就死机,连一个简单的LED闪烁的任务都不工作了,希望大神能帮我解决下问题,谢谢!感激不尽啊!
贴出初始化代码和串口终端代码
void MODBUS_USART_Init(u32 baud)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
//使能IO时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4, ENABLE);
TriggerModbusInt(ENABLE);
//UART4_TX PC.10
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_Init(GPIOC, &GPIO_InitStructure); //初始化PA9
//UART4_RX PC.11
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;;;//浮空输入
GPIO_Init(GPIOC, &GPIO_InitStructure); //初始化PA10
//配置UART4
USART_InitStructure.USART_BaudRate = baud;//波特率
USART_InitStructure.USART_WordLength = USART_WordLength_8b;//8位数据
USART_InitStructure.USART_StopBits = USART_StopBits_1;//在帧结尾传输1个停止位
USART_InitStructure.USART_Parity = USART_Parity_No;//无校验
USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;//发送和接收都使能
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//硬件流控制失能
USART_Init(MODBUSUSART, &USART_InitStructure);
//使能接收中断中断
USART_ITConfig(MODBUSUSART, USART_IT_RXNE, ENABLE);
//打开USART1
USART_Cmd(MODBUSUSART, ENABLE); //使能串口
//USART_ClearFlag(USART1, USART_FLAG_TC);
USART_GetFlagStatus(MODBUSUSART, USART_FLAG_TC);
BSP_IntVectSet(BSP_INT_ID_USART4, BSP_IntHandlerUART4); //设置串口1的中断向量,必须要有的
BSP_IntEn(BSP_INT_ID_USART4);
}
void TriggerModbusInt(FunctionalState state)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = UART4_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = state;
NVIC_Init(&NVIC_InitStructure);
}
static void BSP_IntHandlerUART4(void)
{
u8 RX_dat;
OSIntEnter();
if (USART_GetITStatus(MODBUSUSART, USART_IT_RXNE) != RESET) //判断发生接收中断
{
//printf("USART Interrupt Successful.");
USART_ClearITPendingBit(MODBUSUSART, USART_IT_RXNE); //清除中断标识
RX_dat = USART_ReceiveData(MODBUSUSART);// & 0x7F; //接收数据,整理除去前两位
SendRcvdMsgToMODBUSRcvTask(RX_dat);
}
OSIntExit();
}
|
最佳答案
查看完整内容[请看2#楼]
BSP_IntHandlerUART4,不符合规矩。你看.s的定义,就知道了,所有正确的中断服务函数名字,都在.s里面定义了名字的了。
|