static void UART_DMA_Interrupt( void *Param )
{
OS_ERR err;
unsigned int cr;
struct UART_DEVICE *uart = (struct UART_DEVICE *)Param;
unsigned int sr = uart->uart->SR;
uart->uart->SR = 0;
cr = uart->uart->CR1;
if ( (cr & 0x10) && (sr & 0x10) ){
//IDEL ¼à²âµ½×ÜÏß¿ÕÏÐ
uart->RecvDMA.DMA->CR = 0;
uart->current_buffer->Recv_Size = sizeof(uart->current_buffer->buffer) - uart->RecvDMA.DMA->NDTR;
uart->RecvDMA.DMA->NDTR = 0;
OSQPost( &uart->Recv_Queue, (void *)uart->current_buffer, 1,OS_OPT_POST_NO_SCHED | OS_OPT_POST_ALL | OS_OPT_POST_FIFO, &err );
uart->uart->CR1 |= (0x20);
uart->uart->CR1 &= (~0x10);
}
if ( (cr & 0x20) && (sr & 0x20) ){
//RXNE ¶ÁÊý¾Ý¼Ä´æÆ÷·Ç¿Õ
uart->uart->CR1 |= (0x10);
if ( uart->current_buffer == NULL ){
uart->current_buffer = &uart->Recv[0];
}else if ( uart->current_buffer == &uart->Recv[0] ){
uart->current_buffer = &uart->Recv[1];
}else if ( uart->current_buffer == &uart->Recv[1] ){
uart->current_buffer = &uart->Recv[2];
}else if ( uart->current_buffer == &uart->Recv[2] ){
uart->current_buffer = &uart->Recv[3];
}else{
uart->current_buffer = &uart->Recv[0];
}
USART_DMA_Recv( uart->RecvDMA.DMA, (void *)&uart->uart->DR, uart->current_buffer, sizeof(uart->current_buffer->buffer) );
uart->uart->CR1 &= (~0x20);
}
cr = uart->uart->CR1;
}
|