关于USART1用DMA接收时的DMA半中断失效了,这个问题我写了两个小程序做实验,都是这样子,我接收的数据都超过一半了,还是无法跳到半中断,完全失效了,求大神解惑。下面是我的主函数和中断函数。我用串口就个1,单片机这边也会依次给我回剩余的数据的数字,但是当这个数字小于我定义的一半时,中断没有反应,我也有给中断设过断点,keil也一直在跑。
感谢各位大神!!
int main(void)
{
uint16_t rem;
uint16_t k=20;
/* USART1 config 115200 8-N-1 */
USART1_Config();
DMA_Config();
while(1)
{
// USART1_printf( USART1, "\r\n this is a demo \r\n" );
rem=DMA_GetCurrDataCounter(DMA1_Channel5);
if(rem!=k)
{
USART1_printf( USART1, "\r\n %d \r\n", rem );
k=rem;
}
}
}
void DMA1_Channel5_IRQHandler(void)
{
// if ( DMA_GetITStatus(DMA1_IT_HT5) )
// {
DMA_ClearITPendingBit(DMA1_IT_HT5);
USART1_printf(USART1,"\r\nDMA是否会等串口.\r\n");
// }
}
void DMA_Config(void)
{
DMA_InitTypeDef DMA_InitStructure;
DMA_DeInit(DMA1_Channel5);
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); //开启DMA时钟
NVIC_Config(); //配置DMA中断
DMA_InitStructure.DMA_PeripheralBaseAddr = USART1_DR_Base; /*设置DMA源:内存地址&串口数据寄存器地址*/
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)RecBuff; /*内存地址(要传输的变量的指针)*/
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; /*方向:从内存到外设*/
DMA_InitStructure.DMA_BufferSize = SENDBUFF_SIZE; /*传输大小DMA_BufferSize=SENDBUFF_SIZE*/
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; /*外设地址不增*/
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; /*内存地址自增*/
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; /*外设数据单位*/
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; /*内存数据单位 8bit*/
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal ; /*DMA模式:一次传输,循环*/
DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh; /*优先级:最高*/
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; /*禁止内存到内存的传输 */
DMA_Init(DMA1_Channel5, &DMA_InitStructure); /*配置DMA1的5通道*/
USART_DMACmd(USART1, USART_DMAReq_Rx, ENABLE); /*串口向 DMA发出请求 */
DMA_ITConfig(DMA1_Channel5,DMA_IT_HT,ENABLE); //配置DMA发送完ban后产生中断
DMA_Cmd (DMA1_Channel5,ENABLE); //使能DMA
}
|