为下面每一行代码添加注释:
时间: 2024-03-03 12:52:35 浏览: 71
```c
#include "stm32f1xx_hal.h" // 包含了 STM32 HAL 库的头文件
SPI_HandleTypeDef hspi1; // 定义了一个 SPI 句柄
void SystemClock_Config(void); // 声明了一个系统时钟配置函数
int main(void) // 主函数
{
/* MCU初始化 */
HAL_Init(); // 初始化 HAL 库
/* 系统时钟配置 */
SystemClock_Config(); // 进行系统时钟配置
/* SPI外设时钟和引脚配置 */
GPIO_InitTypeDef GPIO_InitStruct = {0}; // 定义了一个 GPIO 初始化结构体
__HAL_RCC_GPIOA_CLK_ENABLE(); // 打开 GPIOA 外设时钟
__HAL_RCC_SPI1_CLK_ENABLE(); // 打开 SPI1 外设时钟
GPIO_InitStruct.Pin = GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7; // 配置 GPIO 引脚
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; // 设置 GPIO 模式为复用推挽输出
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; // 设置 GPIO 速度为高速
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); // 初始化 GPIOA 外设
/* SPI外设初始化 */
hspi1.Instance = SPI1; // 设置 SPI 外设为 SPI1
hspi1.Init.Mode = SPI_MODE_MASTER; // 设置 SPI 模式为主机模式
hspi1.Init.Direction = SPI_DIRECTION_2LINES; // 设置 SPI 数据传输方向为双向传输
hspi1.Init.DataSize = SPI_DATASIZE_8BIT; // 设置 SPI 数据位宽为 8 位
hspi1.Init.CLKPolarity = SPI_POLARITY_LOW; // 设置 SPI 时钟极性为低电平
hspi1.Init.CLKPhase = SPI_PHASE_1EDGE; // 设置 SPI 时钟相位为第一个边沿
hspi1.Init.NSS = SPI_NSS_SOFT; // 设置 SPI 片选信号为软件控制
hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_256; // 设置 SPI 波特率预分频为 256
hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB; // 设置 SPI 数据传输的第一个比特位为 MSB
hspi1.Init.TIMode = SPI_TIMODE_DISABLE; // 禁止 SPI TI 模式
hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; // 禁止 SPI CRC 校验
hspi1.Init.CRCPolynomial = 10; // 设置 SPI CRC 多项式
HAL_SPI_Init(&hspi1); // 初始化 SPI 外设
/* W25Q32芯片初始化 */
uint8_t cmd[4] = {0x06, 0x00, 0x00, 0x00}; // 定义一个写使能命令
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET); // 将 SPI 片选信号拉低
HAL_SPI_Transmit(&hspi1, cmd, 1, HAL_MAX_DELAY); // 发送写使能命令
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET); // 将 SPI 片选信号拉高
return 0; // 程序正常退出
}
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0}; // 定义一个 RCC 初始化结构体
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; // 定义一个 RCC 时钟初始化结构体
/** 配置内部时钟 */
__HAL_RCC_PWR_CLK_ENABLE(); // 打开功耗时钟
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); // 配置电压调节器电压范围
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; // 设置振荡器类型为内部高速时钟
RCC_OscInitStruct.HSIState = RCC_HSI_ON; // 打开内部高速时钟
RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; // 设置高速时钟校准值为默认值
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; // 打开 PLL
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI_DIV2; // 设置 PLL 输入时钟源为内部高速时钟除以 2
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL16; // 设置 PLL 倍频系数为 16
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) // 配置 RCC 初始化结构体并检查返回值
{
Error_Handler(); // 如果出现错误,调用错误处理函数
}
/** 配置系统时钟 */
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2; // 配置时钟类型
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; // 设置系统时钟源为 PLL 时钟
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; // 设置 AHB 总线时钟分频系数为 1
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; // 设置 APB1 总线时钟分频系数为 2
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; // 设置 APB2 总线时钟分频系数为 1
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) // 配置 RCC 时钟初始化结构体并检查返回值
{
Error_Handler(); // 如果出现错误,调用错误处理函数
}
}
```
阅读全文