我是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仪表检查了主板的引脚,它们都已连接到微控制器。
经过一些研究,我认为它必须使用Boot0
和Boot1
引脚做些什么,因此我尝试了与here不同的选项,但是它们都不起作用。
这是我的董事会形象:
我该如何解决?
答案 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
如果要从闪存运行固件,则BOOT0引脚应连接到GND,而BOOT1引脚则无关紧要。
图像中的一件事:您的LED没有电阻来限制电流,具体取决于LED的类型,这可能会损坏LED和/或µC引脚。
也许您应该首先尝试使用开发板上的D2,如果可行,您可以切换到LED上。
我不知道您是否已经正确完成了引脚的初始化:
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);
时钟启用对于每个外设都很重要。