三个可能的问题和解决方法:
大家完成之后回来看,每一种改错误都是一种成长,不要畏惧,要快乐,积极面对,要耐心对待
STMCuBeMX新建项目的两种匪夷所思的问题https://mp.csdn.net/mp_blog/creation/editor/142151511
STMCubeMX文件下载后会出现其他项目无法下载的问题https://mp.csdn.net/mp_blog/creation/editor/142152180
一、准备工作
1、配置好的STMCubeMX环境
2、stm32C8T6开发版一块,LED灯若干
3、下载器一个
二、操作步骤
1、新建项目
2、等待过程
3、选择芯片和MCU,开始一个新项目
4、配置管脚
可以看见,当右键选择某个管脚时,会出现这个管脚所拥有的功能。我们点灯就直接把需要的端口配备成 GPIO_Output 就可以
我选择了PA0、PA2、PA4三个端口,大家可以根据喜好选择端口
5、配备时钟
6、其他配置![](https://i-blog.csdnimg.cn/direct/29ef302edb874edb8b8ae3e33e4a8f70.png)
7、点击生成keil文件
8、keil文件相关操作
在箭头所指处加入以下代码
HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_0); //此处根据自己在CubeMx中设置的端口
HAL_Delay(500);
HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_2);
HAL_Delay(500);
HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_4);
HAL_Delay(500);
9、软件配置
①
②、选择自己的下载模式
③勾选箭头指向处
10、最后点击运行,并下载的单片机中,就可以实现闪烁功能了
三、main.c函数带注释
/* USER CODE BEGIN Header */
2/**
3 ******************************************************************************
4 * @file : main.c
5 * @brief : 主程序体
6 ******************************************************************************
7 * @attention
8 *
9 * 版权 (c) 2024 STMicroelectronics.
10 * 所有权利保留。
11 *
12 * 此软件按可以在该软件组件根目录中的LICENSE文件中找到的条款进行许可。
13 * 如果没有随此软件一起提供LICENSE文件,则按原样提供。
14 *
15 ******************************************************************************
16 */
17/* USER CODE END Header */
18/* Includes ------------------------------------------------------------------*/
19#include "main.h" // 包含主头文件
20
21/* Private includes ----------------------------------------------------------*/
22/* USER CODE BEGIN Includes */
23
24/* USER CODE END Includes */
25
26/* Private typedef -----------------------------------------------------------*/
27/* USER CODE BEGIN PTD */
28
29/* USER CODE END PTD */
30
31/* Private define ------------------------------------------------------------*/
32/* USER CODE BEGIN PD */
33/* USER CODE END PD */
34
35/* Private macro -------------------------------------------------------------*/
36/* USER CODE BEGIN PM */
37
38/* USER CODE END PM */
39
40/* Private variables ---------------------------------------------------------*/
41
42/* USER CODE BEGIN PV */
43
44/* USER CODE END PV */
45
46/* Private function prototypes -----------------------------------------------*/
47void SystemClock_Config(void); // 系统时钟配置函数声明
48static void MX_GPIO_Init(void); // GPIO初始化函数声明
49/* USER CODE BEGIN PFP */
50
51/* USER CODE END PFP */
52
53/* Private user code ---------------------------------------------------------*/
54/* USER CODE BEGIN 0 */
55
56/* USER CODE END 0 */
57
58/**
59 * @brief 应用程序入口点
60 * @retval int
61 */
62int main(void)
63{
64 /* USER CODE BEGIN 1 */
65 // 用户自定义代码开始
66 /* USER CODE END 1 */
67
68 /* MCU Configuration--------------------------------------------------------*/
69 /* 重置所有外设,初始化闪存接口和系统滴答定时器 */
70 HAL_Init();
71
72 /* USER CODE BEGIN Init */
73 // 用户自定义初始化代码
74 /* USER CODE END Init */
75
76 /* Configure the system clock */
77 SystemClock_Config(); // 配置系统时钟
78
79 /* USER CODE BEGIN SysInit */
80 // 用户自定义系统初始化代码
81 /* USER CODE END SysInit */
82
83 /* Initialize all configured peripherals */
84 MX_GPIO_Init(); // 初始化所有配置好的GPIO
85 /* USER CODE BEGIN 2 */
86 // 用户自定义代码开始
87 /* USER CODE END 2 */
88
89 /* Infinite loop */
90 /* USER CODE BEGIN WHILE */
91 while (1)
92 {
93 /* USER CODE END WHILE */
94
95 /* USER CODE BEGIN 3 */
96 HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_0); // 切换PA0引脚的状态
97 HAL_Delay(500); // 延时500毫秒
98 HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_2); // 切换PA2引脚的状态
99 HAL_Delay(500); // 再次延时500毫秒
100 HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_4); // 切换PA4引脚的状态
101 HAL_Delay(500); // 最后延时500毫秒
102 }
103 /* USER CODE END 3 */
104}
105
106/**
107 * @brief System Clock Configuration
108 * @retval None
109 */
110void SystemClock_Config(void)
111{
112 RCC_OscInitTypeDef RCC_OscInitStruct = {0}; // RCC振荡器初始化结构体
113 RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; // RCC时钟初始化结构体
114
115 /** 初始化RCC振荡器根据RCC_OscInitTypeDef结构体指定的参数
116 */
117 RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; // 选择HSI振荡器类型
118 RCC_OscInitStruct.HSIState = RCC_HSI_ON; // HSI振荡器开启
119 RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; // 设置默认的HSI校准值
120 RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; // PLL关闭
121 if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) // 配置RCC振荡器
122 {
123 Error_Handler(); // 如果配置失败则调用错误处理函数
124 }
125 /** 初始化CPU, AHB和APB总线时钟
126 */
127 RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; // 指定要配置的时钟类型
128 RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI; // 系统时钟源为HSI
129 RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; // AHB时钟除数为1
130 RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; // APB1时钟除数为1
131 RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; // APB2时钟除数为1
132
133 if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK) // 配置RCC时钟
134 {
135 Error_Handler(); // 如果配置失败则调用错误处理函数
136 }
137 HAL_RCC_MCOConfig(RCC_MCO, RCC_MCO1SOURCE_SYSCLK, RCC_MCODIV_1); // 配置MCO1输出为系统时钟
138}
139
140/**
141 * @brief GPIO Initialization Function
142 * @param None
143 * @retval None
144 */
145static void MX_GPIO_Init(void)
146{
147 GPIO_InitTypeDef GPIO_InitStruct = {0}; // GPIO初始化结构体
148
149 /* GPIO Ports Clock Enable */
150 __HAL_RCC_GPIOD_CLK_ENABLE(); // 使能GPIOD时钟
151 __HAL_RCC_GPIOA_CLK_ENABLE(); // 使能GPIOA时钟
152
153 /*Configure GPIO pin Output Level */
154 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0|GPIO_PIN_2|GPIO_PIN_4, GPIO_PIN_RESET); // 设置GPIOA的PA0、PA2、PA4为低电平
155
156 /*Configure GPIO pins : PA0 PA2 PA4 */
157 GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_2|GPIO_PIN_4; // 配置引脚
158 GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; // 输出推挽模式
159 GPIO_InitStruct.Pull = GPIO_NOPULL; // 不使用内部上拉或下拉电阻
160 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; // 低速模式
161 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); // 初始化GPIOA
162
163 /*Configure GPIO pin : PA8 */
164 GPIO_InitStruct.Pin = GPIO_PIN_8; // 配置引脚
165 GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; // 复用推挽输出模式
166 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; // 低速模式
167 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); // 初始化GPIOA
168}
169
170/* USER CODE BEGIN 4 */
171
172/* USER CODE END 4 */
173
174/**
175 * @brief 此函数在发生错误时执行。
176 * @retval None
177 */
178void Error_Handler(void)
179{
180 /* USER CODE BEGIN Error_Handler_Debug */
181 // 用户可以添加自己的实现来报告HAL错误返回状态
182 __disable_irq(); // 关闭中断
183 while (1) // 进入无限循环
184 {
185 }
186 /* USER CODE END Error_Handler_Debug */
187}
188
189#ifdef USE_FULL_ASSERT
190/**
191 * @brief 报告发生assert_param错误的源文件名和源行号。
192 * @param file: 指向源文件名的指针
193 * @param line: assert_param错误行源号
194 * @retval None
195 */
196void assert_failed(uint8_t *file, uint32_t line)
197{
198 /* USER CODE BEGIN 6 */
199 // 用户可以添加自己的实现来报告文件名和行号
200 /* USER CODE END 6 */
201}
202#endif /* USE_FULL_ASSERT */