ATmega328P 参数速查:引脚定义、替代型号与选型要点
更新时间:2026-10-25。参数速查页,属于芯片选型速查系列。Arduino Uno 御用 8 位 AVR 单片机,20MHz/32KB Flash/2KB SRAM,DIP-28 可直插面包板,8 位机教学与快速原型的事实标准。本篇数据来自官方 datasheet 人工摘录核对(来源见文末),不含整表搬运;替代与增量小节为实机对照或踩坑沉淀,是全篇独有内容。全系列索引见 芯片参数速查中心。
核心参数一览
| 参数 | 值 |
|---|---|
| 内核 / 主频 | AVR 8-bit(Harvard) · 20 MHz |
| 存储 | Flash 32 KB / SRAM 2 KB |
| 工作电压 | 1.8–5.5V |
| IO 电平 | 跟随 VCC(5V 系统直接兼容老式 TTL 电平) |
| 封装 | DIP-28 / TQFP-32 / QFN-32 |
| 供货状态 | 在产 |
片上资源:USART×1(硬件串口)、SPI×1、TWI(I2C)×1、ADC 10bit×8ch(TQFP)/6ch(DIP)、定时器×3(2×8bit + 1×16bit,带 PWM×6)、EEPROM 1KB、看门狗 + 模拟比较器。
引脚定义
下面这张引脚分组图按功能把 DIP-28 / TQFP-32 / QFN-32 封装的引脚归堆,先看自己关心的功能落在哪一组,再查后面的逐脚表:
| 引脚 | 名称 | 功能与使用要点 |
|---|---|---|
| 1 | PC6/RESET | 复位脚,低有效;熔丝可配成 IO,但一旦配成 IO 就失去 ISP 高压之外的救砖手段 |
| 2–3 | PD0/PD1 | USART RXD/TXD——Arduino Uno 上连着 CH340,做串口实验注意避让 |
| 7/20 | VCC/AVCC | 数字/模拟电源;AVCC 即使不用 ADC 也必须接 VCC |
| 21 | AREF | ADC 参考电压,默认内部 1.1V/AVCC 可选,外部接参考时注意软件先选通 |
| 9–10 | XTAL1/XTAL2 | 外部晶振;内部 8MHz RC 精度 ±10%,串口场景务必用外部晶振 |
替代型号
| 型号 | 替换说明 |
|---|---|
| ATmega168P | Flash/SRAM 减半(16KB/1KB),引脚全兼容;程序放得下即可直替 |
| ATmega32U4 | 自带 USB 设备控制器(Leonardo 主控);TQFP-44 封装不同需改板 |
| STM32F030F4P6 | Cortex-M0 48MHz,性能更强价格更低;换架构,需重写代码与工具链 |
| CH32V003F4P6 | RISC-V 0.1 美元级,TSSOP-20;换架构重写代码,极致低成本场景 |
国产替代对照
| 型号 | 厂商 | 兼容性与注意事项 |
|---|---|---|
| CH32V003 | 沁恒 | RISC-V 架构非 AVR 兼容,需重写代码;约 0.1 美元级 |
| CW32F030 | 武汉芯源 | Cortex-M0+,需重写代码 |
| HK32F030 | 航顺 | Cortex-M0,需重写代码 |
独家增量:Arduino 光环之下最容易踩的三个坑
这颗料因为 Arduino Uno 成了全世界最普及的 8 位机,但「Uno 上能用」不等于「你的板子上能用」,三个坑按踩中率排序。第一,内部 RC 振荡器跑串口必翻车:出厂默认 1MHz(8MHz/8 分频熔丝)且精度 ±10%,115200 下误差直接飞出接收端容忍窗,串口场景必须烧熔丝切外部 16MHz 晶振——很多「自做最小系统串口乱码」最后都查到这里。第二,2KB SRAM 是硬天花板:Serial.print 里一串字符串字面量默认占 SRAM(要 F() 宏才放 Flash),Uno 程序「跑着跑着莫名重启」十有八九是栈撞上堆。第三,RESET 熔丝自锁:把 RSTDISBL 熔丝烧掉换第 24 个 IO 是常见骚操作,但烧完 ISP 就进不去了,只能高压并行编程器救——量产前别碰。
依据:ATmega328P Datasheet §9 时钟精度、§24 USART 波特率发生器、§28 熔丝位;AVR 社区(AVRFreaks/Arduino Forum)高频故障贴统计。
实测小实验:XSim 复现 USART 波特率发生器:115200 档 U2X 开/关实测
实验设计:用 Vivado Simulator(XSim 2017.4,Windows 实跑)写 Verilog 行为模型,直接复现 ATmega328P 的 USART 波特率发生器硬件——16MHz 主频、UBRR 整数分频,U2X=0 时 16 倍过采样、U2X=1 时 8 倍。testbench 按 datasheet 公式取整 UBRR(115200 档:U2X=0 取 8、U2X=1 取 16),在仿真里实量 64 个 bit 的平均位宽,反推实际波特率与误差。
XSim 实测:U2X=0 时实际波特率 111111.1,误差 −3.549%——VERDICT 行直接判出 ±2% 窗口;开 U2X=1 后实际 117647.1,误差收缩到 +2.124%,压在可用区边缘。这组数字与 datasheet 误差表(−3.5% / +2.1%)逐位吻合——仿真复现的是分频器硬件行为本身,不是把公式重算一遍。低速档(9600–38400)分频比大、取整误差被摊薄到 0.2% 以内,两种模式都闭眼可用。
实验结论:16MHz 的 ATmega328P 跑 115200 必须开 U2X(UCSR0A |= (1<<U2X0)),否则 −3.5% 的自身误差再叠加对端误差必然乱码——Arduino 社区所有「Uno 上 115200 不稳」的帖子最后都指向这一位。要更高 baud(230400+)16MHz 整数分频物理上给不出,换 14.7456MHz 的「波特率友好晶振」才是正解。
代码获取:本实验的完整代码与实测输出在公开仓库 derekzhuo/geek-doc.cn 的
experiments/chip-ref-atmega328p/目录,克隆后按 README 一条命令复现。
实验环境
- 机器/系统:Windows 11 工作站
- 工具版本:Vivado Simulator 2017.4(xvlog/xelab/xsim 批处理链)
- 日期:2026-10-25
- 完整命令:
xvlog tb_*.v && xelab -debug typical tb -s sim && xsim sim -R(见仓库 run.bat)
参考来源
- Microchip ATmega328P Datasheet (40001906)
- ATmega328P Errata & Data Sheet Clarification
- Arduino Uno R3 原理图(16MHz 时钟树参考实现)