gpt4 book ai didi

embedded - 为什么我必须一次启用一个外设时钟?

转载 作者:行者123 更新时间:2023-12-04 12:21:17 24 4
gpt4 key购买 nike

在我编写的将字符写入 USART1 的最小 STM32 应用程序中,当我尝试同时启用我需要的所有时钟时,USART 似乎不起作用:

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA
| RCC_APB2Periph_AFIO
| RCC_APB2Periph_USART1, ENABLE);

但是当我一次启用一个时钟时,它可以工作:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,  ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);

为什么是这样?是否有特定的顺序必须启用这些时钟? (如果是这样,这是在哪里记录的?)

(我已经省略了此后初始化 GPIO 引脚、设置 USART 并开始发送内容的所有代码,因为它在每个应用程序中都是相同的。如果相关,请告诉我,我会包括在内。)

我使用的设备是 STM32F103VET6。

由于对所涉及的程序集有一些兴趣,所以在这里。同时为所有三个时钟:
00000000 <main>:
0: b590 push {r4, r7, lr}
2: b089 sub sp, #36 ; 0x24
4: af00 add r7, sp, #0
6: f244 0014 movw r0, #16389 ; 0x4005
a: 2101 movs r1, #1
c: f7ff fffe bl 0 <RCC_APB2PeriphClockCmd>

一次一个时钟:
00000000 <main>:
0: b590 push {r4, r7, lr}
2: b089 sub sp, #36 ; 0x24
4: af00 add r7, sp, #0
6: 2004 movs r0, #4
8: 2101 movs r1, #1
a: f7ff fffe bl 0 <RCC_APB2PeriphClockCmd>
e: 2001 movs r0, #1
10: 2101 movs r1, #1
12: f7ff fffe bl 0 <RCC_APB2PeriphClockCmd>
16: f44f 4080 mov.w r0, #16384 ; 0x4000
1a: 2101 movs r1, #1
1c: f7ff fffe bl 0 <RCC_APB2PeriphClockCmd>
...

这是 RCC_APB2PeriphClockCmd :
00000000 <RCC_APB2PeriphClockCmd>:
0: 4b04 ldr r3, [pc, #16] ; (14 <RCC_APB2PeriphClockCmd+0x14>)
2: 699a ldr r2, [r3, #24]
4: b109 cbz r1, a <RCC_APB2PeriphClockCmd+0xa>
6: 4310 orrs r0, r2
8: e001 b.n e <RCC_APB2PeriphClockCmd+0xe>
a: ea22 0000 bic.w r0, r2, r0
e: 6198 str r0, [r3, #24]
10: 4770 bx lr
12: bf00 nop
14: 40021000 .word 0x40021000
0x40021000是 RCC 外设的基地址; #24偏移量指向 RCC_APB2ENR寄存器,每个启用的时钟都有一个位。 (有关详细信息,请参阅 RM0008 的第 109 页。)

最佳答案

好吧,我想我想通了,结果证明根本不是硬件问题……我的工具链配置有很多问题:

  • 我在设置 -nostdlib .这导致无法生成一些全局初始化代码。我不确定这有多重要,但其他问题包括:
  • 我没有路过-mthumb和链接器的其他 CPU 选项。这导致一些生成的启动代码是垃圾。
  • 我的启动文件不包含对 __libc_init_array 的调用.这导致更多的初始化代码在链接时被丢弃。

  • 我仍然不确定为什么拆分外围时钟初始化设法解决这个问题。也许代码量的变化会影响到正确的对齐方式?无论如何,到目前为止,解决潜在问题似乎已经解决了一些问题(尽管我仍然对一些剩余的启动代码持怀疑态度)。

    关于embedded - 为什么我必须一次启用一个外设时钟?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22432520/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com