[其它应用] 中颖SH32F9B00 DMA 应用案例

[复制链接]
2486|3
 楼主| AdaMaYun 发表于 2023-3-23 16:56 | 显示全部楼层 |阅读模式
功能:使用 DMA 把 SRAM 中数据通过 UART1 发送给上位机。 说明:传输 256 字节数据,UART1 波特率 9.6KBps,主流程采用查询 TC flag 方式等待传输完成。


  1. #include<<SH32F9B00.H>
  2. void UART1_Config(void)
  3. {
  4.     GPIOB_CFG->LCKR.V32 = 0x5AA50000; // PB0~PB15 unlock (only CFG)
  5.     GPIOB_CFG->AFRH.BIT.AFR9 = 7; // PB9 = AF7 ~ RXD1
  6.     GPIOB_CFG->AFRH.BIT.AFR8 = 7; // PB8 = AF7 ~ TXD1
  7.     GPIOB_CFG->OTYPER &= ~(0<<8);
  8.     GPIOB_CFG->OTYPER |= 0<<8; // 0~ PB8 output PP
  9.     GPIOB_CFG->ODRVR.BIT.ODRVR8= 0; // 00~PB8 output driver normal
  10.     GPIOB_CFG->PUPDR.BIT.PUPDR9 = 0; // 00~PB9 input no pull
  11.     UART1->BRT.BIT.SBRT = 194; // 9.6KBpas, 30000/16/9.6=195.3125
  12.     UART1->BRT.BIT.BFINE = 5; // SBRT = 195-1=194, fine=0.3125*16=5
  13.     UART1->CR.BIT.SM = 1; // type 1: 8/1/1/none, variable baud rate
  14.     UART1->CR.BIT.SBRTEN = 1; // enable baud rate generation
  15.     UART1->CR.BIT.TEN = 1; // enable txd
  16.     UART1->CR.BIT.REN = 1; // enable rxd
  17. }




  18. void main(void)
  19. {
  20.     RCC_Config(); // 配置使用 PLL 作为系统时钟,HCLK=120MHz,PCLK0=HCLK/4
  21.     NVIC_Config(); // 如果需要配置中断,此例未用到中断
  22.     GPIO_Config(); // 如果需要配置 I/O,此例保持默认输入悬空
  23.     UART1_Config(); // UART1 配置为 9.6KBps, PCLK1=30MHz
  24.     RCC->RCCLOCK = 0x33CC; // unlock RCC config
  25.     APB0_CFG->RCCLOCK = 0x33CC; // unlock APB0_CFG config
  26.     RCC->AHBENR.BIT.DMAEN = 1; // DMA clock enable
  27.     RCC->AHBENR.BIT.GPIOEN = 1; // GPIO clock enable
  28.     APB0_CFG ->APB0ENR.BIT.UART1EN = 1; // UART1 clock enable
  29.     APB0_CFG ->RCCLOCK = 0x0; // lock APB0_CFG config
  30.     RCC->RCCLOCK = 0x0; // lock RCC config
  31.     UART1->CR.BIT.DMAT = 1; // 使能 UART1 的 DMA 触发功能
  32.     DMA->SAR2 = Addr1_Sram_Data; // SRAM buffer address
  33.     DMA->DAR2 = Addr1_Uart1_TDR; // UART1 TDR address
  34.     DMA->NPKT2 = 255; // 256 bursts
  35.     DMA->CCR2.BIT.TRGMODE = 0; // one-shot
  36.     DMA->CCR2.BIT.SPTYP = 0; // point modify, 00~inc, 01~dec, 10~fix, 11~round
  37.     DMA->CCR2.BIT.DPTYP = 2; // point modify, 00~inc, 01~dec, 10~fix, 11~round
  38.     DMA->CCR2.BIT.EN = 1; // channel1 enable
  39.     DMA->CSR.BIT.SWTRG = 1<<2; // SWTRG_2
  40.     while(!((DMA->IFSR.BIT.TCIF)&(1<<2))); // wait TCIF_2 flag
  41.     DMA->IFCR.BIT.CTCIF = 1<<2; // clear TCIF_2 flag
  42.     while(1) // main loop
  43.            {
  44.            }
  45. }





OKAKAKO 发表于 2023-11-12 19:16 | 显示全部楼层
DMA传输很重要
szt1993 发表于 2023-11-12 20:30 | 显示全部楼层
案例很简单实用
绒兔星球 发表于 2025-8-30 15:01 | 显示全部楼层
中颖 SH32F9B00 的 DMA 可用于外设数据传输,例如 UART 接收数据自动存储。配置步骤:使能 DMA 时钟,设置通道关联 UART 接收触发;配置传输方向(外设到内存)、数据长度和地址增量;使能 DMA 中断。数据接收时,DMA 自动将 UART 数据存入指定缓冲区,完成后触发中断。此方式减少 CPU 干预,提升效率,适用于高频数据采集场景,需注意缓冲区大小匹配,避免溢出,中断中及时处理数据并重置 DMA。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

308

主题

2692

帖子

6

粉丝
快速回复 在线客服 返回列表 返回顶部