OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4969|回复: 5

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

[复制链接]

2

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2013-11-19
在线时间
3 小时
发表于 2013-11-25 16:59:19 | 显示全部楼层 |阅读模式

关于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
}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-11-25 19:53:44 | 显示全部楼层
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2013-11-19
在线时间
3 小时
 楼主| 发表于 2013-11-25 21:03:27 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
正点大哥,我之前就是看到这个例子,我看到这个例子里的DMA是发送完中断,接收的DMA没有中断,所以我就自己在这个前提下加DMA接收中断,但是发现程序里,DMA的发送完中断有被调用,但是接收的DMA中断就好像完全没用。所以我就奇怪是不是DMA在做USART接收中断是不是不可以用。
求您指点一下。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-11-26 11:48:30 | 显示全部楼层
回复【3楼】543049411:
---------------------------------
我也没搞过接收DMA...
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2013-11-19
在线时间
3 小时
 楼主| 发表于 2013-11-26 13:20:04 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
感谢原子大哥,我自己再找了一下网上别人的问题,终于找到问题了,原来是我的中断源时钟,忘记改过来了,因为是在人的程序的基础上改一下继续做试验,我真是大头虾啊。
谢谢!
等我整理好了这个试验的小程序,我也放上来分享给大家。
回复 支持 反对

使用道具 举报

1

主题

17

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2013-11-26
在线时间
0 小时
发表于 2013-11-26 14:39:45 | 显示全部楼层
回复【5楼】543049411:
---------------------------------
你好,我也是接收dma中断遇到问题了,我的问题是只能进一次中断,之后就再也没进去过,能帮我看下什么原因吗?你说的中断源时钟是指的什么呢?谢谢!我的问题在http://www.openedv.com/posts/list/24581.htm
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-8 17:51

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表