0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

通过DMAC进行USART的数据回显操作

电子设计 作者:电子设计 2018-09-26 08:25 次阅读

DMAC也可以和外设进行数据交互。之前我们曾使用PDC进行USART的数据回显,这次就使用DMAC完成相同的工作。而且由于DMAC有内部的缓冲区,实现起来更为简单。

一、USART设置

因为之前已经做过相关的实验,这里不再重复。需要注意的是,要注意JP11的跳线,以选择正确的协议(RS232)。另外,如果使用硬件握手协议的话,注意设置PC端串口通信软件的线路控制信号

另外,由于不再使用手动的缓冲区和PDC,所以不需要进行相关的设置。同时,也不用再使用USART的接收超时功能。

二、DMAC设置

本次使用的通道依然为通道0:

1#defineDMAC_CH0

启用DMAC:

1//代码略...

设置DSCR为0,以进行单次传输:

1DMAC->DMAC_CH_NUM[DMAC_CH].DMAC_DSCR=0;

设置SADDR以及DADDR。

因为数据都在US_RHR和US_THR的低位上,所以将源地址和目标地址分别设为这两个寄存器的地址即可。

DMAC->DMAC_CH_NUM[DMAC_CH].DMAC_SADDR=

&(USART1->US_RHR);

DMAC->DMAC_CH_NUM[DMAC_CH].DMAC_DADDR=

&(USART1->US_THR);

设置CTRLA和CTRLB。

在USART数据位为8位时,一次传输一个字节即可。

DMAC->DMAC_CH_NUM[DMAC_CH].DMAC_CTRLA=

DMAC_CTRLA_BTSIZE(16)//进行16次传输

|DMAC_CTRLA_SRC_WIDTH_BYTE//一次传输一个字节

|DMAC_CTRLA_DST_WIDTH_BYTE//同上

;

DMAC->DMAC_CH_NUM[DMAC_CH].DMAC_CTRLB=

DMAC_CTRLB_FC_PER2PER_DMA_FC//外设至外设的传输

|DMAC_CTRLB_SRC_INCR_FIXED//传输时源地址固定

|DMAC_CTRLB_DST_INCR_FIXED//传输时目标地址固定

;

设置CFG寄存器。

因为DMAC和USART1之间有硬件握手接口,所以这里使用硬件握手接口即可(否则需要使用软件握手接口手动触发传输)。USART1的发送接口号为5,接收接口号为6:

由于需要尽快将DMAC内部缓冲区的内容传输出去,所以一旦其数据量可以发送,就发送出去。

DMAC->DMAC_CH_NUM[DMAC_CH].DMAC_CFG=

DMAC_CFG_SRC_H2SEL_HW//使用硬件握手

|DMAC_CFG_DST_H2SEL_HW

|DMAC_CFG_SRC_PER(6)//接口号

|DMAC_CFG_DST_PER(5)

|DMAC_CFG_SOD_DISABLE

|DMAC_CFG_FIFOCFG_ASAP_CFG//尽快发送数据

;

启用中断。

在传输任务完成后,需要重新启用通道,以重新开始任务。

1

2DMAC->DMAC_CHER=DMAC_CHER_ENA0<< DMAC_CH;

//NVIC中断设置的代码略...

中断处理。

在中断中重新设置CTRLA寄存器的BTSIZE字段,再启用通道即可。

voidDMAC_Handler(void)

{

uint32_tstatus=DMAC->DMAC_EBCISR;

//判断是否为指定中断

if(status&(DMAC_EBCISR_CBTC0<< DMAC_CH))

{

//设置CTRLA

DMAC->DMAC_CH_NUM[DMAC_CH].DMAC_CTRLA&=

~(uint32_t)DMAC_CTRLA_BTSIZE_Msk;

DMAC->DMAC_CH_NUM[DMAC_CH].DMAC_CTRLA|=

DMAC_CTRLA_BTSIZE(16);

//再次启用通道

DMAC->DMAC_CHER=DMAC_CHER_ENA0<< DMAC_CH;

}

}

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • PC
    PC
    +关注

    关注

    9

    文章

    1950

    浏览量

    152788
  • 串口通信
    +关注

    关注

    32

    文章

    1577

    浏览量

    54860
  • USART
    +关注

    关注

    1

    文章

    186

    浏览量

    30407
收藏 人收藏

    评论

    相关推荐

    M451串口问题需要怎么关闭?

    M451串口问题需要怎么关闭?
    发表于 01-16 06:47

    请问两片STM32F如何通过外设USART半双工方式对不同数据进行实时的传输?

    两片STM32F蕊片如何通过外设USART半双工方式对不同数据进行实时的传输?谢谢!
    发表于 02-13 07:29

    如何用手机发送数据给esp8266到串口实现控制?

    通过手机发送数据控制LED,发送led_on点亮,发送led_off关闭,通过串口调试助手发送数据到串口可实现控制功能,用手机发送数据给e
    发表于 07-14 23:53

    FPGA作为从机通过SPI接收ARM传来的数据传的数据发生跳变

    改了下代码,在FPGA的内部时钟(sys_clk)的上升沿对SPI上的时钟和数据进行操作读的数据正常了。请问前者和后者的区别是啥?是因为
    发表于 08-06 11:45

    如何使用USART进行通信/收发数据

    如何使用USART进行通信/收发数据
    发表于 12-13 07:37

    如何通过USART1收发数据

    如何通过USART1收发数据
    发表于 12-13 07:12

    如何解决STM32串口通信数据问题?

    如何解决STM32串口通信数据问题?
    发表于 12-13 07:30

    如何使用USART进行通信/收发数据

    如何使用USART进行通信/收发数据
    发表于 02-07 07:29

    怎么使用USB模拟串口数据

    如何更新外部flash中的数据?怎么使用USB模拟串口数据
    发表于 02-22 07:29

    RTThread串口数据一切正常,msh乱码怎么处理?

    串口数据一切正常,只有msh数据是乱码,打开了RT_USING_POSIX,
    发表于 05-11 09:32

    CubeMX生成的C代码发出USART启动调用怎么办?

    MX 生成的 C 代码在 DMA 启动调用之前发出 USART 启动调用。我的代码只是 USART 收到的任何文本。不幸的是,
    发表于 12-27 07:53

    USB供电时无法通过USART进行ISP升级

    USB供电时无法通过USART进行ISP升级USB供电时无法通过USART进行ISP升级
    发表于 10-19 06:59

    对 Flash 操作导致 USART 接收丢数据

    对 Flash 操作导致 USART 接收丢数据
    发表于 11-25 14:49 0次下载

    对Flash 操作导致USART 接收丢数据

    对Flash 操作导致USART 接收丢数据(嵌入式开发系统中宿主机概念)-该问题客户提出,发生在STM32F103VDT6 器件上。据其工程师讲述:在其产品设计中,使用了STM32 片上Flash
    发表于 07-30 10:45 16次下载
    对Flash <b class='flag-5'>操作</b>导致<b class='flag-5'>USART</b> 接收丢<b class='flag-5'>数据</b>

    STM32U5开发(1)----通过USART1发送数据

    通过 USART1 发送一些数据
    的头像 发表于 07-27 11:35 681次阅读
    STM32U5开发(1)----<b class='flag-5'>通过</b><b class='flag-5'>USART</b>1发送<b class='flag-5'>数据</b>