PIC32 UART DMA
在PIC32微控制器上使用UART和DMA(直接内存访问)可以高效传输数据,减轻CPU负担。以下是关键配置步骤和要点:
1. 初始化UART
- 选择UART模块(如UART1, UART2)
- 配置参数:
U1MODEbits.BRGH = 0; // 标准波特率模式 U1BRG = BRGVAL; // 波特率值(根据时钟计算) U1STA = 0; // 清除状态寄存器 U1MODEbits.UARTEN = 1; // 使能UART U1STAbits.UTXEN = 1; // 使能发送 U1STAbits.URXEN = 1; // 使能接收
2. 配置DMA通道
- 启用DMA控制器:
DMACONbits.ON = 1; // 全局使能DMA - 选择通道(如DMA通道0):
DCH0CONbits.CHEN = 0; // 禁用通道以配置 DCH0ECONbits.CHSIRQ = UART1_RX_IRQ_NUM; // 接收触发源(IRQ编号见数据手册) DCH0ECONbits.SIRQEN = 1; // 触发源使能
3. 设置传输方向与地址
- 接收数据(UART → RAM):
DCH0CONbits.CHPRI = 3; // 通道优先级 DCH0CONbits.CHDIR = 0; // 外设→内存 DCH0SSA = (uint32_t)&U1RXREG; // 源地址:UART接收寄存器 DCH0DSA = (uint32_t)buffer; // 目标地址:自定义RAM缓冲区 DCH0SSIZ = 1; // 源数据块大小(每次1字节) DCH0DSIZ = BUFFER_SIZE; // 目标缓冲区总大小 DCH0CSIZ = 1; // 单次传输大小
4. 启动DMA
DCH0CONbits.CHEN = 1; // 使能通道
DCH0CONbits.CHEDMA = 1; // 允许硬件触发(事件驱动)
5. 中断处理
- DMA完成中断:
void __ISR(_DMA_0_VECTOR, IPL6) DMA0_Handler(void) { if (DCH0INTbits.CHBCIF) { // 检查块传输完成 DCH0INTbits.CHBCIF = 0; // 清除标志 // 处理接收完成的数据 } }
关键注意事项
- 数据对齐:RAM缓冲区地址需满足DMA对齐要求(通常4字节对齐)。
- 环形缓冲:若需循环接收,配置
DCH0CSIZ为缓冲区长度,并设置DCH0CONbits.CHMODE = DMA_CH_MODE_CONTINUOUS。 - 硬件流控:高速通信时使能CTS/RTS引脚(通过
UxMODEbits配置)。 - 性能优化:
- 设置DMA优先级高于CPU
- 使用CPU缓存一致寄存器(Cache Coherence)如
CHEKRA(若启用缓存)。
示例代码(DMA接收)
char rx_buffer[128] __attribute__((aligned(16)); // 16字节对齐
void init_uart_dma_rx() {
// UART配置(波特率115200)
U1BRG = ((PBCLK_HZ / 115200) / 16) - 1;
U1MODEbits.ON = 1;
U1STAbits.UTXEN = U1STAbits.URXEN = 1;
// DMA配置
DCH0CONbits.CHEN = 0;
DCH0ECONbits.CHSIRQ = 34; // UART1 RX IRQ(见器件手册)
DCH0ECONbits.SIRQEN = 1;
DCH0SSA = (uint32_t)&U1RXREG;
DCH0DSA = (uint32_t)rx_buffer;
DCH0SSIZ = 1;
DCH0DSIZ = sizeof(rx_buffer);
DCH0CSIZ = 1;
DCH0CONbits.CHMODE = DMA_CH_MODE_CONTINUOUS; // 循环模式
DCH0CONbits.CHEN = 1;
// 中断配置
IPC9bits.DMA0IP = 6; // 中断优先级6
IFS0bits.DMA0IF = 0; // 清除标志
IEC0bits.DMA0IE = 1; // 使能DMA中断
}
以上步骤确保UART数据通过DMA自动存储到RAM,大幅提升系统效率。具体寄存器名称请参考Microchip PIC32系列数据手册中"UART"和"DMA Controller"章节。
PIC32
PIC32 - PIC32 Microcontroller Families With USB, CAN and Ethernet - Microchip Technology
Microchip PIC32 MCU的主要特性及开发应用
Microchip的MIPS®M4K®的32位产品组合提供了高性能微控制器以及开发嵌入式项目所需的所有工具。借助免费软件,低成本开发工具以及16位产品线的引脚/外设兼容性,PIC32 MCU缩短了上市时间,并使您的设计不断发展。P
2021-03-18 16:36:27
使用PIC32 MCU开发GSM/GPRS/GPS解决方案
本应用笔记将介绍一个使用 PIC32 单片机(MCU)、M2M 电路板和 MEB 共同实现 GSM/GPRS/GPS连接的参考设计。
资料下载
姚小熊27
2021-04-02 13:58:39
用DMA怎么实现PIC32 UART接收?
大家好,我正在尝试用DMA实现PIC32 UART接收,到目前为止,在运行代码时,我没有在myBUFF中接收任何数据,并且当我使用
PIC32 MZ的EBI/DMA/PMP是否需要使用和声?
我开始了一个新的项目与LCD显示器,我正在考虑使用PIC32 MZ来控制通过DMA和EBI/PMP。关于PIC32 MZ的EBI/
PIC32 USB入门工具包III-DMA示例是否协调?
您好,有PIC32 USB启动器工具包III的例子来演示使用和声库的DMA吗?有一个PWMLDMA演示,但使用外围库。当我考虑创建一个新的和谐项目或者使用PI
PIC32中AT命令的响应方式是什么?
您好,我是PIC32的新手,想知道PIC32中AT命令的响应方式。我正在通过uart发送AT命令,需要查看AT命令的响应以进行进一步的处理。请检
换一换
- 如何分清usb-c和type-c的区别
- 中国芯片现状怎样?芯片发展分析
- vga接口接线图及vga接口定义
- 芯片的工作原理是什么?
- 华为harmonyos是什么意思,看懂鸿蒙OS系统!
- 什么是蓝牙?它的主要作用是什么?
- ssd是什么意思
- 汽车电子包含哪些领域?
- TWS蓝牙耳机是什么意思?你真的了解吗
- 什么是单片机?有什么用?
- 升压电路图汇总解析
- plc的工作原理是什么?
- 再次免费公开一肖一吗
- 充电桩一般是如何收费的?有哪些收费标准?
- ADC是什么?高精度ADC是什么意思?
- dtmb信号覆盖城市查询
- EDA是什么?有什么作用?
- 中科院研发成功2nm光刻机
- 苹果手机哪几个支持无线充电的?
- type-c四根线接法图解
- 华为芯片为什么受制于美国?
- 怎样挑选路由器?
- 元宇宙概念股龙头一览
- 锂电池和铅酸电池哪个好?
- 如何进行编码器的正确接线?接线方法介绍
- 什么是场效应管?它的作用是什么?
- 虚短与虚断的概念介绍及区别
- 晶振的作用是什么?
- 大疆无人机的价格贵吗?大约在什么价位?
- amoled屏幕和oled区别
- 苹果nfc功能怎么复制门禁卡
- 单片机和嵌入式的区别是什么
- 复位电路的原理及作用
- BLDC电机技术分析
- dsp是什么意思?有什么作用?
- 苹果无线充电器怎么使用?
- iphone13promax电池容量是多少毫安
- 芯片的组成材料有什么
- 特斯拉充电桩充电是如何收费的?收费标准是什么?
- 直流电机驱动电路及原理图
- 传感器常见类型有哪些?
- 自举电路图
- 苹果笔记本macbookpro18款与19款区别
- 通讯隔离作用
- 新斯的指纹芯片供哪些客户
- 伺服电机是如何进行工作的?它的原理是什么?
- 无人机价钱多少?为什么说无人机烧钱?
- 以太网VPN技术概述
- 手机nfc功能打开好还是关闭好
- 十大公认音质好的无线蓝牙耳机