打印
[其它应用]

中颖SH32F9B00 DMA 应用案例

[复制链接]
1964|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
AdaMaYun|  楼主 | 2023-3-23 16:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
功能:使用 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 | 只看该作者
案例很简单实用

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

248

主题

1917

帖子

3

粉丝