打印
[STM32F1]

关于USART1用DMA接收时的DMA半中断失效了

[复制链接]
2206|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
543049411|  楼主 | 2013-11-25 23:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
关于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
}
沙发
uet_cache| | 2013-11-26 09:57 | 只看该作者
我最近做的MP3项目也是要做通讯,当时都在考虑用DMA传输。不过最终还是放弃了。因为那个数据长度受限,现成的参考例程,一个都没有。

使用特权

评论回复
板凳
543049411|  楼主 | 2013-11-26 10:04 | 只看该作者
uet_cache 发表于 2013-11-26 09:57
我最近做的MP3项目也是要做通讯,当时都在考虑用DMA传输。不过最终还是放弃了。因为那个数据长度受限,现成 ...

你这个做DMA中断,长度就够了吧?我 这个好郁闷,程序就那么简单,我都在keil设了断点,他就是不跑到中断里,郁闷了

使用特权

评论回复
地板
uet_cache| | 2013-11-26 10:06 | 只看该作者
我的长度是可变的,用DMA不方便。

使用特权

评论回复
5
uet_cache| | 2013-11-26 10:08 | 只看该作者
反正程序很灵活的,你只要能正常收发,其它的想办法解决就行了。如果最基本的 中断都不对,那要先参考个好的例程试试。

使用特权

评论回复
6
543049411|  楼主 | 2013-11-26 10:27 | 只看该作者
uet_cache 发表于 2013-11-26 10:08
反正程序很灵活的,你只要能正常收发,其它的想办法解决就行了。如果最基本的 中断都不对,那要先参考个好 ...

我这边有一个是用DMA做串口的发送和接收,但是他的程序里面只有串口发送DMA中断,没有接收的DMA中断,我就给他加一个,也是接收的中断没有进去,被忽略了。

使用特权

评论回复
7
huzi2099| | 2013-11-26 10:32 | 只看该作者
我觉得你应该使用dma的循环模式,你调试一下看看接收的时候dma的CNT有没有变化

使用特权

评论回复
8
543049411|  楼主 | 2013-11-26 13:23 | 只看该作者
huzi2099 发表于 2013-11-26 10:32
我觉得你应该使用dma的循环模式,你调试一下看看接收的时候dma的CNT有没有变化 ...

非常感谢给我提供思路啊,我有设置为串口打印出中断状态的数值,发现半中断的时候,对应的中断状态位被置1了。记得看到别人有说过一个也是中断进不去的的问题,说中断源的时钟没有开启,后面我一查,确实,中断源开的不是我这个对应的DMA通道。真是大头虾,感谢各位!等我真理好这个测试的小程序,我就贴上来。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

26

帖子

0

粉丝