相关参考资料:技术参考手册和数据手册(要知道技术文档的作用哦)
技术参考手册是有关如何使用该产品的具体信息,包含各个功能模块的内部结构、所有可能的功能描述、各种工作模式的使用和寄存器配置等详细信息。 技术参考手册不包含有关产品技术特征的说明,这些内容在数据手册中。//就是说怎么用,相当于使用说明书
数据手册中的内容包括:产品的基本配置(如内置Flash和RAM的容量、外设模块的种类和数量等),管脚的数量和分配,电气特性,封装信息,和定购代码等。//科普一下产品里面都有些啥,相当于产品介绍了
之前零零散散的学,拿到板子就懵逼
拿到板子之后究竟首先该看些啥啊????
参考手册和数据手册?教学视频?(有大佬教教吗)以下这么多文档该用什么节奏学呢?
说实话我只看视频了,然后去copy别人的代码,东拼西凑勉强跑起来
。。。学一次忘一次,慢慢来吧
开发学什么
作为CM3的使用者,我们选择自己要用的板子时应该看些什么? 这么看?
总结一下就是(已STM32F103C8T6为例)
1.内核的最高工作频率(72MHz)
2.存储器的容量(高达128K字节的闪存和20K字节的SRAM--中等容量)
3.外设(丰富的增强I/O端口和联接到两条APB总线的外设。所有型号的器件都包含2个12位的ADC、3个通用16位定时器和1个PWM定时器,还包含标准和先进的通信接口:多达2个I2C接口和SPI接口、3个USART接口、一个USB接口和一个CAN接口。)
4.引脚(STM32F103xx中等容量增强型系列产品提供包括从36脚至100脚的6种不同封装形式;根据不同的封装形式,器件中的外设配置不尽相同。)
5.时钟速度(后面讲)
至于其他的
外中断的数目
表达优先级的位数(优先级寄存器的有效宽度)
是否配备了MPU
是否配备了ETM
对调试接口的选择(SW, JTAG或两者兼有)
这些还不太懂。。。
以后再说
4.1 内核(了解)
首先看内核吧,对应的资料应该是Cortex-M3技术参考手册,但我看的是别人精简翻译了的这个
CM3采用经典的哈佛结构
内核本身就很复杂,我觉得初学者没有必要深入了解,这里我们就了解一下它的基本情况就好了
寄存器组
操作模式
异常,嵌套向量中断
存储器映射
总线接口
存储器保护单元
指令系统
中断和异常
调试支持
1.寄存器组
Cortex-M3处理器拥有R0-R15的寄存器组。
1.1 R0-R12:通用寄存器
R0-R12都是32位通用寄存器,用于数据操作。但是注意:绝大多数16位Thumb指令只能访问R0-R7,而32位Thumb-2指令可以访问所有寄存器。
1.2 Banked R13: 两个堆栈指针
Cortex-M3拥有两个堆栈指针,然而它们是banked,因此任一时刻只能使用其中的一个。
主堆栈指针(MSP):复位后缺省使用的堆栈指针,用于操作系统内核以及异常处理例程(包括中断服务例程)
进程堆栈指针(PSP):由用户的应用程序代码使用(不处于异常服用例程中时)。
要注意的是,并不是每个程序都要用齐两个堆栈指针才算圆满。简单的应用程序只使用MSP就够了。
堆栈指针的最低两位永远是0,这意味着堆栈总是4字节对齐的。
在ARM编程领域中,凡是打断程序顺序执行的事件,都被称为异常(exception)。除了外部中断外,当有指令执行了“非法操作”,或者访问被禁的内存区间,因各种错误产生的fault,以及不可屏蔽中断发生时,都会打断程序的执行,这些情况统称为异常。在不严格的上下文中,异常与中断也可以混用。另外,程序代码也可以主动请求进入异常状态的(常用于系统调用)。
1.3 R14:连接寄存器
当呼叫一个子程序时,由R14存储返回地址
不像大多数其它处理器,ARM为了减少访问内存的次数(访问内存的操作往往要3个以上指令周期,带MMU和cache的就更加不确定了),把返回地址直接存储在寄存器中。这样足以使很多只有1级子程序调用的代码无需访问内存(堆栈内存),从而提高了子程序调用的效率。如果多于1级,则需要把前一级的R14值压到堆栈里。在ARM上编程时,应尽量只使用寄存器保存中间结果,迫不得以时才访问内存。在RISC处理器中,为了强调访内操作越过了处理器的界线,并且带来了对性能的不利影响,给它取了一个专业的术语:溅出。
1.4 R15:程序计数寄存器
指向当前的程序地址。如果修改它的值,就能改变程序的执行流(很多高级技巧就在这里面——译注)。 R15是程序计数器,在汇编代码中一般我们都都叫它的外号“PC”。因为CM3内部使用了指令流水线,读PC时返回的值是当前指令的地址+4。
1.5 特殊功能寄存器
Cortex-M3还在内核水平上搭载了若干特殊功能寄存器,包括
程序状态字寄存器组(PSRs)——程序状态寄存器在其内部又被分为三个子状态寄存器:
应用程序PSR(APSR)
中断号PSR(IPSR)
执行PSR(EPSR)
通过MRS/MSR指令,这3个PSRs即可以单独访问,也可以组合访问(2个组合,3个组合都可以)
中断屏蔽寄存器组(PRIMASK, FAULTMASK, BASEPRI)——这三个寄存器用于控制异常的使能和除能。
控制寄存器(CONTROL)——控制寄存器有两个用途,其一用于定义特权级别,其二用于选择当前使用哪个堆栈指针。由两个比特来行使这两个职能。
CONTROL[1]
在Cortex-M3的handler模式中,CONTROL[1]总是0。在线程模式中则可以为0或1。
因此,仅当处于特权级的线程模式下,此位才可写,其它场合下禁止写此位。改变处理器的模式也有其它的方式:在异常返回时,通过修改LR的位2,也能实现模式切换。这是LR在异常返回时的特殊用法,颠覆了对LR的传统使用方式,将在第5章中展开论述。
CONTROL[0]
仅当在特权级下操作时才允许写该位。一旦进入了用户级,唯一返回特权级的途径,就是触发一个(软)中断,再由服务例程改写该位。
2.操作模式
Cortex-M3处理器支持两种处理器的操作模式,还支持两级特权操作。
两种操作模式分别为:处理者模式(handler mode,以后不再把handler中译——译注)和线程模式(thread mode)。引入两个模式的本意,是用于区别普通应用程序的代码和异常服务例程的代码——包括中断服务例程的代码。
Cortex-M3的另一个侧面则是特权的分级——特权级和用户级。这可以提供一种存储器访问的保护机制,使得普通的用户程序代码不能意外地,甚至是恶意地执行涉及到要害的操作。处理器支持两种特权级,这也是一个基本的安全模型。
在CM3运行主应用程序时(线程模式),既可以使用特权级,也可以使用用户级;但是异常服务例程必须在特权级下执行。复位后,处理器默认进入线程模式,特权极访问。在特权级下,程序可以访问所有范围的存储器(如果有MPU,还要在MPU规定的禁地之外),并且可以执行所有指令。
在特权级下的程序可以为所欲为,但也可能会把自己给玩进去——切换到用户级。一旦进入用户级,再想回来就得走“法律程序”了——用户级的程序不能简简单单地试图改写CONTROL寄存器就回到特权级,它必须先“申诉”:执行一条系统调用指令(SVC)。这会触发SVC异常,然后由异常服务例程(通常是操作系统的一部分)接管,如果批准了进入,则异常服务例程修改CONTROL寄存器,才能在用户级的线程模式下重新进入特权级。
事实上,从用户级到特权级的唯一途径就是异常:如果在程序执行过程中触发了一个异常,处理器总是先切换入特权级,并且在异常服务例程执行完毕退出时,返回先前的状态(也可以手工指定返回的状态——译注)。
当处理器处在线程状态下时,既可以使用特权级,也可以使用用户级;另一方面,handler模式总是特权级的。在复位后,处理器进入线程模式+特权级。
在线程模式+用户级下,对系统控制空间(SCS)的访问将被阻止——该空间包含了配置寄存器组以及调试组件的寄存器组。除此之外,还禁止使用MRS/MSR访问刚才讲到的,除了APSR之外的特殊功能寄存器。如果以身试法,则对于访问特殊功能寄存器的,访问操作被忽略;而对于访问SCS空间的,将fault伺候。
特权等级和堆栈指针的选择均由CONTROL负责。当CONTROL[0]=0时,在异常处理的始末,只发生了处理器模式的转换。
在特权级下的代码可以通过置位CONTROL[0]来进入用户级。而不管是任何原因产生了任何异常,处理器都将以特权级来运行其服务例程,异常返回后,系统将回到产生异常时所处的级别。用户级下的代码不能再试图修改CONTROL[0]来回到特权级。它必须通过一个异常handler,由那个异常handler来修改CONTROL[0],才能在返回到线程模式后拿到特权级。
3.异常,嵌套向量中断
Cortex-M3在内核水平上搭载了一颗中断控制器——嵌套向量中断控制器NVIC(Nested Vectored Interrupt Controller)。它与内核有很深的“亲密接触”——与内核是紧耦合的。NVIC提供如下的功能:
3.1 可嵌套中断支持
可嵌套中断支持的作用范围很广,覆盖了所有的外部中断和绝大多数系统异常。外在表现是,这些异常都可以被赋予不同的优先级。当前优先级被存储在xPSR的专用字段中。当一个异常发生时,硬件会自动比较该异常的优先级是否比当前的异常优先级更高。如果发现来了更高优先级的异常,处理器就会中断当前的中断服务例程(或者是普通程序),而服务新来的异常——即立即抢占。
3.2 向量中断支持
当开始响应一个中断向量表,并且根据中断号从表中找出ISR的入口地址,然后跳转过去执行。这么一来,中断延迟时间大为缩短。举个例子,如果发生了异常11(SVC),则NVIC会计算出偏移移量是11x4=0x2C,然后从那里取出服务例程的入口地址并跳入。要注意的是这里有个另类:0号类型并不是什么入口地址,而是给出了复位后MSP的初值。
3.3 动态优先级调整支持
软件可以在运行时期更改中断的优先级。
3.4 中断延迟大大缩短
自动的现场保护和恢复,用于缩短中断嵌套时的ISR间延迟。详情请见“咬尾中断”和“晚到中断”。
3.5 中断可屏蔽
既可以屏蔽优先级低于某个阈值的中断/异常(设置BASEPRI寄存器),也可以全体封杀(设置PRIMASK和FAULTMASK寄存器)。这是为了让时间关键(time-critical)的任务能在死线(deadline,或曰最后期限)到来前完成,而不被干扰。
标签:4.1,中断,特权,内核,寄存器,堆栈,异常,处理器 From: https://blog.csdn.net/V85042/article/details/137002691