新塘M0使用PDMA传输数据到串口发送,电脑接收到得数据部全对
以下是串口与PDMA的初始化代码:
unsigned char TxBuffer[16] = {0X00,0X01,0X02,0X03,0X04,0X05,0X06,0X07,0X08,0X09,0X0A,0X0B,0X0C,0X0D,0X0E,0X0F};
SYSCLKs.APBCLK.Bits.UART0_EN = 1;//打开uart0时钟
SYSCLKs.CLKSEL1.Bits.UART_S = 0;//UART时钟源选择外部4-24M高速晶振
SYSCLKs.CLKDIV.Bits.UART_N = 0;//UART时钟源的时钟除频数;UART时钟源= UART时钟源/(UART_N+1)
SYSs.IPRSTC2.Bits.UART0_RST = 1; //复位
SYSs.IPRSTC2.Bits.UART0_RST = 0;
SYSs.GPBMFP.Bits.UART0_RX = 1;//管脚复用选择UART功能
SYSs.GPBMFP.Bits.UART0_TX = 1;
UART0s.LCR.Bits.WLS = 3;//字长度选择8位
UART0s.LCR.Bits.NSB = 0;//停止位数目1位
UART0s.LCR.Bits.PBE = 0;//无奇偶校验
UART0s.BAUD.Bits.DIV_X_EN = 1;
UART0s.BAUD.Bits.DIV_X_ONE = 1;
UART0s.BAUD.Bits.BRD = 1248;//模式2,波特率9600
UART0s.FUNSEL.Bits.FUN_SEL = 0;//选择UART模式
UART0s.FCR.Bits.RFITL = 0;//Rx FIFO中断(INT_RDA)触发级别1字节
UART0s.FCR.Bits.RFR = 1;//Rx软件复位
UART0s.FCR.Bits.TFR = 1;//Tx软件复位
SYSCLKs.AHBCLK.Bits.PDMA_EN = 1;//打开PDMA时钟
SYSs.IPRSTC1.Bits.PDMA_RST = 1; //DMA复位
SYSs.IPRSTC1.Bits.PDMA_RST = 0;
PDMA_GCR->GCRCSR.CLK0_EN = 1;//通道0时钟使能
PDMA_GCR->GCRCSR.CLK1_EN = 1;//通道1时钟使能
PDMA_GCR->PDSSR1.UART0_RXSEL = 1;//选择与通道1相连
PDMA_GCR->PDSSR1.UART0_TXSEL = 0;//选择与通道0相连
//UART0的TX使用PDMA0通道传输
PDMA0s.SAR.Regs = (uint32_t)TxBuffer;//PDMA传输源地址
PDMA0s.DAR.Regs = UART0_BASE ;//目的地址寄存器
PDMA0s.BCR.Regs = 16;//发送字节计数寄存器
PDMA0s.CSR.Bits.SW_RST = 1;//软件产生复位
PDMA0s.CSR.Bits.MODE_SEL = 2;//PDMA模式选择 :存储器到外设
PDMA0s.CSR.Bits.SAD_SEL = 0;//传输源地址方向选择:源地址增加
PDMA0s.CSR.Bits.DAD_SEL = 2;//传输目的地址方向选择:目的地址固定
PDMA0s.CSR.Bits.APB_TWS = 1;//外设传输宽度选择;8位
//UART0的RX使用PDMA1通道传输
PDMA1s.SAR.Regs = UART0_BASE;//PDMA传输源地址
PDMA1s.DAR.Regs = (uint32_t)RxBuffer;//PDMA传输目的地址
PDMA1s.BCR.Regs = 16;//发送字节计数寄存器
PDMA1s.CSR.Bits.SW_RST = 1;//软件产生复位
PDMA1s.CSR.Bits.MODE_SEL = 1;//PDMA模式选择 :外设到存储器
PDMA1s.CSR.Bits.SAD_SEL = 2;//传输源地址方向选择:源地址不变
PDMA1s.CSR.Bits.DAD_SEL = 0;//传输目的地址方向选择:目的地址增加
PDMA1s.CSR.Bits.APB_TWS = 1;//外设传输宽度选择;8位
PDMA1s.IER.Bits.BLKD_IE = 1;//Transfer Done中断使能
PDMA1s.CSR.Bits.PDMACEN = 1;//PDMA通道使能
PDMA1s.CSR.Bits.TRIG_EN = 1;//PDMA数据读写传输使能(当PDMA传输完成, 该位自动清除.)
PDMA0s.IER.Bits.BLKD_IE = 1;//Transfer Done中断使能
PDMA0s.CSR.Bits.PDMACEN = 1;//PDMA通道使能
PDMA0s.CSR.Bits.TRIG_EN = 1;//PDMA数据读写传输使能(当PDMA传输完成, 该位自动清除.)
UART0s.IER.Regs |= (1<<UART_IER_DMA_TX_EN)|(1<<UART_IER_DMA_RX_EN);//Tx DMA使能,Rx DMA使能
运行完后串口软件得到的数据为:00 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D
前面多了两个0,不知道怎么出来的。初始化反复查找过没发现哪里有问题,不知道什么情况下会出现这样的问题 |