我正在为ATmega168微控制器设置UART。我的第一个代码不起作用。在检查时,我遇到了在工作程序中使用的头文件。它使用预处理程序指令。
这对我来说很混乱,所以我决定在c编译器中运行它并检查输出。
#include <stdio.h>
#define F_CPU 1000000UL
#ifndef BAUD /* if not defined in Makefile... */
#define BAUD 9600 /* set a safe default baud rate */
#endif
#define BAUD_TOL 2
#define UBRR_VALUE (((F_CPU) + 8UL * (BAUD)) / (16UL * (BAUD)) -1UL)
#if 100 * (F_CPU) > (16 * ((UBRR_VALUE) + 1)) * (100 * (BAUD) + (BAUD) * (BAUD_TOL))
#define USE_2X 1
#define TEST 1
#elif 100 * (F_CPU) < (16 * ((UBRR_VALUE) + 1)) * (100 * (BAUD) - (BAUD) * (BAUD_TOL))
#define USE_2X 1
#define TEST 11
#else
#define USE_2X 0
#define TEST 111
#endif
int main(void) {
printf("UBRR_VALUE: %ld\n", UBRR_VALUE);
printf("USE_2X: %d\n", USE_2X);
printf("%ld\n", (16 * ((UBRR_VALUE) + 1)) * (100 * (BAUD) - (BAUD) * (BAUD_TOL)));
printf("F_CPU * 100 = %ld\n", (100*F_CPU));
printf("TEST = %d\n", TEST);
return 0;
}
输出:
UBRR_VALUE: 6
USE_2X: 1
105369600
F_CPU * 100 = 100000000
TEST = 11
由于100 * F_CPU
小于(16 * ((UBRR_VALUE) + 1)) * (100 * (BAUD) - (BAUD) * (BAUD_TOL))
,因此TEST
被赋值为11。
但是我将F_CPU
更改为16000000UL
:
UBRR_VALUE: 103
USE_2X: 0
1565491200
F_CPU * 100 = 1600000000
TEST = 111
这里的100 * F_CPU
也小于(16 * ((UBRR_VALUE) + 1)) * (100 * (BAUD) - (BAUD) * (BAUD_TOL))
。
但是TEST
是111吗?
编辑:*此处100 * F_CPU
大于(16 * ((UBRR_VALUE) + 1)) * (100 * (BAUD) - (BAUD) * (BAUD_TOL))
答案 0 :(得分:2)
按如下说明扩展宏:
对于第二种情况,F_CPU
至16000000UL
(值较大)
100 * (F_CPU) > (16 * ((UBRR_VALUE) + 1)) * (100 * (BAUD) + (BAUD) * (BAUD_TOL))
评估为0x5f5e1000 > 0x611e8000
,这是错误的
100 * (F_CPU) < (16 * ((UBRR_VALUE) + 1)) * (100 * (BAUD) - (BAUD) * (BAUD_TOL))
评估为0x5f5e1000 < 0x5d4f8000
,这也是错误的。
因此以下宏适用:
#define USE_2X 0
#define TEST 111