单片机基础
MCU(Microcontroller Unit,微控制器),将CPU、内存(RAM/ROM)、外设(GPIO、UART、ADC等)集成在单一芯片上的微型计算机系统,专为嵌入式控制设计。例如:STM32(ARM Cortex-M)、ESP32(Wi-Fi/BLE)
SoC(System on Chip,片上系统),在单芯片上集成完整的系统功能,包括CPU、GPU、内存控制器、高速接口(USB/PCIe)、甚至AI加速器等,类似一台微型电脑。例如:高通骁龙、苹果A系列、华为麒麟
1. 芯片摘要
当我们拿到一款处理器时,或者说在芯片选型的过程中,我们需要对芯片的主要性能参数有一定的了解。这时候芯片手册是最重要的参考资料,我们可以快速的从中提取关键信息,来判断芯片是否符合我们的需求。
一般芯片厂商通常会提供以下几类文档(一般官网获取):
- 《xx系列数据手册》 数据手册包含单片机的主要参数信息,如串口数量、引脚定义、电气特性等,是获取关键信息的首要资料。
- 《xx系列参考手册》 参考手册(有时称为硬件手册)详细描述了单片机的体系结构、寄存器、地址映射、电源管理、复位机制等,主要面向开发者。
- 《xx系列MCU开发工具用户手册》 该手册介绍开发工具和环境的使用方法,提供示例程序和操作说明,帮助开发者快速上手。
- 《xx系列勘误表》 勘误表列出了芯片已知的问题和修正建议,是开发和调试过程中不可忽视的参考资料。
通过芯片摘要,我们可以从数据手册中快速了解其主要特性和适用场景。
重点信息包括:
- 内核类型与主频:如 ARM Cortex-M4,最高主频200MHz。
- 存储资源:如512KB Flash,256KB SRAM。
- 外设接口:如多路UART、SPI、I2C、CAN、USB、ADC、DAC等。
- 引脚数量与封装形式:如LQFP100、LQFP64等,决定了可用I/O数量和布局。
- 电气特性:工作电压范围(如2.7V~3.6V)、I/O口驱动能力等。
- 功耗参数:如待机功耗、运行功耗,影响应用场景(低功耗/高性能)。
- 工作温度范围:如-40℃~85℃,决定是否适用于工业环境。
以华大 HC32F460 系列为例,数据手册摘要如下:
参数 | 说明 |
---|---|
内核 | ARM Cortex-M4(带FPU) |
主频 | 最高200MHz |
Flash | 512KB |
SRAM | 256KB |
外设 | 4×UART, 4×SPI, 3×I2C, 1×CAN, 2×ADC, 2×DAC, PWM等 |
封装 | LQFP100, LQFP64等 |
工作电压 | 2.7V~3.6V |
工作温度 | -40℃~85℃ |
通过这些关键信息,可以初步判断该芯片是否满足项目需求,并为后续详细选型和开发打下基础。
2. AMR单片机启动流程分析
启动单片机机是我们的第一步。我们常用的单片机内核基本上都采用ARM架构,对AMR架构有一定的理解,也许有助于我们后续开发过程中问题的定位与分析?
咱也不过是拾人牙慧,只能浮于表面罢。
2.1 ARM架构
简单理解就是,ARM架构是芯片厂商基于ARM内核设计的CPU核。其中ARM内核负责执行指令,具体功能由芯片外设实现。芯片厂商在ARM内核外集成硬件模块(如GPIO、UART、ADC等),这些外设才是实际控制LED、串口通信、ADC采样的部分。我们需要通过寄存器编程或厂商提供的库函数(如STM32的HAL库)来操作这些外设,ARM内核只是帮我们运行这些代码。
待办_跳转链接
2.2 启动流程分析
这里是从网上抄来的ARM单片机(如 Cortex-M 系列)的典型启动流程:
上电复位:系统上电后,处理器复位,跳转到复位向量执行启动代码。 硬件初始化:初始化堆栈指针,设置程序计数器,禁用中断。 启动代码执行:启动代码完成基本的系统初始化,如内存初始化、堆栈指针设置、数据段和 BSS 段处理等。 系统时钟和外设初始化:设置系统时钟源,初始化关键外设,为主程序提供支持。 跳转到主程序:启动代码完成后,跳转到主程序(main()函数),开始执行用户代码。 中断处理与系统运行:系统在主程序中运行,处理器根据中断请求响应外部或内部事件。
此处参考[赤诚Xie]《MCU的启动到bootloader原理详解》1
正如[作者B]所述:
“这里是引用的原文内容……” ——《文章标题》1
graph TD
A[开始] --> B{判断}
B --> C[是]
B --> D[否]
C --> E[结束]
D --> E
@startuml
left to right direction
actor 用户 as A
component "测试工装线控器" as B
rectangle "测试工装板" as C
rectangle "待测主板" as D
A --> B
B <--> C : 485通信
C --> D : 弹性顶针
@enduml
@startmindmap
+ <&flag>OS
++ Unix
++ Linux
++ MacOS
** Windows
*** Windows 95
*** Windows 98
*** Windows 7
*** Windows 8
*** Windows 10
++ FreeBSD
++ Other
@endmindmap
2. 时钟系统
3. 复位电路
4. 中断系统
5. GPIO复用
6. DMA控制器
低功耗模式
电源控制
flash编程
ESD和锁存保护
7. 其他常见基本外设
2. I/O口
I/O口既可用作输入,也可用作输出。
本质上单片机就是对I/O口的控制,无论单片机对外界进行何种控制,都是通过I/O口进行的。接受外部的控制,通过I/O来感受外部的电压。
1.1. I/O口结构
推完输出:可以直接输出高电平或低电平,无需外部上拉电阻。本质上由两个MOS管(PMOS和NMOS)组成,一个负责拉高,一个负责拉低。
开漏输出:依赖上拉电阻输出高电平,如果不接上拉电阻,就是高阻态。只有下拉NMOS管,无上拉PMOS管。高电平需依赖外部上拉电阻。
浮空输出:电平状态不确定,易受噪声干扰。输入引脚既不接上拉也不接下拉,处于高阻态(无驱动能力)。
PS:上拉电阻就是将不确定的信号通过一个电阻拉到高电平,同时此电阻起到一个限流的作用,下拉就是下拉到低电平。
常见问题&解决办法
单片机程序烧录过程中“串电压”问题
像JLink、STLink这类仿真器一般有提供供电引脚给单片机供电。但是仿真器和目标设备(如MCU开发板)分别独立供电时,两者之间的电源系统因电势差或共地问题导致的电压异常,轻则通信失败、重则器件烧毁。
解决办法:所以在程序烧录过程中需要注意电源供电问题,确保统一供电(优先使用目标板为仿真器供电,或关闭目标板电源,仅通过仿真器供电。 )、或共地。
“ARM仿真器”问题
公司用的ARM仿真器,本来正常使用结果今天这个烧录器一直闪绿灯,我也识别不到JLink,看了下网上的说法,以为是驱动出问题了?尝试重新装了驱动,没有效果。最后换了一个仿真器,能够正常识别。
但是问题来了,重装驱动后,发现程序Keil烧录按钮灰掉了,并且设置JLink会弹出,不能加载JL2CM3.dll驱动!
尝试改了环境变量,无果。
参考 https://zhuanlan.zhihu.com/p/656208641 这篇文章解决。
解决方法:是由于装Jlink驱动的时候,勾选了JLinkARM.dll装进Keil MDK里面去了导致。可以下载老版的Keil,把“Keil安装目录\ARM\Segger”里的库都替换。但是我发现网上下载下来的JLink库太老了,找不到我现在用的芯片,于是直接从新版JLink,找到对应的库替换进去,解决。
不过JLink提示更新的弹窗,更新了就不弹了。
参考资料
-
《MCU的启动到bootloader原理详解》,[赤诚Xie] ↩ ↩2