Код STM32 успешно загружен, но не запускается
Я новичок в STM32 и следовал приведенным здесь инструкциям, чтобы запрограммировать свою первую плату stm32f103c8t6 в Ubuntu.
Вот код, который я добавил в исходный код:
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))
Тем не менее, светодиод не начинает мигать, как ожидалось. Светодиод работает нормально, когда я подключаю его к 5 вольт. Я проверил контакты платы по измерителю AVO, и все они подключены к микроконтроллеру.
После нескольких исследований я подумал, что это как-то связано с Boot0
а также Boot1
булавки, поэтому я попробовал разные варианты отсюда, но ни один из них не сработал.
Вот изображение моей доски:
Как я могу это исправить?
4 ответа
Я полагаю, что функция HAL_Delay использует systick для подсчета времени в мс, для получения правильной задержки systick необходимо установить значение 1 мс, вы это настроили? Я не уверен, как ты это делаешь.
Если время между переключателями вывода очень мало, выход не будет переключаться, поскольку вы устанавливаете GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;, попробуйте GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; затем вы можете использовать осциллограф, чтобы проверить, переключается ли он.
Если у вас нет под рукой осциллографа, вы можете попытаться вставить цикл "пока" в сторону большего числа вместо функции HAL_Delay.
Counter=0;
while (Counter<500000000)
{
Counter++;
}
Предполагая, что ваша тактовая частота установлена на 72 МГц, это даст время в диапазоне от 0,5 до 1 сек. Не забудьте объявить переменную как 32-разрядное целое число или выше, например, uint32_t counter = 0; Если это не сработает, установите точку останова на линии HAL_GPIO_Togglepin, затем она остановится на линии точки останова, и каждый раз, когда вы нажимаете "RUN", она должна снова запускаться до точки останова, и выход должен переключаться.
Я имел дело с той же проблемой в течение недели. работала простая программа для мигания светодиода в среде arduino с помощью stm32f103c8t6, комбинация stm32f103c8t6, stm32CubeMX, gcc-arm для ubuntu (версия gcc-arm-none-eabi:15:6.3.1+svn253039-1build1) и ubuntu 18.04 нет. После того, как я установил GNU Embedded Toolchain для Arm, все стало работать. GNU Arm Embedded Toolchain версии 8-2018-q4-major Linux 64 решил мою проблему.
Ваш код должен работать, но вы только переключаете неподключенный вывод микросхемы.
Если вы посмотрите на схему с домашней страницы "Черная таблетка", светодиод подключен к PB12.
Контакт BOOT0 должен быть подключен к GND, если вы хотите запустить прошивку (с флэш-памяти), контакт BOOT1 не имеет значения.
Одна вещь на вашем изображении: у вас нет резистора для вашего светодиода для ограничения тока, в зависимости от типа светодиода это может повредить светодиод и / или вывод микроконтроллера.
Возможно, вам следует сначала попробовать использовать D2 с платы, и если это сработает, вы можете переключиться на включенный светодиод.
Я не знаю, правильно ли вы сделали инициализацию булавки:
Настройка 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);
Включение часов очень важно для каждого периферийного устройства.
У меня была та же проблема, и я решил ее, подключив контакт BOOT0 к земле...