你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

新手求助,STM32F103C8T6最小系统板,为何程序执行到0.425秒就从头开始?

[复制链接]
gxcgxcgxc 提问时间:2023-4-30 15:05 / 未解决

新手求助。

STM32F103C8T6最小系统板,使用stmubeide编写程序,系统时钟配置72M,配置了一个GPIO用来控制LED灯。用了三种方式进行延时(1.for 循环 2.hal 延时函数 3.定时器 延时)控制led亮灭,无论哪种方式,从示波器上看,0.425秒以内程序还能正常运行,一到0.425秒,程序就从头开始开始执行了。

就配置了时钟,GPIO和定时器1,其余没有配置。

不知是哪里出了问题,请教各位大神!

以下是main.c 内容:

/ USER CODE BEGIN Header / /**


  • @file : main.c
  • @brief : Main program body

  • @attention
  • Copyright (c) 2023 STMicroelectronics.
  • All rights reserved.
  • This software is licensed under terms that can be found in the LICENSE file
  • in the root directory of this software component.
  • If no LICENSE file comes with this software, it is provided AS-IS.

/ / USER CODE END Header / / Includes ------------------------------------------------------------------*/

include "main.h"

/ Private includes ----------------------------------------------------------/ / USER CODE BEGIN Includes /

/ USER CODE END Includes /

/ Private typedef -----------------------------------------------------------/ / USER CODE BEGIN PTD /

/ USER CODE END PTD /

/ Private define ------------------------------------------------------------/ / USER CODE BEGIN PD /

/ USER CODE END PD /

/ Private macro -------------------------------------------------------------/ / USER CODE BEGIN PM /

/ USER CODE END PM /

/ Private variables ---------------------------------------------------------/ TIM_HandleTypeDef htim1;

/ USER CODE BEGIN PV /

/ USER CODE END PV /

/ Private function prototypes -----------------------------------------------/ void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_TIM1_Init(void); / USER CODE BEGIN PFP /

/ USER CODE END PFP /

/ Private user code ---------------------------------------------------------/ / USER CODE BEGIN 0 /

/ USER CODE END 0 /

/**

  • @brief The application entry point.
  • @retval int / 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(); MX_TIM1_Init(); / USER CODE BEGIN 2 /

void HAL_Delay_us(uint16_t us) { uint16_t counter = 0; HAL_TIM_SetAutoreload(&htim1, us); //设置定时器自动加载值 HAL_TIM_SetCounter(&htim1, counter); //设置定时器初始值 HAL_TIM_Base_Start(&htim1); //启动定时器

while(counter != us) //直到定时器计数从0计数到us结束循环,刚好是所需要的时间 { counter = __HAL_TIM_GetCounter(&htim1); // 获取定时器当前计数 } HAL_TIM_Base_Stop(&htim1); // 停止定时器 }

void HAL_Delay_ms(uint16_t ms) { for (int i = 0; i < ms; i++) HAL_Delay_us(1000); }

void delay(int ms) { for(int i = 0; i < ms; i++) for(int j = 0; j < 1000; j++); }

/ USER CODE END 2 /

/ Infinite loop / / USER CODE BEGIN WHILE / int a = 0; while (1) { // HAL_Delay(100);

// delay(1000); // // a %= 3; // // switch(a++) // { // case 0 : HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin); break; // case 1 : HAL_GPIO_TogglePin(LED2_GPIO_Port,LED2_Pin); break; // case 2 : HAL_GPIO_TogglePin(LED3_GPIO_Port,LED3_Pin); break; // default: break; // } HAL_Delay_ms(300); // a += 1; // a++; // if (a == 3) // { // a = 0; // } HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin); HAL_GPIO_TogglePin(LED2_GPIO_Port,LED2_Pin); HAL_GPIO_TogglePin(LED3_GPIO_Port,LED3_Pin); // HAL_Delay(300); // HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin , GPIO_PIN_SET); // HAL_GPIO_WritePin(LED2_GPIO_Port,LED2_Pin , GPIO_PIN_SET); // HAL_GPIO_WritePin(LED3_GPIO_Port,LED3_Pin , GPIO_PIN_SET); // HAL_Delay(300); // HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_RESET); // HAL_GPIO_WritePin(LED2_GPIO_Port,LED2_Pin , GPIO_PIN_SET); // HAL_GPIO_WritePin(LED3_GPIO_Port,LED3_Pin , GPIO_PIN_SET);

/ USER CODE END WHILE /

/ USER CODE BEGIN 3 / } / USER CODE END 3 / }

/**

  • @brief System Clock Configuration
  • @retval None */ void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

/** Initializes the RCC Oscillators according to the specified parameters

  • in the RCC_OscInitTypeDef structure. */ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; RCC_OscInitStruct.HSEState = RCC_HSE_ON; RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1; RCC_OscInitStruct.HSIState = RCC_HSI_ON; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { Error_Handler(); }

/* Initializes the CPU, AHB and APB buses clocks / RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) { Error_Handler(); } }

/**

  • @brief TIM1 Initialization Function
  • @param None
  • @retval None */ static void MX_TIM1_Init(void) {

/ USER CODE BEGIN TIM1_Init 0 /

/ USER CODE END TIM1_Init 0 /

TIM_ClockConfigTypeDef sClockSourceConfig = {0}; TIM_MasterConfigTypeDef sMasterConfig = {0};

/ USER CODE BEGIN TIM1_Init 1 /

/ USER CODE END TIM1_Init 1 / htim1.Instance = TIM1; htim1.Init.Prescaler = 71; htim1.Init.CounterMode = TIM_COUNTERMODE_UP; htim1.Init.Period = 0; htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim1.Init.RepetitionCounter = 0; htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; if (HAL_TIM_Base_Init(&htim1) != HAL_OK) { Error_Handler(); } sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; if (HAL_TIM_ConfigClockSource(&htim1, &sClockSourceConfig) != HAL_OK) { Error_Handler(); } sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK) { Error_Handler(); } / USER CODE BEGIN TIM1_Init 2 /

/ USER CODE END TIM1_Init 2 /

}

/**

  • @brief GPIO Initialization Function
  • @param None
  • @retval None / static void MX_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; / USER CODE BEGIN MX_GPIO_Init_1 / / USER CODE END MX_GPIO_Init_1 */

/ GPIO Ports Clock Enable / HAL_RCC_GPIOD_CLK_ENABLE(); HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_GPIOB_CLK_ENABLE();

/Configure GPIO pin Output Level / HAL_GPIO_WritePin(GPIOA, LED2_Pin|LED3_Pin, GPIO_PIN_RESET);

/Configure GPIO pin Output Level / HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_RESET);

/Configure GPIO pins : LED2_Pin LED3_Pin / GPIO_InitStruct.Pin = LED2_Pin|LED3_Pin; 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);

/Configure GPIO pin : LED1_Pin / GPIO_InitStruct.Pin = LED1_Pin; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(LED1_GPIO_Port, &GPIO_InitStruct);

/ USER CODE BEGIN MX_GPIO_Init_2 / / USER CODE END MX_GPIO_Init_2 / }

/ USER CODE BEGIN 4 /

/ USER CODE END 4 /

/**

  • @brief This function is executed in case of error occurrence.
  • @retval None / void Error_Handler(void) { / USER CODE BEGIN Error_Handler_Debug / / User can add his own implementation to report the HAL error return state / __disable_irq(); while (1) { } / USER CODE END Error_Handler_Debug */ }

ifdef USE_FULL_ASSERT

/**

  • @brief Reports the name of the source file and the source line number
  • where the assert_param error has occurred.
    • @param file: pointer to the source file name
    • @param line: assert_param error line source number
    • @retval None / void assert_failed(uint8_t file, uint32_t line) { / USER CODE BEGIN 6 / / User can add his own implementation to report the file name and line number, ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) / / USER CODE END 6 / }

      endif / USE_FULL_ASSERT /

收藏 评论7 发布时间:2023-4-30 15:05

举报

7个回答
wenyangzeng 回答时间:2023-4-30 16:52:41

看不到main()主函数和主函数内的while();这样运行一次当然就跑飞了。

gxcgxcgxc 回答时间:2023-5-3 09:17:31

wenyangzeng 发表于 2023-4-30 16:52
看不到main()主函数和主函数内的while();这样运行一次当然就跑飞了。

有的,复制的格式不太好看,main()和while(1)都在

gxcgxcgxc 回答时间:2023-5-3 09:18:24

wenyangzeng 发表于 2023-4-30 16:52
看不到main()主函数和主函数内的while();这样运行一次当然就跑飞了。

  • @retval int / int main(void) { / USER CODE BEGIN 1 */
gxcgxcgxc 回答时间:2023-5-3 09:18:58

wenyangzeng 发表于 2023-4-30 16:52
看不到main()主函数和主函数内的while();这样运行一次当然就跑飞了。

/ Infinite loop / / USER CODE BEGIN WHILE / int a = 0; while (1) { // HAL_Delay(100);

gxcgxcgxc 回答时间:2023-5-3 09:44:37

wenyangzeng 发表于 2023-4-30 16:52
看不到main()主函数和主函数内的while();这样运行一次当然就跑飞了。

串口烧录软件选项点了ramisp就会这样,去掉就正常运行了

xmshao 回答时间:2023-5-4 10:27:53
你看看是否启动了看门狗?另外,也看看是否代码运行触发什么异常了。
butterflyspring 回答时间:2023-5-4 10:37:30
检查一下optionbyte, 是不是设置了硬件启动看门狗位

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版