原子哥,在中断函数中,我用串口助手发送数据,但我试了直接操作寄存器和用库都不能执行if(RX_status == SET)
后面的语句也就是说接收标志没有置位,不知道什么原因,难道初始化有问题,我去先收一下你的usart程序试试看能行不 ,你有创建qq群吗,想加个
谢谢!
/* USART1初始化 */
//USART_InitTypeDef USART_InitStructure;
USART_DeInit(USART1);
USART_InitStructure.USART_BaudRate = 9600;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USART1,&USART_InitStructure);
USART_ClearFlag(USART1, USART_FLAG_RXNE); //清中断,以免一启用中断后立即产生中断
//USART_ClearFlag(USART1, USART_FLAG_TC);
//USART1->CR1 &= 0xFFBF; //关闭TC中断
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
USART_DMACmd(USART1,USART_DMAReq_Tx,ENABLE); //使能发送DMA
USART_Cmd(USART1,ENABLE);
void USART1_IRQHandler(void) //中断法接受中断发送用dma
{
//OS_CPU_SR cpu_sr;
//OS_ENTER_CRITICAL();
//OSIntNesting++;
//OS_EXIT_CRITICAL();
FlagStatus RX_status;
RX_status = USART_GetFlagStatus(USART1, USART_FLAG_RXNE); //接收到数据
GPIO_SetBits(GPIOB,GPIO_Pin_2);
if(RX_status == SET)
//if((USART1->SR&0x0020)!=0) //RXNE中断 if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
{
USART_ClearFlag(USART1,USART_FLAG_RXNE);
// TIM_Cmd(TIM7, ENABLE);
//CTL485_H; //1:MCU接收数据
GPIO_SetBits(GPIOA, GPIO_Pin_11); //485准备接受
//COM_FLAG_H;
GPIO_SetBits(GPIOB, GPIO_Pin_2);
RxBuffer[RxCounter] = (uint8_t)(USART1->DR & 0x01FF); //接收数据
if(RxStart==RESET) //刚开始接收
{
if(RxBuffer[RxCounter]==MODBUS_ADDRESS) //板地址正确
{
TIM_Cmd(TIM7, ENABLE); //定时开始
RxCounter++;
RxStart=SET; //表示接收已经开始
//Rxtimeout=0; //清零超时计数器
}
else //板地址不正确
{
RxCounter = 0;
RxStart=RESET;
}
}
else
{
RxCounter++;
RxStart=SET; //表示接收已经开始
//Rxtimeout=0; //清零超时计数器
}
//清中断标志
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
{
USART_ClearITPendingBit(USART1, USART_IT_RXNE);
}
}
if((USART1->SR&0x0040)!=0) //TC中断 (USART1->SR&0x0040)!=0 USART_GetITStatus(USART1, USART_IT_TXE) != RESET
{
USART1->CR1 &= 0xFFBF; //关闭TC中断
USART1->SR &= 0xFFBF; //清TC中断标志
GPIO_SetBits(GPIOA, GPIO_Pin_11); //485准备接受
//CTL485_H; //1:MCU接收数据
// COM_FLAG_H;
GPIO_SetBits(GPIOB, GPIO_Pin_2);
}
USART_GetFlagStatus(USART1, USART_FLAG_ORE); //清ORE标志
USART_ReceiveData(USART1); //清ORE标志
//OSIntExit();
}
|