STM32代码上传成功但不运行

Posted

技术标签:

【中文标题】STM32代码上传成功但不运行【英文标题】:STM32 code uploads successfully but doesn't run 【发布时间】:2018-11-30 09:10:32 【问题描述】:

我是 STM32 新手,我按照说明 here 在 Ubuntu 中编写我的第一块 stm32f103c8t6 板。

这是我添加到源代码中的代码:

int main(void)

  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration----------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  /* USER CODE BEGIN 2 */

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  

  /* USER CODE END WHILE */

  /* USER CODE BEGIN 3 */
   HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_0);
   HAL_Delay(500);

  
  /* USER CODE END 3 */


当然,我在STM32CubeMX 中将PA0 端口设置为GPIO_output。 这是函数MX_GPIO_Init的输出:

static void MX_GPIO_Init(void)


  GPIO_InitTypeDef GPIO_InitStruct;

  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOA_CLK_ENABLE();

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET);

  /*Configure GPIO pin : PA0 */
  GPIO_InitStruct.Pin = GPIO_PIN_0;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);


代码构建成功并上传到开发板。以下是用于构建和上传代码的重新构建代码的输出:

-------------- Clean: Release in sample1 (compiler: GNU GCC Compiler for ARM)---------------

Executing clean command: make -f Makefile cleanRelease
rm -fR .dep build
Cleaned "sample1 - Release"

-------------- Build: Release in sample1 (compiler: GNU GCC Compiler for ARM)---------------

Checking if target is up-to-date: make -q -f Makefile Release
Running command: make -f Makefile Release
mkdir -p build      
C. Compiling build/system_stm32f1xx.o...
C. Compiling build/stm32f1xx_hal.o...
C. Compiling build/stm32f1xx_hal_cortex.o...
C. Compiling build/stm32f1xx_hal_dma.o...
C. Compiling build/stm32f1xx_hal_flash.o...
C. Compiling build/stm32f1xx_hal_flash_ex.o...
C. Compiling build/stm32f1xx_hal_gpio.o...
C. Compiling build/stm32f1xx_hal_gpio_ex.o...
C. Compiling build/stm32f1xx_hal_pwr.o...
C. Compiling build/stm32f1xx_hal_rcc.o...
C. Compiling build/stm32f1xx_hal_rcc_ex.o...
C. Compiling build/stm32f1xx_hal_tim.o...
C. Compiling build/stm32f1xx_hal_tim_ex.o...
C. Compiling build/main.o...
C. Compiling build/stm32f1xx_hal_msp.o...
C. Compiling build/stm32f1xx_it.o...
S. Compiling build/startup_stm32f103xb.o...
2018-06-21T10:32:46 INFO usb.c: -- exit_dfu_mode
C. Linking build/sample1.elf...
/usr/bin/arm-none-eabi-size build/sample1.elf
   text    data     bss     dec     hex filename
   3560      20    1572    5152    1420 build/sample1.elf
H. Linking build/sample1.hex...
B. Building build/sample1.bin...
Used gcc: 6.3.1
/usr/local/bin/st-flash erase
2018-06-21T10:32:46 INFO common.c: Loading device parameters....
2018-06-21T10:32:46 INFO common.c: Device connected is: F1 Medium-density device, id 0x20036410
2018-06-21T10:32:46 INFO common.c: SRAM size: 0x5000 bytes (20 KiB), Flash: 0x10000 bytes (64 KiB) in pages of 1024 bytes
2018-06-21T10:32:46 INFO common.c: Loading device parameters....
2018-06-21T10:32:46 INFO common.c: Device connected is: F1 Medium-density device, id 0x20036410
2018-06-21T10:32:46 INFO common.c: SRAM size: 0x5000 bytes (20 KiB), Flash: 0x10000 bytes (64 KiB) in pages of 1024 bytes
st-flash 1.4.0-39-g6db0fc2
Mass erasing
/usr/local/bin/st-flash --reset write build/sample1.bin 0x8000000
2018-06-21T10:32:46 INFO common.c: Attempting to write 3580 (0xdfc) bytes to stm32 address: 134217728 (0x8000000)
st-flash 1.4.0-39-g6db0fc2
Flash page at addr: 0x08000000 erased
Flash page at addr: 0x08000400 erased
Flash page at addr: 0x08000800 erased
2018-06-21T10:32:46 INFO common.c: Finished erasing 4 pages of 1024 (0x400) bytes
2018-06-21T10:32:46 INFO common.c: Starting Flash write for VL/F0/F3/F1_XL core id
2018-06-21T10:32:46 INFO flash_loader.c: Successfully loaded flash loader in sram
Flash page at addr: 0x08000c00 erased
  1/4 pages written
  2/4 pages written
2018-06-21T10:32:46 INFO common.c: Starting verification of write complete
2018-06-21T10:32:46 INFO common.c: Flash written and verified! jolly good!
  3/4 pages written
  4/4 pages written
Process terminated with status 0 (0 minute(s), 1 second(s))
0 error(s), 0 warning(s) (0 minute(s), 1 second(s))

但是,LED 没有按预期开始闪烁。当我将它连接到 5 伏时,LED 工作正常。我用 AVO 表检查了板子的引脚,它们都连接到微控制器。

经过一些研究,我认为它与Boot0Boot1 引脚有关,所以我尝试了与here 不同的选项,但没有一个有效。

这是我的板子的图片:

我该如何解决?

【问题讨论】:

您确定您为正确的 mcu/board 配置了 Cube 吗?并且PA0对应LED的引脚?也许您还可以查看函数 MX_GPIO_Init 以确保生成的代码是预期的。你能把你的板子的链接放上去吗? 是的,我正在使用 STM32F103C8Tx 库。我在问题中添加了MX_GPIO_Init 内容。这是我的板的链接:wiki.stm32duino.com/index.php?title=Black_Pill GPIO输出的电流够大吗?我看到你正在使用 NOPULL 模式。也许试试 GPIO_PULLUP ?如果您有逻辑分析仪或电压表,请尝试将 GPIO 长时间置于高电平和低电平以检查它是否真的在变化 @Stoogy 我试过GPIO_InitStruct.Pull = GPIO_PULLUP;我已经设置了2秒的延迟,但似乎PA0的电压没有变化。它与 B0-、B0+、B1-、B1+ 引脚有什么关系吗? 如果您将端口切换为推/拉,则上拉/下拉无关紧要。 PP 驱动器比弱上拉或下拉电阻强得多 【参考方案1】:

我遇到了同样的问题,我通过将 BOOT0 引脚接地解决了这个问题...

【讨论】:

您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。【参考方案2】:

我一个星期都在处理同样的问题。使用 stm32f103c8t6 在 arduino 环境中闪烁 LED 二极管的简单程序正在运行,stm32f103c8t6、stm32CubeMX、ubuntu 的 gcc-arm(gcc-arm-none-eabi 版本:15:6.3.1+svn253039-1build1)和 ubuntu 的组合18.04 没有。 在我为 Arm 安装了GNU Embedded Toolchain 之后,事情就开始起作用了。 GNU Arm Embedded Toolchain Version 8-2018-q4-major Linux 64 解决了我的问题。

【讨论】:

【参考方案3】:

我相信 HAL_Delay 函数使用 systick 以毫秒为单位计算时间,必须将 systick 设置为 1ms 才能获得正确的延迟,你配置了吗? 我不知道你是怎么做到的。

如果输出切换之间的时间非常短,则输出不会切换,因为您设置了 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;,尝试 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH >;然后你可以用示波器检查它是否切换。

如果您手头没有示波器,您可以尝试插入一个“while 循环”计数到一个高数,而不是 HAL_Delay 函数。

Counter=0;            
while (Counter<500000000)
  
  Counter++;
  

假设您的时钟频率设置为 72MHz,这将给出 0.5 到 1 秒范围内的时间。 请记住将变量声明为 32 位或更高的整数,例如uint32_t 计数器 = 0; 如果它不起作用,在 HAL_GPIO_Togglepin 行设置一个断点,然后它会在断点行暂停,每次单击“运行”时,它应该再次运行到断点并切换输出。

【讨论】:

实际上,我会先尝试设置/重置输出引脚,只是为了验证它是否有效。试试:HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_RESET);和 HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_SET);一个会打开 LED,另一个会关闭,具体取决于 LED 的连接方式。【参考方案4】:

您的代码应该可以工作,但您只是切换了一个未连接的 µC 引脚。

如果您查看“黑色药丸”主页上的示意图,LED 连接到 PB12

如果您想(从闪存)运行固件,BOOT0 引脚应该连接到 GND,BOOT1 引脚无关紧要。

您的图像中有一点:您的 LED 没有电阻器来限制电流,这取决于 LED 类型,这可能会损坏 LED 和/或 µC 引脚。

也许您应该首先尝试使用板上的 D2,如果可行,您可以切换到您的 LED。

不知道你是否正确初始化了pin:

PB12 设置

GPIO_InitTypeDef GPIO_InitStruct;

/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOB_CLK_ENABLE();

/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_RESET);

/*Configure GPIO pin : PB12 */
GPIO_InitStruct.Pin = GPIO_PIN_12;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

时钟使能对于每个外设都非常重要。

【讨论】:

我认为您在谈论板上的 LED,但在我的场景中,我已将外部 LED(在照片中可见)连接到板上 你说得对,我试过 D2,但它似乎也不起作用。这是我为 D2 添加的代码:首先在 main 方法中将 PB12 设置为 GPIO_Output 和 HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_12); HAL_Delay(500); 我的 PB12 设置和你写的一样。这个其实不是我自己写的,是STM32CubeMX生成的

以上是关于STM32代码上传成功但不运行的主要内容,如果未能解决你的问题,请参考以下文章

如何修复 STM32CubeProgrammer 找不到 STM32 目标

3-STM32+ESP8266连接onenet上传数据+远程控制(MQTT)

STM32+ESP8266+MQTT协议上传云平台(OneNET)

STM32 引导加载程序

2-STM32+ESP8266连接onenet并上传数据(HTTP)

基于STM32单片机的LwIP协议LwIP 的TCP_client 上传数据温度电压数据到网络调试助手