|
利用UART1 的空闲中断接收不定长数据包 目前遇到的问题:DMA 能接收到串口的数据,但是无法进入串口的空闲中断。
void Dma_uart_Txinit(void)
{
DMA_InitTypeDef DMA_InitStructure;
DMA_Cmd(UART1_Txchannel, DISABLE); // 关DMA通道
DMA_DeInit(UART1_Txchannel); // 恢复缺省值
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)(&UART1->TDR);// 设置串口发送数据寄存器
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)U1_Txbuf; // 设置发送缓冲区首地址
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; // 设置外设位目标,内存缓冲区 -> 外设寄存器
DMA_InitStructure.DMA_BufferSize = USART1_TX_BSIZE; // 需要发送的字节数,这里其实可以设置为0,因为在实际要发送的时候,会重新设置次值
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; // 外设地址不做增加调整,调整不调整是DMA自动实现的
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; // 内存缓冲区地址增加调整
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; // 外设数据宽度8位,1个字节
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; // 内存数据宽度8位,1个字节
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; // 单次传输模式
DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh; // 优先级设置
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; // 关闭内存到内存的DMA模式
DMA_Init(UART1_Txchannel, &DMA_InitStructure); // 写入配置
DMA_ClearFlag(UART1_Tx_DMA_FLAG); // 清除DMA所有标志
DMA_Cmd(UART1_Txchannel, DISABLE); // 关闭DMA
// DMA_ITConfig(UART1_Txchannel, DMA_IT_TC, ENABLE); // 开启发送DMA通道中断
}
void Dma_uart_Rxinit(void)
{
DMA_InitTypeDef DMA_InitStructure;
DMA_Cmd(UART1_Rx_DMA_Channel, DISABLE); // 关DMA通道
DMA_DeInit(UART1_Rx_DMA_Channel); // 恢复缺省值
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)(&UART1->RDR);// 设置串口接收数据寄存器
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)U1_Rxbuf; // 设置接收缓冲区首地址
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; // 设置外设为数据源,外设寄存器 -> 内存缓冲区
DMA_InitStructure.DMA_BufferSize = USART1_RX_BSIZE; // 需要最大可能接收到的字节数
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; // 外设地址不做增加调整,调整不调整是DMA自动实现的
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; // 内存缓冲区地址增加调整
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; // 外设数据宽度8位,1个字节
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; // 内存数据宽度8位,1个字节
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; // 单次传输模式
DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh; // 优先级设置
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; // 关闭内存到内存的DMA模式
DMA_Init(UART1_Rx_DMA_Channel, &DMA_InitStructure); // 写入配置
DMA_ClearFlag(UART1_Rx_DMA_FLAG); // 清除DMA所有标志
DMA_Cmd(UART1_Rx_DMA_Channel, ENABLE); // 开启接收DMA通道,等待接收数据
// DMA_ITConfig(UART1_Rx_DMA_Channel, DMA_IT_TC, ENABLE); // 开启接收DMA通道中断
}
void Dma_uart_init(void)
{
/* DMA clock enable */
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE); // 开启DMA1时钟
Dma_uart_Txinit();
Dma_uart_Rxinit();
UART_DMACmd(UART1, UART_DMAReq_EN, ENABLE); // 开启串口DMA
}
void UartInit(UART_TypeDef* UARTx,int BaudRate)
{
UART_InitTypeDef UART_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //uart1_tx pa9
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // 推免复用输出
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //uart1_rx pa10
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉输入
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOA, GPIO_Pin_9 | GPIO_Pin_10, GPIO_AF_UART_1); //PA9、PA10复用为串口1
RCC_APB2PeriphClockCmd(RCC_APB2Periph_UART1, ENABLE);
UART_InitStructure.UART_BaudRate = BaudRate; //波特率
UART_InitStructure.UART_WordLength = UART_WordLength_8b;//数据位
UART_InitStructure.UART_StopBits = UART_StopBits_1;//停止位
UART_InitStructure.UART_Parity = UART_Parity_No ;
UART_InitStructure.UART_Mode = UART_Mode_Rx | UART_Mode_Tx;//输入输出模式
UART_InitStructure.UART_HardwareFlowControl = UART_HardwareFlowControl_None;
UART_Init(UARTx, &UART_InitStructure);
// UART_ITConfig(UARTx, UART_IT_RXIEN, ENABLE);//使能接收中断
// UART_ITConfig(UARTx, UART_IT_TXIEN, ENABLE);//使能接收中断
Dma_uart_init();
UARTx->IER = 1<<6; //串口中断
UARTx->IER |= 1<<1; //帧中断,= 空闲中断?
UART1->ICR|= 0XFF; // 清标志为
UART_Cmd(UARTx, ENABLE); //UART 模块使能
NVIC_SetPriority(UART1_IRQn,2);
NVIC_EnableIRQ(UART1_IRQn);
// NVIC_SetPriority(DMA2_Channel3_IRQn,3);
// NVIC_EnableIRQ(DMA2_Channel3_IRQn);
NVIC_SetPriority(DMA2_Channel8_IRQn,3);
NVIC_EnableIRQ(DMA2_Channel8_IRQn);
// Dma_uart_init();
}
//
void UART1_IRQHandler(void)
{
if(UART1->ISR & (1<<1))
{ rxnum++;
// UART1->RDR = Uart1_Receive();
UART1->ICR |= 1<<1;
// printf("UART1_RDR = %d\n",UART1->RDR);
}
// UART1->ICR = 0XFF;
if(UART1->ISR & (1<<6))
{
rxnum--;
Uart1_DMA_Rx_Data();
// Dma_uart_Rxinit();
UART1->ICR=0XFF;
}
// LCD_BL(txmod);
// txmod^=1;
}
|
阿莫论坛20周年了!感谢大家的支持与爱护!!
阿莫论坛才是最爱国的,关心国家的经济、社会的发展、担心国家被别国牵连卷入战争、知道珍惜来之不易的和平发展,知道师夷之长,关注世界的先进文化与技术,也探讨中国文化的博大精深,也懂得警惕民粹主义的祸国殃民等等等等,无不是爱国忧民的表现。(坛友:tianxian)
|