STM32代码成功上传但无法运行

时间:2018-06-21 06:23:44

标签: gcc arm stm32 stm32f1

我是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 */

}

当然,我在PA0中将GPIO_output端口设置为STM32CubeMX。 这是函数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并没有开始按预期闪烁。当我将其连接到5V时,LED可以正常工作。我已经通过AVO仪表检查了主板的引脚,它们都已连接到微控制器。

经过一些研究,我认为它必须使用Boot0Boot1引脚做些什么,因此我尝试了与here不同的选项,但是它们都不起作用。

这是我的董事会形象:

我该如何解决?

3 个答案:

答案 0 :(得分:1)

我相信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行上设置一个断点,然后它将在该断点行处暂停,并且每次单击“ RUN”时,它应再次运行到该断点,并且输出应切换。

答案 1 :(得分:1)

我正在处理一个星期的相同问题。一个简单的程序正在使用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嵌入式工具链版本8-2018-q4-主要Linux 64 解决了我的问题。

答案 2 :(得分:0)

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

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

enter image description here

如果要从闪存运行固件,则BOOT0引脚应连接到GND,而BOOT1引脚则无关紧要。

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

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

我不知道您是否已经正确完成了引脚的初始化:

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);

时钟启用对于每个外设都很重要。