gpt4 book ai didi

c - 我的 arm-none-eabi-gcc 在 stm32 上的项目有什么问题?

转载 作者:行者123 更新时间:2023-12-02 20:49:39 31 4
gpt4 key购买 nike

我只想从头开始使用 arm-none-eabi-gcc 在 c 中处理 stm32 编程,并且只使用寄存器,而不是驱动程序!将 PortC.8 设置为 1 并打开 stm32f1 发现板上的 LED 的代码非常简单。我正在通过这个脚本编译:

arm-none-eabi-gcc --specs=nosys.specs -T *.ld -o main.elf main.c system_*.c  *.s

并且 main.elf 文件已成功制作...但无法正常工作!!!并且 LED 熄灭。

目录中的文件是:

core_cm3.c
core_cm3.h
main.c
main.elf
startup_stm32f100xb.s
STM32F100RBTx_FLASH.ld
stm32f10x.h
system_stm32f10x.c
system_stm32f10x.h

ST官网下载的STM32F10x_StdPeriph_Lib_V3.5.0文件夹下的所有文件。

主.c:

#include "stm32f10x.h"
void EnableClock(void);
void InitPort(void);
int main(void)
{
EnableClock();
InitPort();

}

void EnableClock(void)
{
//Enable HSI
RCC->CR |= (uint32_t)(0x00000001);
//APB2 Prescalar to 1(HCLK not devided)
RCC->CFGR &= (uint32_t)(0xFFFFFF0F);
//APB2 GPIOC Enable
RCC->APB2ENR |= (uint32_t)(0x00000010);
}

void InitPort(void)
{
//PORTC Bit 8 set as output max speed 2MHz GPIOC_CRH->Mode8
//PORTC Bit 8 set as Push Pull
GPIOC->CRH &= (uint32_t)(0x00000002);
GPIOC->ODR |= (uint32_t)(0x00000100);
}

我不知道问题出在哪里..任何人都可以帮助我吗??

最佳答案

您的 main() 终止。接下来会发生什么取决于 startup_stm32f100xb.s 中 __main 调用之后的内容;可能是强制重置或无限循环(直到看门狗重置,如果启用)。

在嵌入式系统中,main() 返回是不正常的。

启用 HSI”可能是不必要的,甚至是不正确的。默认情况下,核心时钟是 HSI - 必须已经为要执行的代码建立时钟,启用 HSI 将无效,或者禁用先前建立的时钟,系统时钟将在system_stm32f10x.c,如果您有特定的时钟要求,您需要修改它以适合您的电路板和/或应用程序。直接使用 HSI 允许 8MHz 的操作,将其馈送到 PLL 支持高达 64MHz,当 PLL 从外部 4-16MHz 振荡器 (HSE) 馈入时,芯片将以高达 72MHz 的频率运行。

如果您没有在 system_stm32f10x.c 中正确建立时钟(或让它运行 HSI-direct),那么执行可能会在 system_stm32f10x.c 等待的 SystemInit() 中停止用于 PLL 锁定,或者如果你真的错了,根本就没有运行。

要在电路板启动级别处理任何裸机处理器,理想情况下您应该拥有一个硬件调试器 (JTAG/SWI),这样您就可以使用工具链的调试器来准确确定您的代码在做什么以及它倒下的地方。您至少可以确定它是否甚至运行到 main() - 在 main() 运行之前,startup_stm32f100xb.s 和 system_stm32f10x.c 实现了重要的初始化.后者通常需要修改以适合您的目标。

关于c - 我的 arm-none-eabi-gcc 在 stm32 上的项目有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42733717/

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