ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

2023年STM32入门实战指南:从工具链选型到中断定时器串口

2023年STM32入门实战指南:从工具链选型到中断定时器串口 1. 为什么2023年了还有人愿意啃STM32这块硬骨头如果你最近在某个电子论坛或者技术群里潜水大概率会看到两种截然相反的论调。一种声音说现在国产芯片和ESP32这么猛还学STM32是不是有点49年入国军的意思另一种声音则是招聘网站上那些嵌入式岗位的JD里STM32依然是被提及频率最高的关键词之一。我个人的看法比较直接STM32不是唯一的选择但它依然是那个能让你把“单片机到底是怎么跑起来的”这件事搞明白的最佳教具。这个标题里的“2023版”和“中文字幕”其实透露了很多信息。2023版意味着它覆盖的芯片型号和工具链相对较新至少不会拿着十年前的F1系列老古董让你对着过时的寄存器手册发呆。中文字幕则说明这套教程大概率是视频形式而且讲解语言对国内初学者足够友好。我见过太多人一上来就抱着某本厚得像砖头的英文原版教材硬啃啃了三个月还在纠结时钟树怎么配最后热情耗尽直接放弃。所以这套教程的定位很清晰给零基础或者刚接触嵌入式的人提供一条相对平滑的入门路径。但平滑不等于简单。STM32的学习曲线在入门阶段是出了名的陡这个陡峭感主要来自三个方面。第一是工具链的复杂度从Keil或者STM32CubeIDE的安装到芯片包的下载再到ST-Link驱动的识别每一步都可能卡住一个新手。第二是概念密度高GPIO、中断、定时器、串口、DMA、ADC这些外设模块每一个都有自己的寄存器组和配置逻辑而且它们之间还经常需要联动。第三是调试手段的门槛点个灯容易但灯不亮的时候怎么排查这才是真正拉开差距的地方。我写这篇东西的目的不是给你复述一遍教程里讲了什么而是把我自己带过几批新人之后总结出来的经验结合这套教程可能涉及的内容框架给你梳理出一条更接地气的学习路线。哪些地方可以快速通过哪些地方必须停下来死磕哪些坑我替你踩过了你可以直接绕开这些东西教程里不一定讲得那么细但恰恰是决定你能不能坚持学下去的关键。2. 动手之前先把家伙什备齐工具链的选型与避坑2.1 Keil、CubeIDE还是VSCode加插件到底怎么选这个问题几乎每个新手都会问而且网上的答案五花八门。我先给结论如果你跟的是2023版的视频教程最省心的做法是教程用什么你就用什么。这不是偷懒而是因为工具链的差异会导致界面布局、编译报错信息、甚至工程文件结构都不一样你跟着教程操作的时候如果工具对不上光是找按钮就能找半天。目前主流的三种选择各有各的脾气。Keil MDK是很多老工程师的心头好它的优势在于编译器成熟、调试器生态完善、资料多如牛毛。但它的缺点也很明显界面停留在上个时代代码补全功能约等于没有而且正版授权费用不低。很多人用的是MDK5的某个版本这里要注意一个高频热搜词里提到的问题Keil5兼容C51和STM32安装。如果你之前装过Keil C51用来搞51单片机再装MDK的时候可能会遇到共存问题两个版本的安装目录如果混在一起注册表会打架。正确的做法是分别安装在不同的盘符或者不同的顶层目录下比如C51装在C:\Keil_v5_C51MDK装在C:\Keil_v5_MDK这样互不干扰。STM32CubeIDE是ST官方推出的免费工具基于Eclipse框架。它的最大好处是跟CubeMX无缝集成图形化配置引脚和时钟之后一键生成工程代码对新手极其友好。但Eclipse系的IDE普遍比较吃内存启动速度慢而且有时候代码索引会抽风明明定义了的函数它给你标红。我一般建议内存8GB以下的电脑慎重考虑16GB以上用起来才比较舒服。VSCode加STM32插件是近两年越来越流行的方案轻量、启动快、代码补全强大。但它需要你自己折腾编译工具链比如安装arm-none-eabi-gcc、配置tasks.json和launch.json对完全没接触过命令行的人来说有一定门槛。热搜词里有个stm32 vscode配置说明不少人在尝试这条路。我的建议是第一遍学的时候别折腾这个等你把整个开发流程跑通了知道编译、链接、烧录分别是怎么回事了再迁移到VSCode也不迟。工具方案上手难度资源占用代码补全适合人群Keil MDK中等低弱跟着老教程学、公司要求STM32CubeIDE低高中等零基础新手、学生VSCode插件高低强有经验、追求效率2.2 芯片包和ST-Link驱动两个最容易卡住新手的环节装好IDE只是第一步接下来你要面对的是芯片包安装。热搜词里stm32芯片包安装能上榜说明这确实是个高频问题。Keil的芯片包是以.pack为后缀的文件你需要去Keil官网或者ST官网下载对应系列的包比如STM32F1系列、STM32F4系列。下载完之后双击安装Keil会自动识别。但有时候网络不好在线安装会卡住或者报错这时候可以手动下载pack文件离线安装。CubeIDE在这方面省心很多它自带芯片数据库新建工程的时候直接选型号就行。ST-Link驱动是另一个重灾区。你兴冲冲地把开发板用USB线连上电脑结果设备管理器里显示一个黄色感叹号或者Keil里提示“No ST-Link detected”。这种情况我遇到过不下十次原因通常有三个一是USB线是充电线不是数据线这个坑最隐蔽换根线就好了二是驱动没装好需要去ST官网下载ST-Link Utility或者STM32CubeProgrammer安装的时候会自动装驱动三是开发板上的ST-Link固件太老需要升级。热搜词里有个stm32 st-link utility这个工具除了烧录之外还可以用来升级ST-Link固件和查看芯片内存建议装一个备用。注意有些开发板用的是CH340或者CP2102做USB转串口跟ST-Link是两码事。ST-Link负责下载和调试USB转串口负责串口通信。如果你发现串口助手收不到数据先检查是不是串口线没接对或者波特率设错了。2.3 最小系统板怎么挑别在选板子上浪费太多时间热搜词里有个stm32最小系统这是很多人的第一块板子。最小系统板通常只包含芯片、晶振、复位电路、电源电路和引出所有IO口的排针价格便宜适合学习。我的建议是如果你跟的教程用的是F103C8T6你就买一块一模一样的别想着买个F407的板子“一步到位”。因为教程里讲的寄存器地址、外设数量、时钟频率都是针对特定型号的你换个型号代码可能编译不过或者跑起来行为不对这对新手来说是额外的认知负担。买板子的时候注意几个细节。第一确认板子上有ST-Link接口或者预留了SWD排针SWD只需要两根线SWCLK和SWDIO加电源和地就能下载调试比JTAG省事。热搜词里有个stm32禁用jtag这是因为JTAG占用的引脚比较多有时候你想把那些引脚当普通IO用就需要在代码里禁用JTAG功能这个后面讲GPIO的时候会细说。第二看看板子有没有板载LED和按键这两个东西是你验证GPIO和中断功能的最基本外设没有的话还得自己外接麻烦。第三如果预算允许买一块带USB转串口芯片的板子这样你只需要一根USB线就能同时供电、下载和串口通信桌面会清爽很多。3. 从点灯到时钟树那些教程不会明说但你必须懂的事3.1 新建工程背后的门道标准库、HAL库和寄存器操作热搜词里有个stm32库函数和标准库有什么区别还有个stm32标准库新建工程。这两个问题其实指向同一个核心困惑我到底该用哪种方式写代码。STM32的开发方式大致分三代最早是直接操作寄存器后来ST推出了标准外设库Standard Peripheral Library再后来是现在主推的HAL库Hardware Abstraction Layer。直接操作寄存器的方式代码效率最高但可读性最差。比如你要点亮一个LED需要先使能GPIO的时钟然后配置GPIO的模式寄存器、输出速度寄存器最后写数据寄存器。每一步都要查手册对新手来说门槛太高。标准库把这些操作封装成了函数比如GPIO_Init()你只需要填一个结构体把引脚、模式、速度传进去就行。HAL库进一步抽象提供了HAL_GPIO_Init()这样的函数而且跨系列兼容性更好F1的代码稍微改改就能跑在F4上。2023版的教程大概率是以HAL库为主因为ST现在主推CubeMX加HAL库的组合。但我的建议是你在学HAL库的同时至少要知道它底层干了什么。比如HAL_GPIO_WritePin()这个函数它最终是往BSRR寄存器写了一个值。你不需要背寄存器地址但你要理解“库函数只是帮你把寄存器操作包装了一层”这个概念。这样当你遇到库函数解决不了的问题时你知道可以去翻参考手册找对应的寄存器。新建工程的时候还有一个细节容易被忽略启动文件的选择。启动文件是汇编写的负责在芯片上电后初始化堆栈指针、跳转到main函数。不同容量的芯片对应不同的启动文件比如startup_stm32f103xb.s对应中容量startup_stm32f103xe.s对应大容量。选错了启动文件编译可能不报错但程序跑起来会莫名其妙地死机。CubeIDE会自动帮你选但如果你用Keil手动建工程就要自己注意。3.2 时钟树不是玄学搞懂它才能让定时器和串口听话STM32的时钟树是新手最容易懵的地方没有之一。热搜词里stm32时钟树能上榜说明被它折磨过的人不在少数。我刚开始学的时候看到那个密密麻麻的框图第一反应是“这什么鬼”。但后来我明白了一件事时钟树本质上就是一个分发系统把不同频率的时钟信号分配给不同的外设。打个比方芯片内部有一个主时钟源就像一个大水泵。这个水泵的水要通过管道送到各个房间外设但每个房间需要的水压频率不一样。有的房间需要72MHz的高压有的只需要36MHz有的甚至只要几kHz。时钟树就是这套管道系统里面有分频器把频率降低和倍频器把频率升高还有选择开关选择用哪个时钟源。对于F103系列来说最常见的配置是外部晶振8MHz经过PLL倍频到72MHz作为系统时钟。然后AHB总线不分频APB1总线分频系数为2得到36MHzAPB2总线不分频得到72MHz。为什么APB1要分频因为APB1上挂的外设比如定时器2到7、串口2到5最高只能跑36MHz你给它72MHz它会罢工。而APB2上的外设比如GPIO、串口1、ADC可以跑72MHz。这里有个坑定时器的时钟频率不一定是APB总线的频率。如果APB的分频系数是1定时器时钟就等于APB频率如果分频系数大于1定时器时钟等于APB频率乘以2。比如APB1分频系数为2频率是36MHz但挂在APB1上的定时器实际时钟是72MHz。这个规则在计算定时器周期的时候非常关键搞错了算出来的延时时间会差一倍。提示CubeMX里配置时钟树的时候直接在那个界面输入你想要的最终频率它会自动帮你算分频和倍频系数。但你要知道它为什么这么算否则换个芯片或者换个晶振频率你又不会了。3.3 GPIO的八种模式什么时候用哪种GPIO是STM32最基础的外设但它的八种模式输入浮空、输入上拉、输入下拉、模拟输入、开漏输出、推挽输出、推挽复用、开漏复用经常让新手犯迷糊。我见过有人用推挽输出模式去读按键结果怎么读都是高电平查了半天以为是硬件坏了。先说输入模式。浮空输入就是引脚悬空电平不确定一般只在特定场景用比如外部已经有上拉电阻的时候。上拉输入和下拉输入是内部接了电阻按键一端接引脚一端接地就用上拉输入这样按键没按下时引脚是高电平按下时是低电平。模拟输入是给ADC用的这时候引脚的数字功能被关闭信号直接进ADC模块。输出模式里推挽输出是最常用的它可以输出高电平和低电平驱动能力强点LED、驱动蜂鸣器都用它。开漏输出只能输出低电平高电平需要外部上拉电阻它的好处是可以做电平转换比如你用3.3V的STM32去驱动5V的逻辑电路开漏输出加上拉电阻到5V就能实现。复用模式是给那些引脚除了GPIO之外还有第二功能的场景用的比如串口的TX引脚你配置成复用推挽输出它就会由串口外设来控制而不是你的代码直接写。热搜词里有个stm32控制伺服电机485这里涉及到一个典型场景用串口发送指令控制伺服电机然后通过485芯片转换成差分信号。这时候串口的TX引脚就要配置成复用推挽输出而控制485收发方向的引脚则配置成普通推挽输出。如果你把TX引脚配成了普通推挽输出串口就发不出数据。4. 中断、定时器和串口三个必须拿下的硬骨头4.1 中断优先级为什么你的中断不响应中断是单片机实时性的核心。没有中断你就只能在一个大循环里轮询各个外设的状态效率低而且响应慢。STM32的中断系统有一个叫NVIC嵌套向量中断控制器的东西它负责管理所有中断的优先级和嵌套。优先级分两种抢占优先级和响应优先级。抢占优先级高的中断可以打断正在执行的抢占优先级低的中断这就是嵌套。响应优先级高的中断不能打断正在执行的中断但如果两个中断同时到达响应优先级高的先执行。如果两个中断的抢占优先级和响应优先级都一样那就看它们在中断向量表里的位置位置靠前的先执行。新手最常见的坑是配置了中断使能了中断但中断服务函数就是不进。原因通常有三个。第一忘了在NVIC里使能对应的中断通道你只使能了外设的中断标志但NVIC那一层没开中断信号传不到CPU。第二中断服务函数的名称写错了STM32的中断服务函数名称是固定的比如串口1的中断服务函数必须叫USART1_IRQHandler你写成USART1_IRQHandler()多了个括号或者拼写错误链接的时候不会报错但中断发生时找不到函数程序就飞了。第三中断标志没有清除进了中断之后没有清除对应的标志位导致中断被反复触发CPU一直在处理中断主循环根本跑不起来。注意HAL库的中断处理流程跟标准库不太一样。HAL库把中断服务函数分成了两层一层是IRQHandler另一层是回调函数HAL_GPIO_EXTI_Callback()。你需要在IRQHandler里调用HAL_GPIO_EXTI_IRQHandler()然后HAL库会自动帮你清除标志并调用回调函数。如果你直接在IRQHandler里写业务逻辑可能会跟HAL库的流程冲突。4.2 定时器从延时到PWM到输入捕获定时器是STM32里功能最丰富的外设之一也是热搜词里出现频率最高的模块。stm32定时器、stm32定时器捕获测频率、stm32测频法、stm32延时函数delay卡死这些词都跟定时器有关。先说说延时函数。很多人学STM32的第一个延时函数是用for循环写的叫软件延时。这种延时的精度极差而且编译器优化等级一变延时时间就变了。更严重的是热搜词里有个stm32延时函数delay卡死这通常是因为在中断里调用了软件延时或者延时函数里用了系统滴答定时器SysTick但SysTick的中断优先级配置有问题。正确的做法是用硬件定时器做延时或者用SysTick但确保它不会被其他中断打断。定时器最基本的用法是定时中断。你配置好预分频器PSC和自动重装载寄存器ARR定时器就会以固定的频率产生中断。计算公式是定时器频率 系统时钟 / (PSC1) / (ARR1)。比如系统时钟72MHzPSC设为7199ARR设为999那么定时器频率就是72000000/7200/1000 10Hz也就是每100ms中断一次。PWM输出是定时器的另一个常用功能。通过配置捕获比较寄存器CCR你可以控制输出方波的占空比。这个功能用来调LED亮度、控制电机速度、驱动舵机都很方便。舵机的控制信号是周期20ms、高电平宽度0.5ms到2.5ms的PWM波对应舵机角度0到180度。你用定时器产生这样的PWM波就能精确控制舵机位置。输入捕获是定时器比较高级的功能用来测量外部信号的频率和占空比。热搜词里stm32定时器捕获测频率和stm32测频法说的就是这个。原理是当引脚上出现上升沿或下降沿时定时器把当前计数器的值锁存到捕获寄存器里你通过两次捕获的值之差就能算出信号周期。测高频信号用测频法测低频信号用测周法这是信号处理的基本常识。4.3 串口通信调试和联调的生命线串口是嵌入式开发中最重要的调试手段没有之一。你可以没有屏幕没有按键但你不能没有串口。热搜词里stm32串口通信、stm32串口调试pid、stm32 usb虚拟串口发送数据这些都跟串口相关。串口的基本配置包括波特率、数据位、停止位、校验位。最常用的配置是9600或115200波特率8位数据位1位停止位无校验。STM32的串口发送数据有两种方式阻塞发送和中断发送。阻塞发送就是调用HAL_UART_Transmit()它会一直等到数据发完才返回简单但效率低。中断发送是调用HAL_UART_Transmit_IT()它把数据丢进发送缓冲区就返回了发送完成之后触发中断通知你。接收数据也有阻塞和中断两种方式另外还有DMA方式适合大量数据的收发。串口调试PID是很多做电机控制的人会遇到的场景。你用串口把PID的参数发送给STM32STM32根据这些参数调整控制量然后把当前的转速、电流等数据通过串口发回电脑你在电脑上用波形软件实时显示。这个过程对串口的实时性和稳定性要求比较高建议用DMA收发减少CPU的干预。USB虚拟串口是另一个实用功能。STM32F103系列没有原生USB但可以通过USB转串口芯片实现。F4系列有原生USB可以配置成CDC设备插上电脑之后直接识别为一个串口不需要额外的转换芯片。热搜词里stm32无法识别usb设备这个问题通常出在USB的时钟配置上STM32的USB模块要求48MHz的时钟如果你用外部晶振经过PLL倍频需要确保USB时钟的分频系数正确。5. 进阶路上的分岔口RTOS、OTA和毕业设计选题5.1 FreeRTOS到底要不要学什么时候学热搜词里有个freertos快速入门教程说明很多人在学完STM32基础之后开始考虑上操作系统。我的观点是如果你只是做点灯、读传感器、控制电机这种单一任务的事情裸机跑大循环完全够用没必要上RTOS。但如果你要做多任务并行比如一边采集传感器数据一边刷新屏幕一边处理串口命令裸机就会写得很痛苦这时候RTOS的价值就体现出来了。FreeRTOS是目前STM32上最流行的实时操作系统它的核心概念是任务、队列、信号量、互斥量。任务就是一个无限循环的函数每个任务有自己的栈空间和优先级。调度器负责在多个任务之间切换让它们看起来是同时在运行。队列用于任务之间传递数据信号量用于任务同步互斥量用于保护共享资源。学FreeRTOS的前提是你对STM32的中断和定时器已经有比较深的理解因为RTOS的调度器本质上就是利用SysTick中断和PendSV中断来实现任务切换的。如果你连中断优先级都还没搞明白直接上RTOS会非常吃力。我建议的学习路径是先把裸机的中断、定时器、串口玩熟然后花一周时间把FreeRTOS的任务创建、调度、队列通信跑通剩下的细节可以在项目中慢慢积累。5.2 OTA升级让设备远程更新的正确姿势热搜词里有个stm32 ota这是产品化阶段必须考虑的功能。OTA就是通过无线或者有线方式给设备远程更新固件不用把设备拆下来接下载器。STM32的OTA通常有两种方案一种是双区方案Flash里存两份固件一份是正在运行的一份是新下载的下载完成后重启切换到新固件另一种是Bootloader方案设备上电后先运行BootloaderBootloader检查是否需要更新需要的话就接收新固件写入Flash然后跳转到应用程序。双区方案的安全性更高因为即使新固件有问题你还可以回滚到旧固件。但它需要两倍的Flash空间对于Flash容量紧张的芯片不太友好。Bootloader方案节省空间但如果更新过程中断电设备可能会变砖。实际项目中我一般推荐Bootloader加备份区的方案Bootloader本身不参与更新它负责接收新固件并写入应用程序区写入之前先把旧固件备份到备份区写入完成后校验校验通过才跳转。OTA的难点不在STM32端而在通信协议的设计。你需要定义固件的分包格式、校验方式、重传机制、断点续传逻辑。如果用的是无线模块比如ESP8266或者LoRa还要考虑无线链路的稳定性和带宽。热搜词里有个stm32 lora 温控电路LoRa的传输速率很低OTA的时候要特别小心分包大小和超时时间。5.3 毕业设计选题怎么选一个能做完又不烂大街的题目热搜词里有个基于stm32的毕业设计还有一个基于stm32空气质量检测开源项目。每年到了毕业季这个话题的热度就会飙升。我见过太多人选题的时候雄心勃勃要做智能家居中控、要做四轴飞行器、要做视觉追踪小车结果做到一半发现难度远超预期最后草草收场。选题的核心原则是功能可验证、工作量可控、有一定实用性。空气质量检测就是一个不错的选题传感器用SGP30或者CCS811STM32读取数据通过OLED或者串口屏显示再加上超标报警功能。这个题目涉及I2C通信、ADC采集、显示驱动、报警逻辑工作量适中而且有实际意义。如果你想加点亮点可以加上数据上传到手机APP的功能用ESP8266或者蓝牙模块实现。另一个思路是做数据采集加PID控制的题目比如温控风扇、恒温焊台、直流电机调速。这类题目的好处是控制效果肉眼可见答辩的时候演示起来很直观。PID参数整定是一个可以深入讲的东西你可以对比不同整定方法的效果这样论文也有内容可写。提示选题的时候一定要先确认实验室有没有对应的硬件。我见过有人选了超声波测距的题目结果实验室的超声波模块坏了没人修最后只能临时换题。另外尽量选那些有开源参考设计的题目不是说让你抄而是遇到问题的时候有地方查。6. 那些年我踩过的坑和总结出的野路子6.1 调试比写代码更重要几个实用的排查手段写代码的时间可能只占整个项目周期的三分之一剩下三分之二都在调试。我总结了几条排查问题的经验都是实战中摔打出来的。第一条先确认硬件没问题再怀疑软件。LED不亮先用万用表量一下LED两端的电压看看引脚有没有输出。串口收不到数据先用示波器或者逻辑分析仪看一下TX引脚有没有波形。很多人一遇到问题就埋头改代码改了半天发现是杜邦线断了。第二条善用printf。在没有屏幕的情况下printf是你最好的朋友。你可以把关键变量的值打印出来看看程序到底走到哪一步了。但要注意printf默认是输出到标准输出在STM32上需要重定向到串口。重定向的方法是重写fputc()函数在里面调用HAL_UART_Transmit()。第三条学会看寄存器。HAL库封装得很好但有时候库函数的行为跟你预期的不一样。这时候你可以直接在调试器里查看外设的寄存器值看看实际配置成了什么样。比如你配置了GPIO输出高电平但引脚还是低你就去看GPIOx_ODR寄存器的对应位是不是1。第四条二分法定位。程序跑飞了不知道哪里的问题就在可疑的地方加标志变量逐步缩小范围。比如你怀疑是某个中断处理函数有问题就先把它注释掉看看程序还飞不飞。如果注释掉就不飞了那问题就在这个中断里。6.2 代码规范从第一天就养成好习惯我见过很多新手的代码变量名用a、b、c函数名用function1、function2注释几乎没有。这种代码写的时候爽过两周自己都看不懂。嵌入式代码尤其要注意规范因为很多时候你需要跟硬件打交道代码的可读性直接影响到调试效率。我的建议是变量名要有意义比如led_state、uart_rx_buffer、timer_count。函数名用动词开头比如GPIO_Init()、UART_SendData()、Timer_Start()。每个外设的初始化代码单独写一个函数放在main函数里按顺序调用。中断服务函数里只做最紧急的事情比如置标志位、存数据复杂的处理放到主循环里做。还有一个细节宏定义和枚举的使用。比如LED的引脚不要直接在代码里写GPIO_PIN_13而是定义一个宏LED_PIN。这样如果硬件改了你只需要改宏定义不用满代码找。状态机的状态用枚举类型比用数字0、1、2可读性好得多。6.3 学习节奏别在第一个月就放弃STM32的学习曲线是先陡后缓的。前两周你会觉得信息量爆炸每天都有新概念每天都遇到新问题。这个阶段最容易放弃因为挫败感太强了。我的建议是前两周只做一件事就是把GPIO和串口玩熟。点灯、按键、串口收发这三个东西反复练练到不用看教程就能写出来。等你对工程结构、编译流程、下载调试都熟悉了再去碰定时器和中断。第三周到第四周集中攻克定时器和中断。这两个东西是STM32的灵魂也是后面所有高级功能的基础。PWM、输入捕获、定时中断每个都自己写一遍代码不要复制粘贴。写完之后用调试器单步跟踪看看寄存器的变化理解每一步在干什么。第二个月开始可以接触ADC、DMA、I2C、SPI这些外设。这时候你会发现之前打下的基础开始发挥作用了很多概念是相通的。比如你理解了定时器的中断再理解串口的接收中断就很容易。你理解了GPIO的复用功能再理解I2C和SPI的引脚配置就很快。至于RTOS和OTA这些进阶内容我建议至少学完三个月之后再碰。不是它们有多难而是你需要足够的裸机经验来理解RTOS帮你解决了什么问题。如果你连裸机的中断嵌套都没搞明白直接看RTOS的任务调度只会一头雾水。最后说一个心态问题。学STM32的过程中你一定会遇到那种“明明按照教程做的但就是不行”的情况。这时候不要慌也不要怀疑自己。嵌入式开发涉及硬件、软件、工具链多个层面变量太多出问题是正常的。我的习惯是遇到问题先记录把现象、已经尝试过的方案、怀疑的方向都写下来然后一个一个排除。很多时候问题会在你记录的过程中自己浮现出来。
返回列表