Atmel Mega 2560手册中第三个#define定义及括号用法疑问
Mega 2560 串口波特率宏定义问题解答
你贴出的代码存在排版错误,标准可编译的正确写法如下:
#define FOSC 1843200// Clock Speed #define BAUD 9600 #define MYUBRR (FOSC/16/BAUD-1)
MYUBRR 宏的作用
- 这个宏用来计算 Mega 2560 串口(USART)外设的波特率寄存器配置值,UBRR 本身就是 USART Baud Rate Register(串口波特率寄存器)的缩写。
- 这一计算逻辑完全遵循 Mega 2560 官方手册给出的异步串口正常模式波特率公式:
UBRR 配置值 = 系统时钟频率/(16 * 目标波特率) - 1,公式里的16是串口硬件默认的16倍过采样系数,用来提升串口通信的抗干扰能力。 - 计算得出的 MYUBRR 可以直接拆分高低位写入对应串口的 UBRRH 和 UBRRL 寄存器完成波特率配置,开发者不需要手动计算对应数值,修改时钟或波特率时只要调整前两个宏即可,不用修改计算逻辑。
括号的作用
你看到的把 MYUBRR 也包进括号的写法是排版错误,标准写法里括号只包裹整个计算表达式,这是C语言宏定义的通用安全规范:
- C语言的宏是纯文本替换,不会做语法语义解析,如果不给表达式加外层括号,替换到其他代码里时可能因为运算符优先级问题出现非预期的计算结果。举个实际例子:
如果你写代码int val = 2 * MYUBRR;- 没有外层括号的宏展开后是
2 * 1843200/16/9600 -1,按照C语言运算优先级会先算乘除再算减,得到结果23,和预期的2*(12-1)=22完全不符 - 加了外层括号的宏展开后是
2 * (1843200/16/9600 -1),运算顺序完全符合预期,不会出错。
- 没有外层括号的宏展开后是
内容的提问来源于stack exchange,提问作者Thom
相关产品推荐
相关产品推荐

