MCU学习

本文详细介绍了如何选择合适的微控制器(MCU),包括评估MCU特性、对比项目需求、理解指令系统等内容。同时,还提供了MCU编程的基础指导,包括初始化流程、主程序循环设计及中断处理等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

任何一款MCU,其基本原理和功能都是大同小异,所不同的只是其外围功能模块的配置及数量、指令系统等。对于指令系统,虽然形式上看似千差万别,但实际上只是符号的不同,其所代表的含义、所要完成的功能和寻址方式基本上是类似的。因此,对于任何一款MCU,主要应从如下的几个方面来理解和掌握:
  * MCU的特点:要了解一款MCU,首先需要知道就是其ROM空间、RAM空间、IO口数量、定时器数量和定时方式、所提供的外围功能模块(Peripheral Circuit)、中断源、工作电压及功耗等等。
  * 了解这些MCU Features后,接下来第一步就是将所选MCU的功能与实际项目开发的要求的功能进行对比,明确那些资源是目前所需要的,那些是本项目所用不到的。对于项目中需要用到的而所选MCU不提供的功能,则需要认真理解MCU的相关资料,以求用间接的方法来实现,例如,所开发的项目需要与PC机COM口进行通讯,而所选的MCU不提供UART口,则可以考虑用外部中断的方式来实现;
  * 对于项目开发需要用到的资源,则需要对其Manua*进行认真的理解和阅读,而对于不需要的功能模块则可以忽略或浏览即可。对于MCU学习来讲,应用才是关键,也是最主要的目的。
  * 明确了MCU的相关功能后,接下来就可以开始编程了。对于初学者或初次使用此款MCU的设计者来说,可能会遇到很多对MCU的功能描述不明确的地方,对于此类问题,可以通过两种方法来解决,一种是编写特别的验证程序来理解资料所述的功能;另一种则可以暂时忽略,程序设计中则按照自己目前的理解来编写,留到调试时去修改和完善。前一种方法适用于时间较宽松的项目和初学者,而后一种方法则适合于具有一定MCU开发经验的人或项目进度较紧迫的情况;
  * 指令系统千万不要特别花时间去理解。指令系统只是一种逻辑描述的符号,只有在编程时根据自己的逻辑和程序的逻辑要求来查看相关的指令即可,而且随着编程的进行,对指令系统也会越来越熟练,甚至可以不自觉地记忆下来;
  MCU的基本功能:
  对于绝大多数MCU,下列功能是最普遍也是最基本的,针对不同的MCU,其描述的方式可能会有区别,但本质上是基本相同的:
  * Timer(定时器):Timer的种类虽然比较多,但可归纳为两大类:一类是固定时间间隔的Timer,即其定时的时间是由系统设定的,用户程序不可控制,系统只提供几种固定的时间间隔给用户程序进行选择,如32Hz,16Hz,8Hz等,此类Timer在4位MCU中比较常见,因此可以用来实现时钟、计时等相关的功能;另一类则是Programmable Timer(可编程定时器),顾名思义,该类Timer的定时时间是可以由用户的程序来控制的,控制的方式包括:时钟源的选择、分频数(Prescale)选择及预制数的设定等,有的MCU三者都同时具备,而有的则可能是其中的一种或两种。此类Timer应用非常灵活,实际的使用也千变万化,其中最常见的一种应用就是用其实现PWM输出(具体的应用,后续会有特别的介绍)。由于时钟源可以自由选择,因此,此类Timer一般均与EventCounter(事件计数器)合在一起;
  * IO口:任何MCU都具有一定数量的IO口,没有IO口,MCU就失去了与外部沟通的渠道。根据IO口的可配置情况,可以分为如下几种类型:
  ** 纯输入或纯输出口:此类IO口有MCU硬件设计决定,只能是输入或输出,不可用软件来进行实时的设定;
  ** 直接读写IO口:如MCS-51的IO口就属于此类IO口。当执行读IO口指令时,就是输入口;当执行写IO口指令则自动为输出口;
  ** 程序编程设定输入输出方向的:此类IO口的输入或输出由程序根据实际的需要来进行设定,应用比较灵活,可以实现一些总线级的应用,如I2C总线,各种LCD、LED Driver的控制总线等;
  ** 对于IO口的使用,重要的一点必须牢记的是:对于输入口,必须有明确的电平信号,确保不能浮空(可以通过增加上拉或下拉电阻来实现);而对于输出口,其输出的状态电平必须考虑其外部的连接情况,应保证在Standby或静态状态下不存在拉电流或灌电流。
  * 外部中断:外部中断也是绝大多数MCU所具有的基本功能,一般用于信号的实时触发,数据采样和状态的检测,中断的方式由上升沿、下降沿触发和电平触发几种。外部中断一般通过输入口来实现,若为IO口,则只有设为输入时其中断功能才会开启;若为输出口,则外部中断功能将自动关闭(ATMEL的ATiny系列存在一些例外,输出口时也能触发中断功能)。外部中断的应用如下:
  ** 外部触发信号的检测:一种是基于实时性的要求,比如可控硅的控制,突发性信号的检测等;而另一种情况则是省电的需要;
  ** 信号频率的测量;为了保证信号不被遗漏,外部中断是最理想的选择;
  ** 数据的解码:在遥控应用领域,为了降低设计的成本,经常需要采用软件的方式来对各种编码数据进行解码,如Manchester和PWM编码的解码;
  ** 按键的检测和系统的唤醒:对于进入Sleep状态的MCU,一般需要通过外部中断来进行唤醒,最基本的形式则是按键,通过按键的动作来产生电平的变化;
  * 通讯接口:MCU所提供的通讯接口一般包括SPI接口,UART,I2C接口等,其分别描述如下:
  ** SPI接口:此类接口是绝大多数MCU都提供的一种最基本通讯方式,其数据传输采用同步时钟来控制,信号包括:SDI(串行数据输入)、SDO(串行数据输出)、SCLK(串行时钟)及Ready信号;有些情况下则可能没有Ready信号;此类接口可以工作在Master方式或Slave方式下,通俗说法就是看谁提供时钟信号,提供时钟的一方为Master,相反的一方则为Slaver;
  ** UART(Universal Asynchronous ReceiveTransmit):属于最基本的一种异步传输接口,其信号线只有Rx和Tx两条,基本的数据格式为:Start Bit + DataBit(7-bits/8-bits) + arity Bit(Even, Odd or None) + Stop Bit(1~2Bit)。一位数据所占的时间称为Baud Rate(波特率)。对于大多数的MCU来讲,数据为的长度、数据校验方式(奇校验、偶校验或无校验)、停止位(StopBit)的长度及Baud Rate是可以通过程序编程进行灵活设定。此类接口最常用的方式就是与PC机的串口进行数据通讯。
  ** I2C接口:I2C是由Philips开发的一种数据传输协议,同样采用2根信号来实现:SDAT(串行数据输入输出)和SCLK(串行时钟)。其最大的好处是可以在此总线上挂接多个设备,通过地址来进行识别和访问;I2C总线的一个最大的好处就是非常方便用软件通过IO口来实现,其传输的数据速率完全由SCLK来控制,可快可慢,不像UART接口,有严格的速率要求。
  * Watchdog(看门狗定时器):Watchdog也是绝大多数MCU的一种基本配置(一些4位MCU可能没有此功能),大多数的MCU的Watchdog只能允许程序对其进行复位而不能对其关闭(有的是在程序烧入时来设定的,如MicrochipIC系列MCU),而有的MCU则是通过特定的方式来决定其是否打开,如Samsung的KS57系列,只要程序访问了Watchdog寄存器,就自动开启且不能再被关闭。一般而言watchdog的复位时间是可以程序来设定的。Watchdog的最基本的应用是为MCU因为意外的故障而导致死机提供了一种自我恢复的能力。
  MCU程序的编写:
  MCU的程序的编写与PC下的程序的编写存在很大的区别,虽然现在基于C的MCU开发工具越来越流行,但对于一个高效的程序代码和喜欢使用汇编的设计者来讲,汇编语言仍然是最简洁、最有效的编程语言。对于MCU的程序编写,其基本的框架可以说是大体一致的,一般分为初始化部分(这是MCU程序设计与PC最大的不同),主程序循环体和中断处理程序三大部分(见图1 a 和 b),其分别说明如下:
  * 初始化:对于所有的MCU程序的设计来讲,出世化是最基本也是最重要的一步,一般包括如
  下内容:
  ** 屏蔽所有中断并初始化堆栈指针:初始化部分一般不希望有任何中断发生;
  ** 清除系统的RAM区域和显示Memory:虽然有时可能没有完全的必要,但从可靠性及一致性的角度出发,特别是对于防止意外的错误,还是建议养成良好的编程习惯;
  ** IO口的初始化:根据项目的应用的要求,设定相关IO口的输入输出方式,对与输入口,需要设定其上拉或下拉电阻;对于输出口,则必须设定其出世的电平输出,以防出现不必要的错误;
  ** 中断的设置:对于所有项目需要用到的中断源,应该给予开启并设定中断的触发条件,而对于不使用的多余的中断,则必须给予关闭;
  ** 其他功能模块的初始化:对于所有需要用到的MCU的外围功能模块,必须按项目的应用的要求进行相应的设置,如UART的通讯,需要设定Baud Rate,数据长度,校验方式和Stop Bit的长度等,而对于Programmer Timer,则必须设置其时钟源,分频数及Reload Data等;
  ** 参数的出世化:完成了MCU的硬件和资源的出世化后,接下来就是对程序中使用到的一些变量和数据的初始化设置,这一部分的初始化需要根据具体的项目及程序的总体安排来设计。对于一些用EEPROM来保存项目预制数的应用来讲,建议在初始化时将相关的数据拷贝到MCU的RAM,以提高程序对数据的访问速度,同时降低系统的功耗(原则上,访问外部EEPROM都会增加电源的功耗)。
  * 主程序循环体:大多数MCU是属于长时间不间断运行的,因此其主程序体基本上都是以循环的方式来设计,对于存在多种工作模式的应用来讲,则可能存在多个循环体,相互之间通过状态标志来进行转换。对于主程序体,一般情况下主要安排如下的模块:
  ** 计算程序:计算程序一般比较耗时,因此坚决反对放在任何中断中处理,特别是乘除法运算;
  ** 实时性要求不高或没有实时性要求的处理程序;
  ** 显示传输程序:主要针对存在外部LED、LCD Driver的应用;
  * 中断处理程序:中断程序主要用于处理实时性要求较高的任务和事件,如,外部突发性信号的检测,按键的检测和处理,定时计数,LED显示扫描等。一般情况下,中断程序应尽可能保证代码的简洁和短小,对于不需要实时去处理的功能,可以在中断中设置触发的标志,然后由主程序来执行具体的事务――这一点非常重要,特别是对于低功耗、低速的MCU来讲,必须保证所有中断的及时响应。
  * 对于不同任务体的安排,不同的MCU其处理的方法也有所不同。例如,对于低速、低功耗的MCU(Fosc=32768Hz)应用,考虑到此类项目均为手持式设备和采用普通的LCD显示,对按键的反应和显示的反应要求实时性较高,应此一般采用定时中断的方式来处理按键的动作和数据的显示;而对于高速的MCU,如Fosc>1MHz的应用,由于此时MCU有足够的时间来执行主程序循环体,因此可以只在相应的中断中设置各种触发标志,并将所有的任务放在主程序体中来执行;
  * 在MCU的程序设计中,还需要特别注意的一点就是:要防止在中断和主程序体中同时访问或设置同一个变量或数据的情况。有效的预防方法是,将此类数据的处理安排在一个模块中,通过判断触发标志来决定是否执行该数据的相关操作;而在其他的程序体中(主要是中断),对需要进行该数据的处理的地方只设置触发的标志。――这可以保证数据的执行是可预知和唯一的。

 

----------------------------------

一、关注的参数  1、 MCU工作、以及存储的温度范围(关注)  MCU的工作温度范围为-55度~125度 MCU的存储温度范围为-65度~150度 2、 MCU供电电压的范围(关注)     2.7V~3.6V  3、 MCU的时钟系统,复位系统,各种时钟的设置,以及MCU跑到的最高主频为多少 (datasheet上会有,但需要实际测量,通过IO口输出,示波器测量),以及相应的功耗(测量)  4、 MCU性能测试,测试MCU的加、减、乘、除四种运算的计算能力,分别进行8位,16 位,32位数的四种运算测试; 测试方法:  进行for循环,测量2M次(或更高)循环下的时间,通过秒表来测量 以一个32位加法为例进行说明 unsigned long a=1000; unsigned long b=1000; unsigned long c;  for(unsigned long i=0; i<2M; i++)          ////////A {  c=a+b; }                                       //////////B   通过秒表测量从A到B点所需要的时间,如果循环次数不够多,秒表测量不出,则增加循环次数;  5、 MCU的各种休眠状态以及相应状态下的功耗;(理论参数与测量) 6、 MCU由睡眠到唤醒所需要的时间;(关注)  7、 MCU的中断消耗(主要是堆栈占用资源),即进入中断与退出中断消耗的机器周期  测量方式:在一定主频的情况下,用定时器产生中断输出,找一个管脚输出方波,不断提高方波输出的主频,然后测量在系统能够正常输出方波的最高方波主频;这样  资源中断进入退出所消耗的的机器周期切换方波主频系统主频 IO (测量)  8、 关注你所拿到的MCU的所有外设,特别是ADC、UART、DA、Timer、Watchdog等(关 注) 

 

----------------------

 

 二、

完成一项事情  要求通过MCU内带的ADC采样一个电压信号(0~2.5V), 每10秒进行一次采样作业,每次连续采样10个点,进行平均后将采样数据计算成电压信号,然后通过串口传到PC机上,进行显示,字符串显示,小数点后保留两位,然后加上单位’V’; 格式如下: *.**V   *.**V  如果有液晶屏的最好在液晶上也可以显示;

<think>好的,我现在需要帮用户解答关于MCU(微控制器)的学习路径和资源的问题。用户提到了参考资料的引用,其中一个是关于C51和8051微控制器的入门指南,另一个是AutoSAR相关的教程。首先,我得确定用户的需求是什么。他们可能刚开始学习微控制器,想从基础到精通的路线图,以及推荐的学习资源。 用户的问题提到“MCU 学习路线图 微控制器 入门到精通”,所以需要系统性地分阶段讲解。首先,我得回忆一下MCU学习的一般路径,通常分为入门、进阶、深入和高级应用几个阶段。每个阶段需要掌握不同的知识和技能。 入门阶段应该包括基本的电子知识,比如数字电路、模拟电路的基础,以及C语言的基础,因为大多数嵌入式开发都是用C。然后,选择一款常见的MCU,比如8051,因为资料多,适合初学者。这时候可以推荐用户参考引用[1]中的C51和8051的内容,指导他们搭建开发环境,学习GPIO、定时器、中断等基础外设的使用。 接下来是进阶阶段,需要更深入理解MCU的内部结构,比如时钟系统、存储器管理,以及通信协议如UART、SPI、I2C。此外,实时操作系统(RTOS)的基础知识也很重要,比如FreeRTOS,这能帮助处理多任务。同时,调试技巧如使用逻辑分析仪和示波器也是必备的。 深入阶段要接触更复杂的MCU,比如STM32或ESP32,学习高级外设如ADC、DMA、PWM,以及低功耗设计。这时候,AutoSAR可能被提及,因为用户引用了相关资源,所以需要介绍AutoSAR的基础概念和开发流程,推荐实战教程如引用[2]中的内容。 高级阶段则涉及系统级设计,比如软硬件协同设计、固件架构,以及安全性和可靠性。工业应用中的CAN总线、Modbus协议,或者物联网中的无线模块和云平台对接都是重点。此外,参与开源项目或实际项目能巩固知识。 资源推荐方面,书籍、在线课程、开发板和社区论坛都是必不可少的。需要确保推荐的书籍适合各个阶段,比如《嵌入式C语言设计模式》和《STM32库开发实战指南》。在线平台如Coursera、B站课程,以及开发板如Arduino、STM32系列。社区如Stack Overflow、电子工程世界论坛也能提供帮助。 生成的相关问题需要围绕学习路径的不同阶段,可能包括如何选择第一个MCU、C语言在嵌入式中的重要性、RTOS的必要性、AutoSAR的学习建议,以及项目经验的重要性。这些问题应该能帮助用户进一步探索每个阶段的具体内容。 最后,要检查是否符合用户的要求,比如使用正确的中文回答,LaTeX格式是否正确,引用标注是否自然。确保没有使用任何markdown格式,并且结构清晰,分点明确,便于用户理解。同时,推荐资源时要结合用户提供的引用,比如引用[1]和[2],让回答更有依据。</think>### MCU(微控制器)学习路线图:从入门到精通 #### 一、入门阶段 1. **基础电子知识** - 学习数字电路(逻辑门、寄存器、总线)和模拟电路(ADC/DAC、运算放大器)基础。 - 掌握常用工具(万用表、示波器)和元器件(电阻、电容、晶体管)的使用[^1]。 2. **C语言基础** - 从标准C语法开始,重点掌握指针、结构体、位操作等嵌入式开发常用特性。 - 练习通过C语言控制硬件,例如点亮LED或读取按键输入。 3. **选择一款经典MCU入门** - 推荐8051系列(如STC89C52),因其架构简单、资料丰富。 - 学习Keil C51开发环境,编写第一个程序(如流水灯)。 #### 二、进阶阶段 1. **深入MCU内部原理** - 理解时钟系统、存储器结构(Flash/RAM)和中断机制。 - 学习外设驱动开发:定时器、PWM、UART、SPI、I2C等。 2. **实时操作系统(RTOS)基础** - 掌握任务调度、信号量、消息队列等概念。 - 尝试在STM32或ESP32上运行FreeRTOS。 3. **调试与优化技巧** - 使用逻辑分析仪、JTAG调试器定位问题。 - 学习代码优化(减少内存占用、提高执行效率)。 #### 三、深入阶段 1. **复杂MCU与高级外设** - 转向ARM Cortex-M系列(如STM32),学习HAL库或LL库开发。 - 探索高级功能:DMA直接内存访问、低功耗模式、硬件加密。 2. **AutoSAR与汽车电子** - 理解AutoSAR分层架构(应用层、RTE、BSW)和通信协议(CAN、LIN)。 - 参考实战教程,使用Davinci工具链配置RTE和SWC[^2]。 3. **物联网与无线通信** - 学习Wi-Fi(ESP8266/32)、蓝牙(BLE)、LoRa等无线协议。 - 实现传感器数据上传云端(如阿里云、AWS IoT)。 #### 四、高级阶段 1. **系统级设计与安全** - 掌握软硬件协同设计方法,例如FPGA+MCU异构系统。 - 学习功能安全标准(ISO 26262)和固件安全防护。 2. **工业与汽车应用** - 研究工业总线(CAN、Modbus)和汽车电子ECU开发。 - 参与实际项目,例如电池管理系统(BMS)或电机控制。 --- ### 推荐学习资源 1. **书籍** - 《嵌入式C语言设计模式》 - 《STM32库开发实战指南》 - 《AutoSAR标准与实战开发》[^2] 2. **在线课程** - Coursera: 《Embedded Systems Essentials》 - B站: 8051/STM32实战教程 3. **开发板与工具** - 入门:51开发板、Arduino Uno - 进阶:STM32 Nucleo、ESP32开发板 - 调试工具:J-Link、Saleae逻辑分析仪 4. **社区与论坛** - Stack Overflow(嵌入式标签) - 电子工程世界(EEWorld) - GitHub开源项目(如FreeRTOS、LVGL) ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值