STM32的使用方法一

  • 注:我采用的是STM32F103RC芯片、相应的电路图和STM32CubeIDE软件
  • 这是在STM32CubeIDE软件定义芯片后,所给的必要的代码逻辑,加上了注释
#include "main.h"

/* Private variables ---------------------------------------------------------*/

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);  // 声明系统时钟配置函数

##关键词解释
句柄 :对硬件资源或系统资源的抽象,通常用于标识和管理这些资源。通常是一个包含配置参数、状态信息和相关寄存器地址的结构体。定义句柄后,可以通过该句柄对相应的硬件外设进行配置、操作和管理。

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
   
  // 初始化HAL库,配置系统时钟和外设
  HAL_Init();
 HAL 库提供了一套统一的 API 来抽象硬件外设(如GPIO、ADC、UART、I2C、SPI等)的操作。
  // 配置系统时钟
  SystemClock_Config();
MX_ 前缀通常表示由 STM32CubeMX 工具生成的初始化代码,而不是开发者手动编写的函数。
  // 在这里可以初始化其他外设
  
  // 无限循环,主程序运行的核心循环
  while (1)
  {
   
    // 这里可以放置主循环代码
  }
}

/**
  * @brief System Clock Configuration
  * @retval None
  */
void SystemClock_Config(void)
{
   
  RCC_OscInitTypeDef RCC_OscInitStruct = {
   0};          // RCC振荡器初始化结构体
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {
   0};          // RCC时钟初始化结构体

  // 配置HSI(内部高速时钟)作为时钟源
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;             // 打开HSI
  RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;  // 设置HSI校准值
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;       // 不使用PLL(相位锁定环)
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
   
    Error_Handler();  // 如果配置失败,调用错误处理函数
  }

  // 配置AHB、APB1、APB2总线时钟
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK
                              | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;  // 使用HSI作为系统时钟源
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;       // AHB时钟不分频
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;        // APB1时钟不分频
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;        // APB2时钟不分频

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
  {
   
    Error_Handler();  // 如果配置失败,调用错误处理函数
  }
}

/**
  * @brief  This function is executed in case of error occurrence.
  * @retval None
  */
void Error_Handler(void)
{
   
  __disable_irq();  // 禁用所有中断
  while (1)
  {
   
    // 错误处理:进入死循环
  }
}

#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)
{
   
  // 用户可以在这里添加自己的实现来报告文件名和行号
}
#endif /* USE_FULL_ASSERT */


一、GPIO

  1. 在STM32中,GPIO(General Purpose Input/Output,通用输入/输出)是一个非常重要的外设,用于与外部设备进行交互。
  2. GPIO引脚可以通过软件配置为输入或输出,用于读取或控制外部设备的状态,如开关、LED、传感器等。
  3. STM32的GPIO引脚支持复用功能,可以与微控制器内部的外设(如USART、I2C、SPI、PWM等)直接连接,不需要外部额外连接线。通过这种模式,GPIO引脚可以与多种外设共同使用。
  4. GPIO引脚可以配置为模拟模式,用于模拟信号的输入或输出。例如,当使用ADC(模数转换器)或DAC(数模转换器)时,GPIO会被配置为模拟模式来读取或输出模拟电压信号。
  5. GPIO模块将管脚分组为PA PB PC PD,每一组为16个。
  6. 使用
    - 由于我的电路图是PC6,PC7,PC8为LED灯连接。故配置它们为GPIO_Output,因此在代码中多了static void MX_GPIO_Init(void);函数,进行串口的配置,故也要在main函数中GPIO初始化。 MX_GPIO_Init();
    - 又因为PC2控制着LED的亮灭,故将PC2设置为GPIO_Intput,并将其上拉。
    - 为什么上拉:芯片的管脚浮在空中,电平是不确定的.为了使之稳定,我们可以需要对其进行 上拉和下拉。
    - 上拉(Pull-up)和下拉(Pull-down)是为了稳定输入引脚的电平状态,防止输入引脚悬空时产生不确定的电平。
    - 上拉是
    在这里插入图片描述
    - HAL_GPIO_WritePin(GPIOC, GPIO_PIN_6 | GPIO_PIN_7 | GPIO_PIN_8, GPIO_PIN_SET);用于将6,7,8管脚设置为输出状态。GPIO_PIN_RESET 可以将指定的 GPIO 引脚输出设为逻辑低电平(0V),通常表示逻辑0。
    - HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_8); 对输入输出取反操作,即设置一定的延时可以一闪一闪的。
    - 利用PC2开关LED灯
 if (HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_2) == GPIO_PIN_RESET) {
   
	      HAL_GPIO_WritePin(GPIOC, GPIO_PIN_6 | GPIO_PIN_7 | GPIO_PIN_8, GPIO_PIN_SET);
	  } else {
   
	      HAL_GPIO_WritePin(GPIOC, GPIO_PIN_6 | GPIO_PIN_7 | GPIO_PIN_8, GPIO_PIN_RESET);
	  }
  1. GPIO输出的推挽和开漏
  • 推挽输出(Push-pull output):引脚可以输出高电平或低电平,直接驱动负载。用于常见的数字信号输出。有一定的驱动能力
  • 开漏输出(Open-drain output):引脚只能拉低(输出低电平),高电平需要外部上拉电阻实现。常用于I2C等总线通信。没有驱动能力
    在这里插入图片描述
  1. 代码
#include "main.h"

void SystemClock_Config(void);
static void MX_GPIO_Init(void);

int 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值