AdaMaYun 发表于 2023-3-23 16:56

中颖SH32F9B00 DMA 应用案例

功能:使用 DMA 把 SRAM 中数据通过 UART1 发送给上位机。 说明:传输 256 字节数据,UART1 波特率 9.6KBps,主流程采用查询 TC flag 方式等待传输完成。


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




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





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。
页: [1]
查看完整版本: 中颖SH32F9B00 DMA 应用案例