7515|9

8

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

DMA问题的迷惑 [复制链接]

个位达人,我使用USART2的TX做DMA进行数据的输出,波特率为115200,直接发送给PC机,每次发送结束后,进入DMA7的中断,关闭DMA通道。 在PC机发来数据后,又进入USART2的RX中断,在中断里重新再设置DMA的收发地址和字节数,再次发送。
通讯上了,可奇怪的是每次都还没有把设定的字节数读完,就进入了DMA7的中断(我设置的是发完再中断),总会少两个字节。
在DMA7的中断里加上while(!USART2.SR.B.TC);后就OK了,这是否可以说明,在尚未全部发完的情况下,就已经进入了DMA7的中断?
有遇见过相同的问题吗?
此帖出自stm32/stm8论坛

最新回复

寄存器操作看的晕晕乎乎的,也不大会寄存器..要不.你把设置接受的字符量+2...那不就正好了?  详情 回复 发表于 2011-4-14 21:47
点赞 关注
 

回复
举报

8

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
咋没人回答呢? 问题太幼稚了?
此帖出自stm32/stm8论坛
 
 

回复

1059

帖子

0

TA的资源

纯净的硅(高级)

板凳
 
不能.应该不会那样吧.你的NVIC怎么写的?还有是串口2接收完毕中断还是接收中断?那是不同的
最好把整个程序发上来.我也想看看:-)
此帖出自stm32/stm8论坛
 
 

回复

8

帖子

0

TA的资源

一粒金砂(初级)

4
 
终于有人睬我了,感动啊,我这就贴程序
void Initialize_NVIC (void)
{
  NVIC.IPR6.W = 0x00000000;

  SCB.VTOR.W = (unsigned long)0x8000000;                 //  set the vectortable in the FLASH
  SCB.AIRCR.W = (unsigned long)0x05FA0400;               //  ((u32)0x700)  0 bits for pre-emption priority , 4 bits for subpriority
                                                                                                             //  ((u32)0x600)  1 bits for pre-emption priority , 3 bits for subpriority
                                                                                                                 //  ((u32)0x500)  2 bits for pre-emption priority , 2 bits for subpriority
                                                                                                                 //  ((u32)0x400)  3 bits for pre-emption priority , 1 bits for subpriority
                                                                                                                 //  ((u32)0x300)  4 bits for pre-emption priority , 0 bits for subpriority
  NVIC.IPR11.B.EXTI15_10 |= 0x80;                        //  set EXTI15_10 is the fifth interrupts           Z相                                                                                                                 
  NVIC.IPR10.W |= (unsigned long)0x400000;               //  set USART2 is the thired interrupt

  NVIC.IPR8.W |= (unsigned long)0x600000;                                 //  set TIM4 is the fourth interrupt   PWM波
                                                                                                                 
  NVIC.IPR5.W |= (unsigned long)0x2000;                                          //  set DMA1_CHANNEL7 is the second interrupt

  SCB.SHPR3.W |= (unsigned long)0x00;                                     //  set SYSTICK is the first interrupt

  NVIC.ISER1.W |= (unsigned long)0x48020000;                     //  enable the TIM1CC & TIM4 & DMA1_CH7 interrupt

  NVIC.ISER2.W |= (unsigned long)0x100;                  //  enable the EXTI15_10 interrupt

  NVIC.ISER2.W |= (unsigned long)0x40;                   //  enable the USART2 interrupt
}
此帖出自stm32/stm8论坛
 
 
 

回复

8

帖子

0

TA的资源

一粒金砂(初级)

5
 
void Initialize_DMA1 (void)
{
  DMA1_CH7.CCR.B.EN = 0;                      //  通道禁用

  DMA1.IFCR.W = (unsigned long)0xffffffff;    //  清除所有的标志位

  DMA1_CH7.CPAR = (unsigned long)0x40004404;  //  要传送的目标地址,即USART2的DR的地址
  DMA1_CH7.CMAR        = (unsigned long)(&SCI_Send); //  要传送的数据的源地址

  DMA1_CH7.CCR.B.DIR = 1;                     //  从存储器读
  DMA1_CH7.CNDTR = 28;                        //  每次连续传送的量为25个字节(设置28是因为发现如果设置23会少收数据,因为总是在DMA没有收完就进入了DMA中断)
  DMA1_CH7.CCR.B.PINC = 0;                    //  禁止外设地址增量式模式
  DMA1_CH7.CCR.B.MINC = 1;                    //  使能存储器地址增量模式
  DMA1_CH7.CCR.B.PSIZE = 0;                   //  外设的大小为8位的
  DMA1_CH7.CCR.B.MSIZE = 0;                   //  存储数据的大小为8位的
  DMA1_CH7.CCR.B.CIRC = 0;                    //  禁用循环模式
  DMA1_CH7.CCR.B.PL = 3;                      //  设置该通道为最高优先级(其实这里也只用了这一个)
  DMA1_CH7.CCR.B.MEM2MEM = 0;                                  //  禁止存储器到存储器模式
  
  DMA1_CH7.CCR.B.TEIE = 0;                    //  禁止传输错误中断
  DMA1_CH7.CCR.B.HTIE = 0;                    //  禁止传输到半中断
  DMA1_CH7.CCR.B.TCIE = 1;                    //  使能传输完成中断  
}


void DMAChannel7_IRQHandler(void)
{
  DMA1_CH7.CCR.B.EN = 0;
  USART2.CR1.B.TE = 0;

  DMA1.IFCR.W = (unsigned long)0xffffffff;            //  清除所有的标志位
  DMA1_CH7.CPAR = (unsigned long)0x40004404;          //  要传送的目标地址,即USART2的DR的地址
  DMA1_CH7.CMAR        = (unsigned long)(&SCI_Send);         //  要传送的数据的源地址
  DMA1_CH7.CNDTR = 28;
   
  USART2.CR1.B.RE = 1;                                //  接收被使能                                                                                                                                 
  USART2_R_En;                                              //  允许接收
}


我的选择的是接受完再中断。
在USART2的接收中断里再次开启DMA通道,USART2的中断函数太长了,就不贴了
此帖出自stm32/stm8论坛
 
 
 

回复

8

帖子

0

TA的资源

一粒金砂(初级)

6
 
void Initialize_UART2 (void)
{
  USART2.BRR.B.DIV_Fraction = 9;                  //  波特率: 115200
  USART2.BRR.B.DIV_Mantissa = 19;

  USART2.CR1.B.M = 0;                         //  1个起始位,8个数据位,n个停止位
  USART2.CR1.B.PCE = 0;                       //  奇偶校验被禁止

  USART2.CR2.B.STOP = 0;                      //  1个停止位
  USART2.CR2.B.CLKEN = 0;                     //  SCLK引脚被禁止
  
  USART2.CR3.B.RTSE = 0;                      //  RTS硬件流控制被禁止
  USART2.CR3.B.CTSE = 0;                      //  CTS硬件流控制被禁止
  USART2.CR3.B.DMAT = 1;                      //  DMA模式发送使能
  USART2.CR3.B.DMAR = 0;                      //  DMA模式接收禁止

  USART2.CR1.B.RXNEIE = 1;                                  //  当RXNE为1时,产生USART中断
  USART2.CR1.B.TXEIE = 0;
  USART2.CR1.B.TCIE = 0;

  USART2.SR.B.TC = 1;
  USART2.CR1.B.RE = 1;                        //  接受被使能
  USART2.CR1.B.UE = 1;                        //  USART模块被使能
}

这是USART2的配置函数
此帖出自stm32/stm8论坛
 
 
 

回复

2130

帖子

0

TA的资源

五彩晶圆(中级)

7
 
你应该注意下缓冲区
此帖出自stm32/stm8论坛
 
 
 

回复

1059

帖子

0

TA的资源

纯净的硅(高级)

8
 
寄存器操作看的晕晕乎乎的,也不大会寄存器..要不.你把设置接受的字符量+2...那不就正好了?
此帖出自stm32/stm8论坛
 
 
 

回复

8

帖子

0

TA的资源

一粒金砂(初级)

9
 

原帖由 leang521 于 2011-4-14 21:19 发表 你应该注意下缓冲区

 

怎么注意?  哪个缓冲区? 请给予提示。

此帖出自stm32/stm8论坛
 
 
 

回复

8

帖子

0

TA的资源

一粒金砂(初级)

10
 

原帖由 astwyg 于 2011-4-14 21:47 发表 寄存器操作看的晕晕乎乎的,也不大会寄存器..要不.你把设置接受的字符量+2...那不就正好了?

 

 

嘻嘻嘻,我的确也是这么干的,只是从第二帧数据开始,开头会多一个字节0x00,不过我靠和上位机的通讯协议忽略了它

此帖出自stm32/stm8论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表