样例4、使用DMA收发
如果要启用DMA功能,参考sdk中自带的样例。
需要增加3个函数:
DMAC_Init:启动dma
UART_SetDmaMode:设置只要收/发dma,或收发都要dma
DMAC_Config:设置dma的详细参数。
如果收发都要dma,则需要调用2次DMAC_Config来分别设置。
函数DMAC_Config的参数说明:
void DMAC_Config(
DMAC_ChannelNumTypeDef channel, //DMA通道
uint32_t srcAddr, //DMA数据源地址
uint32_t dstAddr, //DMA数据目标地址
DMAC_AddrIncTypeDef srcIncr, //传输后源地址是否自增
DMAC_AddrIncTypeDef dstIncr, //传输后目标地址是否自增
DMAC_WidthTypeDef srcWidth, //源地址传输数据的字节宽度(可选8/16/32)
DMAC_WidthTypeDef dstWidth, //目标地址传输数据的字节宽度(可选8/16/32)
DMAC_BurstTypeDef srcBurst, //源地址一次传输多少
DMAC_BurstTypeDef dstBurst,
uint32_t transferSize, //传输多少次
DMAC_FlowControlTypeDef transferType, //传输方向类型(8种)
uint32_t srcPeripheral, //源地址的外设类型
uint32_t dstPeripheral //目标地址的外设类型
)
比如,设置收DMA,会设置参数如:
DMAC_Config(DMAC_CHANNEL1,
(uint32_t)&UART3->DR, //串口数据寄存器
(uint32_t)rxbuf, //收缓冲buff
DMAC_ADDR_INCR_OFF, //源地址不自增
DMAC_ADDR_INCR_ON, //目标地址自增
DMAC_WIDTH_8_BIT, //源数据宽度以8bit为单位
DMAC_WIDTH_8_BIT, //目标数据宽度以8bit为单位
DMAC_BURST_1,
DMAC_BURST_1,
0, //传输多少次,如果是0则无限制
DMAC_PERIPHERAL_TO_MEM_PERIPHERAL_CTRL, //外设到内存的方向
UART3_RX_DMA_REQ, //源数据外设类型
0 ); //目标数据外设类型
设置发的DMA,会设置参数如:
DMAC_Config(DMAC_CHANNEL0,
(uint32_t)txbuf, //发缓冲
(uint32_t)&UART3->DR, //串口数据寄存器
DMAC_ADDR_INCR_ON, //发缓冲自增
DMAC_ADDR_INCR_OFF, //寄存器不自增
DMAC_WIDTH_8_BIT, //源数据宽度以8bit为单位
DMAC_WIDTH_8_BIT, //目标数据宽度以8bit为单位
DMAC_BURST_1,
DMAC_BURST_1,
dma_count, //要传输的数据量
DMAC_MEM_TO_PERIPHERAL_DMA_CTRL, //内存到外设的方向
0, //源数据外设类型
tx_dma_req); //目标数据外设类型
以上完整代码样例请参考example部分。
更多样例,请参考网盘
1).dma中断:“其他文档\驱动样例补充\example_uart_dmaIrq.c”
2).闲时中断:“其他文档\驱动样例补充\example_uart_rcvIqr.c”
八、IIC的使用
AG32支持两路I2C,分别对应:I2C0、I2C1;
I2C是一种简单的双向两线制总线协议,半双工,支持多主从模式。I2C最大的特点之一就是有完善的应答机制。
MCU端是I2C的主端。
样例程序参考example_i2c.c
在使用I2C时的流程:
1. Ve中先配置对应的引脚:
2. 代码中时钟使能、中断使能、设置频率;
3. 使能I2C;
4. 收发数据;
IIC的收过程和发过程,都有对应的应答流程,启动->收/发->结束。
使用中,收发函数会被完整的封装。
请参考例程函数(函数流程可参考,封装请自行调整):
bool I2cReadPROM(uint8_t *mem, bool verify)
bool I2cWritePROM(uint8_t *mem)
5. 关闭I2C:
另外,例程中还使用到了中断函数。当I2C准备好时,会触发该中断。
注意,IIC例程需要接入设备才能测通,否则在I2C_WaitForTransfer函数中会因为等不到Ack而卡住。
.
九、CAN的使用
AG32支持1路CAN,对应:CAN0
样例程序参考example_can.c
在使用CAN时的流程:
2. 代码中使能时钟、开中断:
3. 配置参数(参数较多)并开启can、开启收中断:
4. 发送数据:
5. 在中断函数中接收数据:
使用时,请参考样例修改。
联系海振远科技
电话:0755-2780 9180; 15323895320;
邮箱:
tech@hizyuan.com
Lucy@hizyuan.com