功能:使用 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
{
}
}
|