我只想给你一个LED闪烁的例子(1 / 1000毫秒)。我的微控制器是ATmega328P,我使用的是Atmel Studio。
状态1:如果我没有定义F_CPU
,发光二极管闪烁就是真。我使用的是默认熔丝设置(内部振荡器和CKDIV8=programmed)。
状态2:如果我定义F_CPU 8000000UL
,发光二极管闪烁速度慢8倍,并且再次使用默认熔丝设置(内部振荡器和CKDIV8=programmed)。
我在1.state和2.state中都没有使用外部晶体。和相同的保险丝设置。为什么我会看到这个结果?为什么要慢8倍?
问题2:有些库需要UART值,比如F_CPU
。我不使用外部振荡器。我应该在这个值中写什么?
发布于 2018-12-14 21:17:09
F_CPU应反映单片机设定的中央处理器时钟速度。它并不关心速度是不是因为它使用了外部时钟而设置,或者它是否是内部时钟,或者设置了什么div值。
因此,需要设置CPU值以反映F_CPU时钟配置为什么值。
根据atmega328p的数据表,未编程的设备在出厂时带有内部RC振荡器on,因此在这种情况下的DIV8时钟应为8 MHz /8=1 MHz
因此,如果您将F_CPU设置为8000000,那么任何使用F_CPU的代码都会认为它的运行速度是8 MHZ,而不是实际运行的the1 MHZ。
https://stackoverflow.com/questions/53779165
复制相似问题