【HAL库】嵌入式思路(一)

1. GPIO

1.1 GPIO引脚分布

引脚主要分为特殊功能的引脚和普通IO引脚;

其中灰色的是普通引脚,可以通过编程控制;

黄色的是特殊功能引脚,无法通过编程控制,具有独特的功能。

  • VDD VSS用来接电源
  • VBAT用来接备用电池
  • BOOT0用来启动模式选择

    VDD VSS名字来源:
    MOS管中电流从漏极(D)流向源极(S):

    为普通引脚分组为:
    GPIOA GPIOB GPIOC GPIOD

1.2 IO的复用和重映射

一个IO引脚可以具备多个不同的功能:

例如如下的引脚,可以选择多个引脚的作用:

单片机上的外设很多引脚会重复,所以为了可以同时使用这些功能,

单片机具有引脚复用的功能,通过复用可以使得多个外设同时工作,

例如下图所示:

复用功能重映射:将冲突的复用功能映射到其他引脚上。

1.3 GPIO的四种输出模式

推挽 开漏
通用 通用输出推挽 通用输出开漏
复用 复用输出推挽 复用输出开漏

具体的介绍细节可以参考:

https://blog.csdn.net/2301_81230001/article/details/166373728

1.4 GPIO的输出速度

具体的介绍细节可以参考:

https://blog.csdn.net/2301_81230001/article/details/166373728

1.5 GPIO-HAL库编程

首先生成代码模板后:

会在main函数中进行初始化:

如下所示:

c 复制代码
int main(void)
{
  /* 1. HAL库底层初始化 */
  HAL_Init();
  /* USER CODE BEGIN Init */
  // 【时钟未升频!】MCU仍在内部低速时钟,慎用HAL_Delay()
  /* USER CODE END Init */

  /* 2. 配置系统主时钟(HSE/PLL,升到目标主频) */
  SystemClock_Config();
  /* USER CODE BEGIN SysInit */
  // 【时钟已经配置完成】主频正常,可以使用HAL_Delay()
  /* USER CODE END SysInit */

  /* 3. 所有外设初始化 */
  MX_GPIO_Init();
  MX_USART1_Init();
  MX_ADC1_Init();
  // ...其他MX_xxx_Init()
  /* USER CODE BEGIN 2 */
  // 所有外设初始化完毕后,放自己的初始化代码
  /* USER CODE END 2 */

  /* 主循环 */
  while (1)
  {
    /* USER CODE BEGIN 3 */
    
    /* USER CODE END 3 */
  }
}

重点函数的功能:

函数 核心作用 关键限制
HAL_Init() 复位外设、初始化 Flash、SysTick 滴答定时器、设置中断分组 ⚠️系统时钟仍是默认低速,不要在这里用串口、ADC 等外设,HAL_Delay 不准
SystemClock_Config() 配置 PLL、AHB/APB 分频,把系统时钟设置为 CubeMX 选定频率 ⚠️必须在 HAL_Init 之后,所有 MX 外设初始化之前
MX_GPIO_Init() 开启 GPIO 端口时钟,配置引脚模式:推挽 / 开漏 / 输入 / 复用、上下拉、速率 ⚠️必须在 SystemClock_Config 之后,否则 GPIO 外设时钟不生效

1.6 使用bootloader清除程序

如果没有选择调试接口-则单片机默认烧录一次就锁死芯片。

解锁的操作过程可以参考如下链接:

https://docs.baud-dance.com/docs/stm32/FAQ/CompilationFailed

1.7 GPIO四种输入模式

输入模式 核心说明 典型用途 要点
浮空输入(GPIO_NOPULL) 引脚不接上拉/下拉电阻,电平不确定,受外界干扰大 外接自带上下拉的信号 悬空时电平抖动,一般不推荐单独使用
上拉输入(GPIO_PULLUP) 内部接上拉电阻,无外部信号时默认高电平 按键输入(按键一端接GND) 按键按下→低电平;松开→高电平
下拉输入(GPIO_PULLDOWN) 内部接下拉电阻,无外部信号时默认低电平 按键输入(按键一端接VCC) 按键按下→高电平;松开→低电平
模拟输入(GPIO_ANALOG) 关闭数字输入缓冲,引脚进入模拟通道,不读高低电平 ADC采集模拟电压 不能用GPIO_ReadPin读取,只能ADC采样

具体的介绍细节可以参考:

https://blog.csdn.net/2301_81230001/article/details/166373728

2. UART

2.1 UART基础知识

具体的介绍细节可以参考:

https://blog.csdn.net/2301_81230001/article/details/166490981

2.2 使用串口发送数据

在CubeMX中,串口具有多种工作模式:

串口 句柄

HAL库句柄:管理对应外设的结构体实例,保存外设地址、配置与运行状态,作为HAL库函数识别和操作外设的唯一凭证。

3. IIC

3.1 IIC基础知识

IIC- Inter-Integrated Circuit(集成电路间总线)

具体的介绍细节可以参考:

https://blog.csdn.net/2301_81230001/article/details/166373789

4. 时钟系统

4.1 时钟基础知识

具体的介绍细节可以参考:

https://blog.csdn.net/2301_81230001/article/details/166788037

HAL库中具有对应的时钟树图形化设置:

分为两部分:

  • 小时钟树-主要涉及实时时钟 和看门狗
  • 大时钟树- 主要涉及AHB ,APB1 APB2 等等挂载外设。

5. SPI

5.1 SPI基础知识

SPI= Serial Peripheral Interface- 串行外设接口

适用于高速,双向数据传输场景

具体的介绍细节可以参考:

https://blog.csdn.net/2301_81230001/article/details/166490957

5.2 SPI与外部Flash通信

首先需要选择SPI的工作方式:

在图形化界面有如下的选项;

一般单片机作为主机使用,

5. 中断

5.1 中断的基础知识

具体的介绍细节可以参考:

https://blog.csdn.net/2301_81230001/article/details/166788037

6. 定时器

6.1 基础知识

具体的介绍细节可以参考:

https://blog.csdn.net/2301_81230001/article/details/166794087?spm=1001.2014.3001.5501

7. ADC

7.1

相关推荐
AOI小白新手上路1 小时前
深度学习模块缝合方法论 · 人物蒸馏笔记
人工智能·笔记·深度学习
AOI小白新手上路1 小时前
韦东山 3-5 I.MX6ULL 的 LED 编程 · 学习笔记
arm开发·笔记·单片机·学习·架构·硬件架构
M78佐菲2 小时前
ARM学习笔记(9)
linux·arm开发·笔记·嵌入式硬件·学习
東隅已逝,桑榆非晚3 小时前
priority_queue的介绍和使用
c++·经验分享·笔记·学习
驭渊的小故事3 小时前
MyBatis 入门:从 JDBC 到优雅操作数据库(一)
笔记·sql·spring
zhangrelay5 小时前
机器人或计算机智能与时间相关案例汇总(ROS2-ROS1)
linux·笔记·学习·ubuntu·机器人
Neo Wordsworth5 小时前
随便笔记2
笔记
zhangrelay15 小时前
ROS项目设计案例智能大模型正经乱答案例
linux·笔记·学习·ubuntu·机器人
probex_15 小时前
学习笔记:知识图谱是什么,在测试里能干什么
笔记·学习·知识图谱