27,375
社区成员
发帖
与我相关
我的任务
分享
void USART1_IRQHandler(void)
{
if(USART1->ISR &= USART_ISR_IDLE)
{
/* Receive Data */ // 这一句是从F4称过来的,不起作用
vu16 a = (uint16_t)(USART1->RDR & (uint16_t)0x01FF);
USART1->ICR |= USART_ICR_IDLECF; // 清除中断
u16 len = BUFSIZE - DMA2_Stream6->NDTR; //获得接收到的字节数
DMA2_Stream6->CR &= ~(1<<0); //关闭DMA传输
while( DMA2_Stream6->CR & 0X1 ); //确保DMA可以被设置
DMA2_Stream6->NDTR = m_nLen; //DMA 存储器0地址
DMA2_Stream6->CR |= 1<<0; //开启DMA传输
}
}
//STM32F103 DMA方式
void USART1_IRQHandler(void)
{
uint16_t ch;
if (USART_GetITStatus(USART1,USART_IT_IDLE) != RESET)
{
USART_ClearITPendingBit(USART1 , USART_IT_IDLE); //必须先清除总线空闲中断标识,然后读一下数据寄存器,DMA接收才会正确(先读SR,然后读DR才能清除空闲中断标识)注意:这句必须要,否则不能够清除中断标志位。
ch = USART_ReceiveData(USART1); //必须先清除总线空闲中断标识,然后读一下数据寄存器,DMA接收才会正确(先读SR,然后读DR才能清除空闲中断标识)注意:这句必须要,否则不能够清除中断标志位。
DMA_Cmd(DMA1_Channel5 , DISABLE); //关闭DMA,防止处理其间有数据
DMA_ClearFlag(DMA1_FLAG_GL5 | DMA1_FLAG_TC5 | DMA1_FLAG_HT5 | DMA1_FLAG_TE5);
ch = USART1_DMA_RX_BUFFER_MAX_LENGTH - DMA_GetCurrDataCounter(DMA1_Channel5);
if (ch > 0)
{
MB_USART1.Outtime_mark = TRUE;
MB_USART1.receCount = ch;
memcpy(MB_USART1.mscomm_buffer , USART1_DMA_RX_Buffer , MB_USART1.receCount);
}
DMA_SetCurrDataCounter(DMA1_Channel5 , USART1_DMA_RX_BUFFER_MAX_LENGTH);
DMA_Cmd(DMA1_Channel5, ENABLE);
}
else if (USART_GetITStatus(USART1,USART_IT_TC)!= RESET)
{
USART_ClearITPendingBit(USART1, USART_IT_TC);
DMA_ClearFlag(DMA1_FLAG_GL4 | DMA1_FLAG_TC4 | DMA1_FLAG_HT4 | DMA1_FLAG_TE4);
DMA_SetCurrDataCounter(DMA1_Channel4 , 0);
}