嵌入式学习路线

  1. C语言 (翁恺/鹏哥) -> 重点攻克指针。
  2. 51单片机 (江科大) -> 2周时间了解寄存器概念,别花太久。
  3. STM32 (江科大) -> 重点掌握中断、定时器、通信协议(I2C, SPI, UART)。
  4. **推荐老师:【凡亿教育】**Altium Designer (AD) --PCB
  5. 做个小项目 -> 比如做一个平衡小车、智能手环(结合PCB画板)。
  6. FreeRTOS (正点原子) -> 理解多任务。
  7. Linux应用开发 -> 熟悉Linux命令,GCC,Makefile,文件IO,多线程。
  8. Linux驱动 (韦东山) -> 最难也是最值钱的部分

以上是我的学习路线,我文章下面的内容也就是我的笔记。由于我有基础,所以从stm32开始学习。

STM32 (江科大)

day01--GPIO输入输出模式

系统结构图(所有的GPIO都挂载在APB2总线上)

GPIO口结构图

8中输入输出模式

前4种输入模式,观看GPIO口结构图上面一条线路,也就是相关的上拉下拉等。

输出模式对应下面一条线路,对应开漏模式pMOS断开高阻态,Nmos接通低电平,推挽输出高低电平均能输出,对应PMOS和NMOS都能使用

案例一:点亮led灯

cpp 复制代码
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // 1. 开启时钟,上面结构图,GPIO挂载在APB2总线。

GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;      // LED接在PA0
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 【重点】推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);

// 点亮 低电平点亮
GPIO_ResetBits(GPIOA, GPIO_Pin_0); 



/**
推挽输出 (GPIO_Mode_Out_PP)--高低电平均有驱动能力
点亮板载led
低电平点亮
*/

因为我有一点cubemx基础,可以手动配置,就不用代码写了实际上和上面代码库函数配置是一样的。

案例二:读取按键状态控制小灯反转

在GPIO口中,有输入数据寄存器和输出数据寄存器,可以通过调用库函数,从输入输出寄存器中读取数据,key按键GPIO口设置为输入模式,上拉输入,当按下时可以从输入寄存器中读取3.3v高电平,从而在输入寄存器中设置为1。

day2---中断

GPIO引脚通过中断引脚选择AFIO,每一个选择一个GPIOABC中的引脚,在加入PVD,USB,等中断,之后设置边沿监测是上升沿还是下降沿以及双边沿监测触发。

定时器

定时器基本结构

复制代码
┌─────────────────────────────────────────────────────────┐
│                   STM32 定时器结构                        │
├─────────────────────────────────────────────────────────┤
│                                                           │
│  时钟源              预分频器            计数器            │
│  (CLK)               (PSC)             (CNT)             │
│                                                           │
│  72MHz  ──────►  ÷(PSC+1)  ──────►  0→ARR  ──────► 中断  │
│  (APB)                                    ▲               │
│                                           │               │
│                                      自动重载值            │
│                                        (ARR)              │
│                                                           │
└─────────────────────────────────────────────────────────┘

工作流程
步骤1: 时钟源 (如APB1 = 72MHz)
  ↓
步骤2: 预分频器分频
  计数器时钟频率 = 时钟源 / (PSC + 1)
  ↓
步骤3: 计数器从0计数到ARR
  计数次数 = ARR + 1
  ↓
步骤4: 产生更新事件(中断)
  定时时间 = (PSC + 1) × (ARR + 1) / 时钟源频率
  ↓
步骤5: 计数器清零,重新计数

中断函数是自动执行的,不需要手动调用:

硬件触发机制:当 TIM2 定时器溢出时,硬件自动触发中断

中断向量表:启动文件(startup_stm32f103xb.s)中定义了 TIM2_IRQHandler 的地址

自动跳转:硬件检测到中断后,CPU 自动跳转到这个函数执行

案例: PWM波形--高低电平占一个周期的时间比例

CUBEMX配置PWM输出控制呼吸灯

复制代码
PWM (脉冲宽度调制):
通过改变占空比控制LED亮度

占空比 = 高电平时间 / 周期时间

┌────────────────────────────────────────────────┐
│  占空比 10% (暗)                                │
│  ▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁        │
│  ▕█▏                                           │
│                                                 │
│  占空比 50% (中等亮度)                          │
│  ▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁        │
│  ▕██████████████████▏                          │
│                                                 │
│  占空比 90% (亮)                                │
│  ▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁        │
│  ▕████████████████████████████████████▏        │
└────────────────────────────────────────────────┘

PWM频率选择:
  > 100Hz   - 人眼无法察觉闪烁
  推荐 1KHz - 平衡性能和效果

推荐使用晶振体提供的外部时钟源,因为PWM需要一个稳定精度高的频率信号。

时钟源 → 预分频器(PSC) → 计数器(CNT) → 比较器 → PWM输出

↓ ↓ ↓

降频 递增/递减 CCR比较

呼吸灯用到OC(输出捕获),可以控制

相关推荐
毛小茛3 小时前
计算机系统概论——校验码
学习
babe小鑫3 小时前
大专经济信息管理专业学习数据分析的必要性
学习·数据挖掘·数据分析
winfreedoms4 小时前
ROS2知识大白话
笔记·学习·ros2
在这habit之下4 小时前
Linux Virtual Server(LVS)学习总结
linux·学习·lvs
我想我不够好。4 小时前
2026.2.25监控学习
学习
im_AMBER4 小时前
Leetcode 127 删除有序数组中的重复项 | 删除有序数组中的重复项 II
数据结构·学习·算法·leetcode
CodeJourney_J4 小时前
从“Hello World“ 开始 C++
c语言·c++·学习
匠心网络科技5 小时前
JavaScript进阶-ES6 带来的高效编程新体验
开发语言·前端·javascript·学习·面试
2501_918126916 小时前
stm32死锁是怎么实现的
stm32·单片机·嵌入式硬件·学习·个人开发