范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

瑞萨单片机基于DMA的串口通讯实例

  单片机程序开发中,经常用到串口通讯,一般大家都是采用中断的方式实现,但是如果要求通讯波特率很高,那么就会导致程序频繁地进行中断处理,更甚者导致主循环得不到运行,这时候一般都会选择DMA+UART的方式进行设计,接收和发送交给DMA,释放MCU去做别的事情。
  这里以瑞萨单片机为例,接收和发送均通过DMA实现,上实例代码,包括DMA和UART的配置以及详细的注释,用到同款单片机的朋友可以参考。
  //DMA+USART的配置 250字节的定长发送和250字节的定长接收
  INT8U sciTxBuf[256];//定长发送缓冲数组,DMA接收的目标地址
  INT8U sciRxBuf[256];//定长接收缓冲数组,DMA发送的源地址
  void dmac0_init(void)//接收DMA通道0
  {
  IEN(DMAC,DMAC0I) = 0; /* 禁用DMAC0I中断请求 */
  DMAC0.DMCNT.BIT.DTE = 0; /* 禁用DMA0传送数据*/
  ICU.DMRSR0 = 219; /* DMAC0的请求源: RXI1 ,(RXI中断向量号为219) */
  DMAC0.DMAMD.BIT.DM = 2; /* 目标地址更新方式:递增,值为10b */
  DMAC0.DMAMD.BIT.SM = 0; /* 源地址更新方式:固定,值为00b */
  DMAC0.DMAMD.BIT.DARA = 0; /* 目标地址扩展重复区域:不指定 */
  DMAC0.DMAMD.BIT.SARA = 0; /* 源地址扩展重复区域 :不指定*/
  DMAC0.DMTMD.BIT.DCTG = 1; /* DMA 请求源: 外设中断 */
  DMAC0.DMTMD.BIT.SZ = 0; /* 数据传送长度: 8 bits */
  DMAC0.DMTMD.BIT.MD = 0; /* 传送模式: 正常传送 */
  DMAC0.DMCSL.BIT.DISEL = 0; /* 传送结束后,将启动源的中断标志清0 */
  DMAC0.DMSAR = (void *)&SCI1.RDR; /* 源地址: SCI1.RDR register */
  DMAC0.DMDAR = (void *)sciRxBuf; /* 目标地址: 接收缓存 */
  DMAC0.DMCRA = 250; /* DMCRA.DMCRAL = 0, 指定传送个数 1024*/
  /* DMCRA.DMCRAH = 0, 指定备份传送个数1024 */
  IPR(DMAC,DMAC0I) = 10; /* DMAC0I中断优先级: Level 12 */
  DMAC0.DMINT.BIT.DTIE = 1; /* 允许传送结束中断请求 */
  IEN(DMAC,DMAC0I) = 1; /* 允许DMAC0I的中断请求 */
  DMAC0.DMCNT.BIT.DTE = 1; /* 允许DMA传送数据 */
  }
  void dmac1_init(void)//发送DMA通道1
  {
  IEN(DMAC,DMAC1I) = 0; /* 禁用DMAC1I的中断请求 */
  DMAC1.DMCNT.BIT.DTE = 0; /* 禁用DMA传送 */
  ICU.DMRSR1 = 220; /* DMAC1的请求源:TXI ,(TXI中断向量号为220)*/
  DMAC1.DMAMD.BIT.DM = 0; /* 目标地址更新方式:固定 ,值为00b */
  DMAC1.DMAMD.BIT.SM = 2; /* 源地址更新方式:递增 , 值为10b */
  DMAC1.DMAMD.BIT.DARA = 0; /* 目标地址扩展重复区域:不指定 */
  DMAC1.DMAMD.BIT.SARA = 0; /* 源地址扩展重复区域 :不指定*/
  DMAC1.DMTMD.BIT.DCTG = 1; /* DMA 请求源: 外设中断 */
  DMAC1.DMTMD.BIT.SZ = 0; /* 数据传送长度: 8 bits */
  DMAC1.DMTMD.BIT.MD = 0; /* 传送模式: 正常传送 */
  DMAC1.DMCSL.BIT.DISEL = 0; /* 传送结束后,将启动源的中断标志清0 */
  DMAC1.DMSAR = (void *)sciTxBuf; /* 源地址: 传送缓存 */
  DMAC1.DMDAR = (void *)&SCI1.TDR; /* 目标地址: SCI1.TDR 发送寄存器 */
  DMAC1.DMCRA = 250; /* 指定传送个数 */
  IPR(DMAC,DMAC1I) = 10; /* DMAC1I 中断优先级: Level 12 */
  DMAC1.DMINT.BIT.DTIE = 1; /* 允许传送结束中断请求 */
  IEN(DMAC,DMAC1I) = 1; /* 允许DMAC1I的中断请求 */
  DMAC1.DMCNT.BIT.DTE = 0; /* 允许DMA数据传送 */
  }
  void init_uart(void)
  {
  dmac0_init(); /* 初始化DMAC0,用于串口SCI1接收 */
  dmac1_init(); /* 初始化DMAC1,用于串口SCI1发送 */
  SYSTEM.PRCR.WORD = 0xA502;
  MSTP(SCI1) = 0;
  SYSTEM.PRCR.WORD = 0xA500;
  IEN(SCI1,ERI1) = 0; /* 禁用SCI1.ERI1中断 */
  IEN(SCI1,RXI1) = 0; /* 禁用SCI1.RXI1中断 */
  IEN(SCI1,TXI1) = 0; /* 禁用SCI1.TXI1中断 */
  IEN(SCI1,TEI1) = 0; /* 禁用SCI1.TEI1中断 */
  /*SCI1 module stop state cancel*/
  SCI1.SCR.BYTE = 0x00; /* 禁用发送和接收 */
  while (0x00 != (SCI1.SCR.BYTE & 0xF0)){}/* Confirm that bit is actually 0 */
  /*only RE/TE/RIE/TIE==0 can write register*/
  MPC.PWPR.BIT.B0WI = 0;
  MPC.PWPR.BIT.PFSWE = 1;
  MPC.P30PFS.BYTE = 0x0A;//RXD1
  MPC.P26PFS.BYTE = 0x0A;//TXD1
  MPC.PWPR.BIT.PFSWE = 0;
  MPC.PWPR.BIT.B0WI = 1;
  /*MPC=RXD and TXD*/
  PORT3.PMR.BYTE |= 0x01U;//PORT3.PMR.BIT.B0 = 1;//串口管脚配置
  /*PMR=peripheral*/
  SCI1.SCR.BIT.CKE = 0; /* 使用内部波特率发生器*/
  SCI1.SMR.BYTE = 0x20; /* 时钟源:PCLK */
  /* 1个停止位,偶校验,数据位:8,异步通信 */
  SCI1.SCMR.BYTE = 0xF2; /* SCI1通信模式:串行通信 */
  SCI1.SEMR.BIT.ABCS = 1; /* ABCS值为0: 16个基本时钟为1bit的传送时间 */
  /* ABCS值为1: 8个基本时钟为1bit的传送时间 */
  SCI1.BRR = 0; /* 波特率: 0->781250bps ,所以最后波特率是1.5M*/
  /*interrupt priority*/
  IPR(SCI1, ) = 10;
  IR(SCI1,RXI1) = 0;
  IR(SCI1,TXI1) = 0;
  IR(SCI1,ERI1) = 0;//
  SCI1.SCR.BIT.RIE = 1;
  SCI1.SCR.BIT.RE = 1;
  IEN(SCI1,RXI1)=1;
  IEN(SCI1,ERI1)=1;
  DMAC.DMAST.BYTE = 0x01; /* DMAC启动 */
  }
  void uart_send(INT8U*pdata,INT8U len)//DMA定长模式发送250字节
  {
  int i = 0;
  if(len>=250)
  {
  return;//发送长度不对
  }
  for(i = 0; i < 250; i++)
  {
  if(i < len)
  {
  sciTxBuf[i] = pdata[i];
  }
  else
  {
  sciTxBuf[i] = 0x00;
  }
  }
  DMAC1.DMCNT.BYTE = 0x00;
  DMAC1.DMSAR = (void *)sciTxBuf; /* 源地址: 传送缓存 */
  DMAC1.DMCRA = 250; /* 指定传送个数,250字节 */
  DMAC1.DMCNT.BYTE = 0x01;
  PORT2.PMR.BIT.B6 = 1;
  SCI1.SCR.BIT.TIE = 1;
  SCI1.SCR.BIT.TE = 1;
  IEN(SCI1,TXI1)=1;
  }
  void Excep_SCI1_ERI1(void)//串口接收错误中断
  {
  INT8U dummy;
  dummy = SCI1.RDR;
  dummy+=0;
  init_uart_terminal();//重新配置串口
  }
  void Excep_DMAC_DMAC0I(void)// DMAC DMAC0I RCV
  {
  INT16U i;
  for(i=0;i<250;i++)
  {
  message_buff[i]=sciRxBuf[i];// 接收内容缓存到message_buff
  }
  dmac0_init();
  }
  void Excep_DMAC_DMAC1I(void)// DMAC1 SEND
  {
  IEN(SCI1,TXI1) = 0;
  SCI1.SCR.BIT.TIE = 0;
  while(0 != SCI1.SCR.BIT.TIE){}
  IR(SCI1,TXI1) = 0;
  while(0 == SCI1.SSR.BIT.TEND){}
  SCI1.SCR.BIT.TE = 0;
  }
  这里有一个问题需要大家在使用的时候思考并解决,在通讯过程中因串口丢失数据会导致DMA接收对不齐,也就是上一次的接收和下一次的接收内容会拼在仪器产生一个DMA接收中断,且该次中断的数据无效,并且只要一出现对不齐,如果不采取措施的话,那么以后永远都对不齐了。这个问题大家自行解决,也可以在评论区分享自己的见解。

美苏最接近战争的时刻!美国务院解密文件曝光三战差点就打响了据俄罗斯卫星通讯社报道,从美国国务院最新解密的一批情报文件来看,美国在1983年11月所进行的阿布尔阿彻(ablearcher)演习使得人类几乎接近第三次世界大战的边缘。而美国分析消灭美国的可能还是美国!枪击案频发,民间枪支多到难以想象枪支泛滥问题,是美国社会老大难的问题,尽管多位美国总统都曾承诺过会限制枪支,但是效果却并不明显。目前美国民间保有枪支超过三亿六千万支,占全世界民间持枪数量的百分之四十。要知道,美国盘点上海车展阵仗最大的新能源展台,恒大汽车9款车齐上阵吸睛一年一度的上海车展又来了,赶在媒体日上,我们对本届车展的各大展馆转了个遍,从今天开始,我们开始盘点本届车展各种之最。今天要说的是本届上海车展上阵仗最大的新能源汽车展台,那就是恒大汽下毒囚禁虐待,遭受变态PUA,这样的爱让人窒息有这么一句歌词,相信大家从小就听过,甚至每个人应该都会唱世上只有妈妈好,有妈的孩子像块宝,在我们的眼中母亲这个人物是对家庭对自己的孩子是无私奉献的,不管是好吃的好玩的,永远考虑的都创维电视怎么下载电视家3。0?一招教你给创维电视安装电视家电视家是大家非常熟悉的电视直播软件,然而创维电视因自身系统问题,断绝一切第三方软件的安装。小编经过各种测试后,终于发现了一种创维电视最有效的安装电视家3。0的办法,此方法同样适用于创维电视怎么看电视台直播?最新教程分享,无需U盘即可解决创维系统的电视质量虽好,但却有一个闹心的问题,就是不能安装第三方软件看电视台直播。小编经过重重测试后,终于发现了一个方法,能够完美解决创维电视无法安装直播软件的问题,并且不需要任何能否打破眼前的局面?中国巨资拿下的巴铁良港,发展前景广阔众所周知,中国的石油进口一直面临着马六甲海峡困局,这一方面是因为国内日益增长的石油需求量,另一方面也是因为全球主要的石油出口国家都集中在中东地区。从目前中国快速增长的石油缺口来看,我和我的家乡一部让人飙泪的喜剧片,现在可以抢先看了每个人的心中都有一个自己的家乡,那里有自己熟悉的味道人每个人对家乡的概念也是有所不同的,远在他乡的你,是否有时候也怀念自己的家乡,那里有你熟悉的人和事。今天我要跟大家介绍的就是今年喝一杯杰伦的奶茶看未来智能汽车,R汽车上海车展兑现想象进入2021年,国内汽车销量大幅增长,汽车市场展现出了旺盛的活力,作为今年首个大型国际车展,上海车展可谓万众瞩目。在这个盛大的舞台上,各大车企自然不会放过大秀身姿的机会,纷纷通过各央视重点播报!我国超高速风洞即将完成热搜,JF22风洞都有啥用?8月23日,我国JF22超高速风洞的相关建设消息在当天登上热搜。而据央视军事8月23日的报道,JF22作为我国目前正在攻关中的最先进的风洞,预计将会在2022年完成建设投入使用。而日本投降后,国民党当局为何放弃在日本驻军?这背后隐藏什么秘密作为中国的近邻,中日之间的关系可谓是一言难尽!而近期,日方与美国之间加速串联,屡屡对话挑衅。而每当此时,有很多人都会谈论二战结束后,国民政府本有机会进驻日本本土,但最终却未能成行!
无线充电加持,HyperX天箭S无线电竞游戏耳机试玩身为一名电竞游戏爱好者,每次拿到新外设的时候总是无比兴奋和期待,毕竟新处理器新显卡这些对目前主流的电竞游戏而言已经有点性能过剩了,而新外设才是真真切切能改变游戏体验的玩具。好了,废老机箱新装修,清爽宜人MATX电脑游戏主机组建分享个人对MATX一直比较喜欢,对比ATX和ITX而言,MATX相对中庸,但换一个角度来说也是相对均衡的,毕竟我没打算上水冷或双独显,同时对主机的尺寸要求也还没到达斤斤计较的地步,综合又一个以竞技为核心的赛车游戏来了,你的竞技方向盘准备好了吗?世界各大领域的赛车赛事都有了自己专属赛车电竞游戏,万人瞩目的F1电竞,由代码大师开发的F1系列游戏马上要迎来F12019,WRC世界拉力锦标赛标榜的WRC8也放出了首批试玩视频。A1msNanoIPS面板引发高端电竞显示器洗牌?优派XG270QG上手玩作为电竞显示器四大金刚中的其中一员,优派XG2703GS已经上市三年多,而随着LGNanoIPS面板的正式推出,优派旗下这款大金刚显示器也迎来了升级。优派全新一代的大金刚电竞显示器实战如何用一个不到300元的机箱装出高档次主机双十一刚过,相信选择在这段时间装机的朋友都已经买到心仪的配件并已组装起来了,楼主也不例外,今天就与大家分享一台用微星雷万汀机箱装起来的AMD3A平台主机,首先是配件全家福。下面是配挑战四大金刚?优派VX2780PRO165Hz电竟显示器体验四大金刚作为游戏显示器领域最受玩家推崇的代表作产物,它们是游戏显示器中的性能标杆,用玩家最通俗的话来说就是除了贵没缺点。职业玩家和高端玩家也许能够为了追求性能而不惜代价,但对于大部MIUI13部分功能亮相,高管暗示新系统8月发布之前大李同学透露,内测中心会在8月跟随新版MIUI一起做一次调整,前两天大李又暗示了一波8月,基本可以确定MIUI13会在8月小米秋季发布会上亮相,而且那场发布会还会有平板和新旗舰极米小米坚果哪个好?侧投功能告诉你小米最不值得买下班后为数不多的爱好就是研究各类新潮的电子产品,也在这条路上踩过很多坑,所以才想要把踩过的坑,用自己积累的经验收集的资料去铺平这些坑。从刚毕业那阵子开始用投影仪,我住过10平米不到雷军一顿饭,透露了小米三个目标,两款产品小米成立至今,创办了如橙色跑爆米花小米家宴等一系列粉丝活动,由于今年疫情原因,小米家宴改为了小规模的小米年夜饭,虽然参与的人少,但在这场活动中,雷军透露出很多米粉感兴趣的东西。先是RedmiK40价格猜想,2599合情合理,实际或有惊喜RedmiK40系列在几天的预热后,其中的标准版成了网友最关心的版本,在基本配置都以得知后,网友开始对其价格进行了讨论(撕逼),其中定价2599元,相对K30S加量不加价的说法比较双十一最新战报,荣耀平板一举夺下双冠军随着时间进入11月份,与大家所期待的双十一电商购物狂欢节,也是越来越靠近了。但是今年的活动,似乎并不是非要等到11月11日当天才开始。11月1日零点刚过,就有不少商家已经开放了有关