Cortex-M3中8种GPIO状态

合集下载

列举gpio的工作模式

列举gpio的工作模式

列举gpio的工作模式GPIO(General Purpose Input Output)是一种通用的输入输出端口,被广泛地应用于单片机和嵌入式系统中。

GPIO工作模式对于嵌入式软件开发非常重要,因为它可以控制硬件设备的输入输出操作。

以下是GPIO的几种工作模式。

1. 输入模式(INPUT mode):GPIO被设置为输入模式时,它可以接收外部设备发送过来的电信号,并将其转化为数字信号,然后传送给处理器进行处理。

该工作模式可以用于传感器的数据采集。

2. 输出模式(OUTPUT mode):输出模式允许我们将数字信号发送到外部设备,控制它们的操作。

在输出模式下,我们可以将GPIO引脚设置为高电平或低电平,来控制呼吸灯、蜂鸣器或者马达等设备的工作状态。

3. 模拟输入模式(ANALOGUE INPUT mode):模拟输入模式允许我们将模拟信号传递到GPIO引脚上。

模拟信号可以是从传感器等设备采样得到的原始数据。

4. PWM输出模式(PWM OUTPUT mode):PWM(Pulse Width Modulation)也是一种输出模式。

该工作模式允许我们通过PWM信号来控制输出的电压和电流。

例如,我们可以使用PWM来控制直流电机的转速。

5. 硬件中断(HARDWARE INTERRUPT)模式:硬件中断是一个非常重要的GPIO工作模式。

它允许外部设备通过GPIO发出中断请求信号,从而通知处理器有重要事件已经发生,需要进行处理。

以上五种工作模式是GPIO在嵌入式系统中常用的模式。

可以根据不同的硬件设备和应用场景来选择适合的GPIO工作模式。

GPIO作为嵌入式系统中的通用输入输出端口,它可以带来更多的灵活性和可扩展性。

STM32的8种输入输出方式

STM32的8种输入输出方式

如图所示,推挽放大器的输出级有两个“臂”(两组放大元件),一个输入高电平时,输出端的电流将是下级门从本级电源经VT3拉出。

这样一来,输出高低电平时,VT3 一路和 VT5 一路将交替工作,从而减低了功耗,提高了每个管的承受能力。

又由于不论走哪一路,管子导通电阻都很小,使RC常数很小,转变速度很快。

因此,推拉式输出级既提高电路的负载能力,又提高开关速度。

开漏输出:输出端相当于三极管的集电极. 要得到高电平状态需要上拉电阻才行. 适合于做电流型的驱动,其吸收电流的能力相对强(一般20ma以内).开漏形式的电路有以下几个特点:1. 利用外部电路的驱动能力,减少IC内部的驱动。

当IC内部MOSFET导通时,驱动电流是从外部的VCC流经R pull-up,MOSFET到GND。

IC内部仅需很下的栅极驱动电流。

2. 一般来说,开漏是用来连接不同电平的器件,匹配电平用的,因为开漏引脚不连接外部的上拉电阻时,只能输出低电平,如果需要同时具备输出高电平的功能,则需要接上拉电阻,很好的一个优点是通过改变上拉电源的电压,便可以改变传输电平。

比如加上上拉电阻就可以提供TTL/CMOS电平输出等。

(上拉电阻的阻值决定了逻辑电平转换的沿的速度。

阻值越大,速度越低功耗越小,所以负载电阻的选择要兼顾功耗和速度。

)3. OPEN-DRAIN提供了灵活的输出方式,但是也有其弱点,就是带来上升沿的延时。

因为上升沿是通过外接上拉无源电阻对负载充电,所以当电阻选择小时延时就小,但功耗大;反之延时大功耗小。

所以如果对延时有要求,则建议用下降沿输出。

4. 可以将多个开漏输出的Pin,连接到一条线上。

通过一只上拉电阻,在不增加任何器件的情况下,形成“与逻辑”关系。

这也是I2C,SMBus等总线判断总线占用状态的原理。

补充:什么是“线与”?:在一个结点(线)上, 连接一个上拉电阻到电源 VCC 或 VDD 和 n 个 NPN 或 NMOS 晶体管的集电极 C 或漏极 D, 这些晶体管的发射极 E 或源极 S 都接到地线上, 只要有一个晶体管饱和, 这个结点(线)就被拉到地线电平上. 因为这些晶体管的基极注入电流(NPN)或栅极加上高电平(NMOS),晶体管就会饱和, 所以这些基极或栅极对这个结点(线)的关系是或非 NOR 逻辑. 如果这个结点后面加一个反相器, 就是或 OR 逻辑.其实可以简单的理解为:在所有引脚连在一起时,外接一上拉电阻,如果有一个引脚输出为逻辑0,相当于接地,与之并联的回路“相当于被一根导线短路”,所以外电路逻辑电平便为0,只有都为高电平时,与的结果才为逻辑1。

cortex-m3异常和中断

cortex-m3异常和中断

0.前言本文想解决的问题有:•如何开启、关闭中断•如何开启、关闭异常•LPC177x/8x支持的中断优先级个数•复位后,异常/中断默认的优先级•如何设置异常/中断的优先级•什么是优先级组,如何设置优先级组,复位后的优先级组1. Cortex-M3的异常/中断屏蔽寄存器组注:只有在特权级下,才允许访问这3个寄存器。

名字功能描述PRIMASK 只有单一比特的寄存器。

置为1后,就关掉所有可屏蔽异常,只剩下NMI和硬Fault可以响应。

默认值是0,表示没有关闭中断。

FAULTMASK 只有单一比特的寄存器。

置为1后,只有NMI可以响应。

默认值为0,表示没有关异常。

BASEPRI 该寄存器最多有9位(由表达优先级的位数决定)。

定义了被屏蔽优先级的阈值。

当它被设置为某个值后,所有优先级号大于等于此值的中断都被关。

若设置成0,则不关断任何中断,0为默认值。

注:寄存器BASEPRI的有效位数受系统中表达优先级的位数影响,如果系统中只使用3个位来表达优先级,则BASEPRI有意义的值仅为0x00、0x20、0x40、0x60、0x80、0xA0、0xC0和0xE0使用MRS/MSR指令访问这三个寄存器,比如:MRS R0, BASEPRI ;读取BASEPRI到R0中MSR BASEPRI, R0 ;将R0数据写入到BASEPRI中为了快速的开关中断,CM3还专门设置了一条CPS指令,有四种用法:CPSID I ;PRIMASK=1,关中断CPSIE I ;PRIMASK=0,开中断CPSID F ;FAULTMASK=1,关异常CPSIE F ;FAULTMASK=0,开异常CMSIS-M3微控制器软件接口标准中的core_cm3.h给出了开关中断或异常的函数:1.1 开/关中断1:/**2: * @brief Set the Priority Mask value3: *4: * @param priMask PriMask5: *6: * Set the priority mask bit in the priority mask register7: */8:static __INLINE void __set_PRIMASK(uint32_t priMask)9: {10:register uint32_t __regPriMask __ASM("primask");11: __regPriMask = (priMask);12: }使用__set_PRIMASK(1)关闭中断;__setPRIMASK(0)开启中断。

Cortex-M3寄存器等基础知识

Cortex-M3寄存器等基础知识

Cortex-M3寄存器等基础知识1.寄存器 CM3拥有R0~R15通⽤寄存器和⼀些特殊功能寄存器 R0~R12这些通⽤寄存器,复位初始值都是不可预料的2.CM3有R0到R15的通⽤寄存器组注:绝⼤部分的16位thumb只能访问R0到R7,⽽32位thumb-2可以访问全部寄存器3.特殊功能寄存器3.1程序状态寄存器组(应⽤程序PSR+中断号PSR+执⾏PSR)3.2中断屏蔽寄存器组:⽤于控制异常的除能和使能3.3控制寄存器:⽤于定义特权级别和当前使⽤哪个堆栈指针4.操作模式和特权级别:两种操作模式(处理器模式):Handler模式和线程模式(⽤于区分异常服务例程的代码和普通程序的代码)两种特权等级:特权级和⽤户级(是指在硬件层⾯上对存储器访问权限的设置)注:CM3在运⾏主程序(即线程模式)可以使⽤特权级别和⽤户级别;但是异常服务例程(即handler模式)只能使⽤特权级别。

当处于线程+⽤户模式时⼀些访问权限将被禁⽌将代码区分成⽤户级和特权级,有利于程序架构的稳定,如某⼀个⽤户代码出问题,不会使其成为害群之狗,因为⽤户级别的代码是禁⽌对⼀些要害寄存器操作的。

5.异常处理5.1CONTROL[0]=0;5.2CONTROL[0]=1;CONTROL[0]只有在特权级别下可以访问,若在⽤户级别想访问先通过"系统服务呼叫指令(SVC)"来触发SVC异常,然后在该异常的服务例程中可以修改CONTROL[0]。

6.下⾯是各操作模式的转换7.异常和中断可以有11个系统异常和最多240个外部中断(IRQ),具体芯⽚使⽤了多少要看芯⽚制造⼚商。

 作为中断功能的强化,NVIC 还有⼀条NMI输⼊信号线,具体做什么由芯⽚制造商决定,NMI(not masked interrupted)8.向量表:当⼀个异常被CM3内核接受。

对应的异常Handler就会执⾏,向量表⽤来决定Handler的⼊⼝地址。

Cortex-M3中8种GPIO状态

Cortex-M3中8种GPIO状态

在Cortex-M3里,对于GPIO的配置种类有8种之多:1)GPIO_Mode_AIN模拟输入;2)GPIO_Mode_IN_FLOATING浮空输入;3)GPIO_Mode_IPD下拉输入;4)GPIO_Mode_IPU上拉输入;5)GPIO_Mode_Out_OD开漏输出;6)GPIO_Mode_Out_PP推挽输出;7)GPIO_Mode_AF_OD复用开漏输出;8)GPIO_Mode_AF_PP复用推挽输出;图1 GPIO基本结构图1.GPIO_Mode_AIN模拟输入图2GPIO模拟输入结构图信号从左边编号1的端口进入,从右边编号2的一端直接进入ADC模块。

所有的上拉、下拉电阻和施密特触发器,均处于断开状态,因此“输入数据寄存器”将不能反映端口上的电平状态,也就是说,模拟输入配置下,CPU不能在“输入数据寄存器”上读到有效的数据。

2.GPIO_Mode_IN_FLOATING浮空输入图3GPIO浮空输入结构图浮空输入模式:在这张图上,虚线框部分处于不工作状态,尤其是下半部分的输出电路,实际上是与端口处于隔离状态。

黄色的高亮部分显示了数据传输通道,外部的电平信号通过左边编号1的I/O端口进入STM32,经过编号2的施密特触发器的整形送入编号3的“输入数据寄存器”,在“输入数据寄存器”的另一端(编号4),CPU可以随时读出I/O 端口的电平状态。

3.GPIO_Mode_IPD下拉输入图4GPIO下拉输入结构图输入下拉模式:数据通道的下部,接入了一个下拉电阻,根据STM32的数据手册,这个下拉电阻阻值也是介于30K~50K欧姆。

4.GPIO_Mode_IPU上拉输入图5GPIO上拉输入结构图输入上拉模式:与前面的浮空输入模式相比,仅仅是在数据通道上部,接入了一个上拉电阻,根据STM32的数据手册,这个上拉电阻阻值介于30K~50K欧姆。

同样,CPU可以随时在“输入数据寄存器”的另一端,读出I/O端口的电平状态。

Cortex-M3 (NXP LPC1788)之GPIO

Cortex-M3 (NXP LPC1788)之GPIO

Cortex-M3 (NXP LPC1788)之GPIO经过前一篇的分析,现在可以进入C 环境进行各个模块的学习。

首先进行简单的GPIO 控制LED 灯的操作,开发板通过GPIO1.18 控制LED 灯,电路如下图:为了对LPC1788 的内部结构有更好的理解和学习,虽然NXP 给出了封装好的库函数,但是我将自己编写代码便于直接对内部原理进行分析。

代码如下#definerFIO1DIR(*(volatileunsigned*)0x20098020)//高速GPIO 方向控制寄存器,用于配置管脚的输入或输出,默认为输入#definerFIO1MASK(*(volatileunsigned*)0x20098030)//高速GPIO 屏蔽寄存器,被屏蔽的位将不能进行GPIO 的控制操作,默认无效#definerFIO1PIN(*(volatileunsigned*)0x20098034)//高速GPIO 管脚值寄存器,可以操作未被FIOXMASK 屏蔽的GPIO 端口#definerFIO1SET(*(volatileunsigned*) 0x20098038)//高速GPIO 管脚置位寄存器,置一操作使相应位输出高电平#definerFIO1CLR(*(volatileunsigned*)0x2009803c)//高速GPIO 管脚清楚寄存器,置一操作使相应位输出低电平voidDelay(int);intmain(void){rFIO1DIR|=(1OUTPUTwhile(1){rFIO1SET|=(1 程序比较简单,对于GPIO 的操作我们可以使用输出置位寄存器FIOXSET 和输出清零寄存器FIOXCLR 进行操作,也可以直接使用GPIO 管脚值寄存器FIOXPIN 进行操作。

程序最后写了一个void SystemInit(void)空函数,是因为在启动程序startup_LPC177x_8x.S 中IMPORT SystemInit 声明了一个外部函数,并且LDR R0, =SystemInit 执行该函数。

Cortex-M3指令小结

Cortex-M3指令小结

Cortex-M3指令小结此附录实际上是从Cortex-M3技术参考手册中译版摘抄并改编的。

并且在可能的情况下,使用类C 语言的风格来讲解指令的功能。

另外要解释的是U8表示unsigned char,无符号16位整数U16表示unsigned short,无符号16位整数S8表示signed char,带符号8位整数S16表示signed short,带符号16位整数缺省情况下,如果使用普通的char和short,都是指带符号整数当借C语言的数组表示法,如Rn[Rm]时,是按整数运算的方式求得Rn+Rm的值,然后把该值当作一个32位地址,再取出该地址的值。

在计算地址时,并不乘以“数据类型所占用的字节数”,这与C语言的数组/指针运算是概念上的不同,切记切记!简单地概括,这里的Rn[Rm]等效于*( (U32 *) (Rn+Rm) ),其中Rn,Rm均为32位整数类型还有两条重要的通用规则:z凡是在指令中有可选的预移位操作的,预移位后的值是中间结果,不写回被移位的寄存器z凡是在{S}的指令中使用了S后缀的,都按照运算结果更新APSR中的标志位。

表1-1 16位Cortex-M3指令汇总操作 汇编指令Rd+= Rm+C ADC <Rd>, <Rm>Rd= Rn+Imm3ADD <Rd>, <Rn>, #<immed_3>Rd+= Imm8ADD <Rd>, #<immed_8>Rd=Rn+Rm ADD <Rd>, <Rn>, <Rm>Rd+=Rm ADD <Rd>, <Rm>Rd=PC+Imm8*4ADD <Rd>, PC, #<immed_8>*4Rd=SP+Imm8*4ADD <Rd>, SP, #<immed_8>*4Rd=SP+Imm7*4 或SP+=Imm7*4ADD <Rd>, SP, #<immed_7>*4或 ADD SP, SP, #<immed_7>*4AND <Rd>, <Rm>Rd &= RmASR <Rd>, <Rm>, #<immed_5> Rd = Rm 算术右移 Imm5Rd 算术右移= Imm5 ASR <Rd>, <Rs>操作汇编指令 按<contd>条件决定是否分支B<cond> <target address> 无条件分支B<tartet address> Rd &= ~RsBIC <Rd>, <Rs> 软件断点BKPT <immed_8> 带链接分支BL <Rm> 比较结果不为零时分支CBNZ <Rn>, <label> CBZ <Rn>, <Rm> 比较结果为零时分支CMN <Rn>, <Rm> 将Rm取二进制补码后再与Rn比较(注意:不是取反)CMP <Rn>, #<immed_8> Rn与 8位立即数比较 ,并根据结果更新标志位的值CMP <Rn>, <Rm> Rn与Rm比较,并根据结果更新标志位的值CMP <Rn>, <Rm> 高寄存器与高或低寄存器比较,并根据结果更新标志位的值。

Cortex-M3 GPIO接口配置和中断管理

Cortex-M3 GPIO接口配置和中断管理

GPIO接口配置和中断管理一、中断管理1.Cortex-M3 处理器和嵌套向量中断控制器Cortex-M3 处理器和嵌套向量中断控制器(NVIC)对所有异常按优先级进行排序并处理。

出现异常时,自动将处理器状态保存到堆栈中,并在中断服务程序(ISR)结束时自动从堆栈中恢复。

中断数目可配置为1~240。

中断优先级的数目可配置为1~8 位(1~256 级)。

下图显示了异常类型,优先级以及位置。

位置是指与向量表开始处的字偏移。

在优先级列中,数字越小表示优先级越高。

表中还显示了异常类型的激活方式,即是同步的还是异步的。

优先级的准确含义和使用见异常优先级。

NVIC支持由软件指定的优先级。

通过对中断优先级寄存器的8位PRI_N区执行写操作,来将中断的优先级指定为0~255。

CM3 支持中断嵌套,使得高优先级异常会抢占(preempt)低优先级异常。

有3个系统异常:复位,NMI以及硬 fault,它们有固定的优先级,并且它们的优先级号是负数,从而高于所有其它异常。

所有其它异常的优先级则都是可编程的(但不能编程为负数)。

当发生了异常并且要响应它时, CM3 需要定位其处理例程的入口地址。

这些入口地址存储在所谓的“(异常)向量表”中当中断输入脚被 assert 后,该中断就被悬起。

即使后来中断源取消了中断请求,已经被标记成悬起的中断也被记录下来。

到了系统中它的优先级最高的时候,就会得到响应。

2.CM3响应一个中断a)入栈当处理器调用异常时,它自动将下面的 8 个寄存器按以下顺序压栈:PCxPSRr0~r3r12LR在完成压栈之后, SP 减小8个字。

入栈保护R0‐R3以及R12的原因:有一套的C函数调用标准约定(《 C/C++ Procedure Call Standard for the ARM Architecture》,AAPCS, Ref5)。

原因就在它上面:它使得中断服务例程能用C语言编写,编译器优先使用被入栈的寄存器来保存中间结果。

cortex

cortex

cortex(STM32)是cortex-m3内核(芯片),拥有cortex-m3的特性,以下介绍了cortex-m3的特权级别。

1、先来说一下操作模式:cortex-m3有两种操作模式:笔者觉得也可以称为代码执行模式,线程模式(thre(ad)mode)和异常模式(handler mode),用于表示处理器在执行什么代码。

thread mode:执行非异常代码,也就是用户代码。

handler mode:执行异常代码,如中断服务程序。

2、再来说一下特权级别:cortex-m3有两种权利级别:特权级(Privilege)和用户级(user)。

这两种模式主要用于阻止对(硬件)的异常访问,比如存储资源、关键(寄存器)等。

特权级别:能够访问硬件所有存储资源,能够执行所有指令。

用户级别:禁止使用MSR和M(RS)访问特殊功能寄存器(APSR 除外),不能使用CPS指令。

对系统控制空间的访问有限制,即,不能访问system (ti)ck、NVIC、system control block(SCB)。

如何才能在这两个级别切换呢?答案是修改寄存器CONTROL[0]。

这个寄存器只能在特权级别下修改,用户级别下是不能修改此寄存器的,要想从用户级别转到特权级别,只能进入异常/中断,然后在异常/中断中修改寄存器,因为在异常/中断中总是特权级别。

在线程模式,可以是特权级,也可以是用户级。

handler模式总是特权级的。

在复位后,处理器处于线程模式+特权级。

3、介绍一下系统控制空间(SCS):系统控制空间(system control space):在地址空间的位置,如下图所示,地址区间0xE000E000-0xE000F000,这部分区域包含:System control block、system tick、Nested Vectored Interrupt Controller(NVIC)、PMU等。

这些寄存器是处理器能够工作的根本,必须有相应权限才能修改,即,特权级才能修改。

第三讲_Cortex-M3基础

第三讲_Cortex-M3基础



R15:程序计数寄存器(PC)

指向当前的程序地址。 如果修改它的值,就能改变程序的执行。

寄存器
特殊功能寄存器
Cortex‐M3 还在内核上搭载了若干特殊功能寄存器,包 括: 程序状态字寄存器组PSRs;


中断屏蔽寄存器组PRIMASK, FAULTMASK, BASEPRI; 控制寄存器CONTROL。



位带操作的概念其实30年前就有了,8051 单片机开创的 先河。这里的位带操作是8051 位寻址区的威力大幅加强 版。 CM3 使用如下术语来表示位带存储的相关地址 位带区: 支持位带操作的地址区; 位带别名: 对别名地址的访问最终作用到带区的访问 上(注意:这中途有一个作地址映射过程)。

可嵌套中断支持
可嵌套中断支持的作用范围很广,覆盖了所有的外部中断 和绝大多数系统异常。 外在表现是:这些异常都可以被赋予不同的优先级,当前 优先级被存储在xPSR 的专用字段中。当一个异常发生时, 硬件会自动比较该异常的优先级是否比当前的异常优先级 更高。 如果发现来了更高优先级的异常,处理器就会中断当前的 中断服务程序,而服务新来的异常,这个过程立即抢占。

系统总线用于访问内存和外设,覆盖的区域包括SRAM, 片上外设,片外RAM,片外外设等。 CM3 处理器的总线接口是基于AHB和APB 协议的,它们 的规格在AMBA 规格书中给出。

I-Code 总线

当CPU响应中断、保护断点之后,就要进行中断源的识别, 即寻找中断源,找到相应的中断服务程序入口。 识别中断源有三种方法:查询法、向量法和强置程序计数 器法(已被淘汰)。

查询法

通过程序来查询是哪一个中断源提出的中断请求。 过程:在CPU响应中断之后,对所有的中断,都进入到这个 查询流程。先看中断源1是否提出请求,若是,转去执行中断 源1的中断服务程序;否则再看中断源2是否提出请求,若是, 转去执行中断源2的中断服务程序。否则继续查看后面的中断 源…。 查询的顺序决定了中断的优先级。当发现一个中断源提出中 断请求后,就转去执行相应的服务程序,而不再继续向下查 找,不管它们是否也提出了请求。中断源1的级别最高,中断 源2的级别次之,中断源n的级别最低。

STM32单片机的八种IO口模式解析

STM32单片机的八种IO口模式解析

STM32单片机的八种IO口模式解析
STM32八种IO口模式区别
(1)GPIO_Mode_AIN模拟输入
(2)GPIO_Mode_IN_FLOATING浮空输入
(3)GPIO_Mode_IPD下拉输入
(4)GPIO_Mode_IPU上拉输入
(5)GPIO_Mode_Out_OD开漏输出
(6)GPIO_Mode_Out_PP推挽输出
(7)GPIO_Mode_AF_OD复用开漏输出
(8)GPIO_Mode_AF_PP复用推挽输出
以下是详细讲解
(1)GPIO_Mode_AIN模拟输入
即关闭施密特触发器,将电压信号传送到片上外设模块(不接上、下拉电阻)
(2)GPIO_Mode_IN_FLOATING浮空输入
浮空输入状态下,IO的电平状态是不确定的,完全由外部输入决定,如果在该引脚悬空的情况下,读取该端口的电平是不确定的
(3)GPIO_Mode_IPD下拉输入GPIO_Mode_IPU上拉输入
一般来讲,上拉电阻为1K-10K,电阻越小,驱动能力越强
电阻的作用:防止输入端悬空,减少外部电流对芯片的干扰,限流;,增加高电平输出时的驱动能力。

上拉输入:在默认状态下(GPIO引脚无输入)为高电平
下拉输入:在默认状态下(GPIO引脚无输入)为低电平
(4)GPIO_Mode_Out_OD开漏输出
开漏输出:输出端相当于三极管的集电极。

要得到高电平状态需要上拉电阻才行。

适合于做电流型的驱动,。

GPIO的8种模式详解

GPIO的8种模式详解
8种模式详解
和stm32的GPIO相关的寄存器有 (1)两个32位的配置寄存器(GPIOX_CRL,GPIOX_CRH) 每一个IO占用4位,16个IO占用64位就是两个32为寄存器。 其中CNF[1:0]是用来配置模式的,其定义如下 MODE[1:0]是用来配置输入输出模式及输出模式下的端口速率的 (2)端口输入数据寄存器(GPIOX_IDR) 其中高16位是保留的,低十六位对应着16个IO口的数据位。 (3)端口输出数据寄存器(GPIOX_ODR) 其中高16位是保留的,低十六位对应着16个IO口的数据位。 (4)端口位设置/清除寄存器(GPIOX_BSRR) 其中的每一位的定义如下: (5)端口位清除寄存器(GPIOX_BRR) 前面的16位是保留的,后面的十六位的定义如下: (6)端口配置锁定寄存器(GPIOX_LCKR)

cortexm3处理器工作模式及中断过程

cortexm3处理器工作模式及中断过程

cortexm3处理器工作模式及中断过程cortexm3处理器工作模式及中断过程1. 工作模式线程模式(Thread mode):处理器复位或异常退出时为此模式。

处理模式(Handler mode):出现异常(包括中断)时进入此模式,此模式下所有代码为特权访问。

2. 工作状态Thumb状态(正常执行指令状态)和调试状态3. 代码限权特权访问:对处理器资源拥有完全访问限权;处理器复位后进入此访问模式;清零CONTROL[0]进入用户模式。

用户访问:禁止访问多数系统寄存器。

只能通过进入异常(中断)来返回特权模式。

4. M3寄存器r0-r12:通用寄存器,其中r8-r12只能被32位指令访问。

r13(SP):堆栈指针;线程模式时可以在线程堆栈和主堆栈之间切换,但处理模式只使用主堆栈。

两个堆栈同一时刻只有一个可见,进入、退出异常时自动切换堆栈。

r14(LR):链接寄存器,保存子程序或异常的返回地址(要实现嵌套,必须入栈)。

r15(PC):程序计数器xPSR:特殊用途的程序状态寄存器5. 异常进入异常步骤:1.处理器在当前堆栈上把xPSR、PC、LR、r12、r3~r0八个寄存器自动依次入栈。

2.读取向量表(如果是复位中断,更新SP值)3.根据向量表更新PC值4.加载新PC处的指令(2、3、4步与1步同时进行)5.更新LR为EXC_RETURN(EXC_RETURN表示退出异常后返回的模式及使用的堆栈)。

退出异常步骤:1. 根据EXC_RETURN指示的堆栈,弹出进入中断时被压栈的8个寄存器。

2. 从刚出栈的IPSR寄存器[8:0]位检测恢复到那个异常(此时为嵌套中断中),若为0则恢复到线程模式。

3. 根据EXC_RETURN,选择使用相应SP。

末尾连锁(Tail-chaining):当前正在执行中断,又有一个中断到来且这个中断优先级比正在执行的中断优先级低(如果有其他被压栈的低优先级中断则要比这些中断优先级高),这个中断暂时被挂起,等到当前中断执行完后不再执行堆栈操作,而直接进入挂起的中断。

Cortex-M3寄存器总汇

Cortex-M3寄存器总汇

Cortex-M3寄存器总汇1、应用程序中断及复位控制寄存器 AIRCR(0XE000ED0C)AIRCR-地址0XE000ED0C注:LPC1752支持32个优先级,在周立功程序中不对优先级分组,即无子优先级,只有抢占优先级。

2、LR异常返回值:EXC_RETURN3、复位源标识寄存器RSID(0x400FC180)RSID-地址0x400FC180上电复位的优先级最高,可清除其它复位标志;面看门狗复位优先级最低,其它任何一类复位都可清除它的标志。

掉电复位和外部复位优先级相同,因而不能清除对方标志。

4、系统控制和状态寄存器SCS -( 0x400F C1A0)系统控制和状态寄存器SCS –地址0x400FC1A05、时钟源选择寄存器CLKSRCSEL –(0x400F C10C)时钟源选择寄存器CLKSRCSEL 地址0x400FC10C6、PLL0STAT状态寄存器对应关系图:7、PLL0控制寄存器PLL0CON –( 0x400F C080)PLL0控制寄存器PLL0CON –地址 0x400FC0808、PLL0配置寄存器PLL0CFG –(0x400F C084)PLL0配置寄存器PLL0CFG–地址0x400FC0849、PLL0状态寄存器PLL0STAT –( 0x400F C088)PLL0状态寄存器PLL0STAT–地址0x400FC08810、PLLE0和PLLC0的组合表11、PLL0馈送寄存器PLL0FEED –(0x400F C08C)PLL0馈送寄存器PLL0FEED –地址0x400FC08C11、PLL1控制寄存器PLL1CON –( 0x400F C0A0)PLL0控制寄存器PLL0CON –地址 0x400FC0A012、PLL1配置寄存器PLL1CFG –(0x400F C0A4)PLL1配置寄存器PLL1CFG–地址0x400FC0A413、PLL1状态寄存器PLL1STAT –(0x400F C0A8)PLL1状态寄存器PLL1STAT –地址0x400FC0A814、PLLE1和PLLC1的组合表15、PLL1馈送寄存器PLL1FEED –(0x400F C0AC)PLL1馈送寄存器PLL1FEED –地址0x400FC0AC16、CPU 时钟配置寄存器CCLKCFG –(0x400F C104)PU 时钟配置寄存器CCLKCFG –地址0x400FC104PLL0输出经过分频后可供CPU 或USB 子系统使用,如果使能PLL1,那么PLL1就作为USB 子系统时钟源。

介绍gpio的八种工作模式,特点及应用场景

介绍gpio的八种工作模式,特点及应用场景

【主题】介绍GPIO的八种工作模式,特点及应用场景在嵌入式系统中,GPIO(General Purpose Input/Output)是一个非常重要的概念。

它代表了通用的输入输出端口,可以用于连接外部设备,实现数据的输入和输出。

GPIO的工作模式及其特点对于嵌入式系统的设计与应用至关重要。

在本文中,我们将详细介绍GPIO的八种工作模式、特点及应用场景。

---1. 综述GPIO作为嵌入式系统中的通用输入输出端口,其工作模式的选择对于系统的功能和性能有着重要的影响。

在不同的应用场景下,需要选择合适的工作模式来满足需求。

接下来,我们将对GPIO的八种工作模式进行介绍,并分析其特点及应用场景。

2. 输入模式在输入模式下,GPIO用于从外部设备中读取数据。

它可以接收不同的信号,并将其转换成数字形式以供系统使用。

输入模式的特点是稳定可靠,适用于需要读取外部传感器数据的场景,比如温度传感器、光敏电阻等。

3. 输出模式与输入模式相反,输出模式下的GPIO用于向外部设备输出信号。

它可以将处理过的数据发送到外部设备,控制外部设备的状态。

输出模式的特点是灵活可控,适用于需要控制外部执行机构的场景,比如马达控制、LED灯控制等。

4. 开漏输出模式开漏输出模式是一种特殊的输出模式,它可以实现对外部设备的无源控制。

在这种模式下,GPIO既能输出低电平信号,也能将引脚置为高阻态。

开漏输出模式的特点是适用于多个设备共用同一信号线的场景,可以有效地避免信号冲突。

5. 推挽输出模式与开漏输出模式相对,推挽输出模式可以实现对外部设备的有源控制。

在这种模式下,GPIO能够输出高电平和低电平信号,可以直接驱动外部负载。

推挽输出模式的特点是输出电流大,适用于需要输出高电平和低电平信号的场景,比如驱动电机、蜂鸣器等。

6. 互斥输入模式互斥输入模式是一种特殊的输入模式,它可以实现对外部设备的互斥访问。

在这种模式下,GPIO可以实现对多个输入信号的轮询,并且只有一个信号被激活。

的STM 八种IO口模式讲解 已经标注 新手必备

的STM 八种IO口模式讲解 已经标注 新手必备

以及上拉输入、下拉输入、浮空输入、模拟输入的区别最近在看数据手册的时候,发现在Cortex-M3里,对于GPIO的配置种类有8种之多:(1)GPIO_Mode_AIN 模拟输入(2)GPIO_Mode_IN_FLOATING 浮空输入(3)GPIO_Mode_IPD 下拉输入(4)GPIO_Mode_IPU 上拉输入(5)GPIO_Mode_Out_OD 开漏输出(6)GPIO_Mode_Out_PP 推挽输出(7)GPIO_Mode_AF_OD 复用开漏输出(8)GPIO_Mode_AF_PP 复用推挽输出对于刚入门的新手,我想这几个概念是必须得搞清楚的,平时接触的最多的也就是推挽输出、开漏输出、上拉输入这三种,但一直未曾对这些做过归纳。

因此,在这里做一个总结:推挽输出:可以输出高,低电平,连接数字器件; 推挽结构一般是指两个三极管分别受两互补信号的控制,总是在一个三极管导通的时候另一个截止。

高低电平由IC的电源低定。

推挽电路是两个参数相同的三极管或MOSFET,以推挽方式存在于电路中,各负责正负半周的波形放大任务,电路工作时,两只对称的功率开关管每次只有一个导通,所以导通损耗小、效率高。

输出既可以向负载灌电流,也可以从负载抽取电流。

推拉式输出级既提高电路的负载能力,又提高开关速度。

详细理解:如图所示,推挽放大器的输出级有两个“臂”(两组放大元件),一个“臂”的电流增加时,另一个“臂”的电流则减小,二者的状态轮流转换。

对负载而言,好像是一个“臂”在推,一个“臂”在拉,共同完成电流输出任务。

当输出高电平时,也就是下级负载门输入高电平时,输出端的电流将是下级门从本级电源经VT3拉出。

这样一来,输出高低电平时,VT3 一路和VT5 一路将交替工作,从而减低了功耗,提高了每个管的承受能力。

又由于不论走哪一路,管子导通电阻都很小,使RC常数很小,转变速度很快。

因此,推拉式输出级既提高电路的负载能力,又提高开关速度。

详细剖析Cortex-M3处理器

详细剖析Cortex-M3处理器

详细剖析Cortex-M3处理器
工作模式
线程模式(Thread mode):处理器复位或异常退出时为此模式。

此模式下的代码可以是特权代码也可以是用户代码,通过CONTROL[0]控制。

处理模式(Handler mode):出现异常(包括中断)时进入此模式,此模式下所有代码为特权访问。

代码权限
特权访问:对处理器资源拥有完全访问限权;处理器复位后进入此访问模式;清零CONTROL[0]进入用户模式。

用户访问:禁止访问多数系统寄存器。

只能通过进入异常(中断)来返回特权模式。

进入异常前是用户级访问,则退出异常时自动回到用户及,除非在异常中修改CONTROL[0]位。

工作状态
Thumb状态(正常执行指令状态)和调试状态。

寄存器
r0-r12:通用寄存器,其中r8-r12只能被32位指令访问。

r13(SP):堆栈指针;线程模式时可以在线程堆栈和主堆栈之间切换,但处理模式只使用主堆栈。

两个堆栈同一时刻只有一个可见,进入、退出异常时自动切换堆栈。

r14(LR):链接寄存器,保存子程序或异常的返回地址(要实现嵌套,必须入栈)。

r15(PC):程序计数器。

xPSR:特殊用途的程序状态寄存器。

异常
进入异常步骤:。

Cortex-M3中GPIO位输出操作的几种方法

Cortex-M3中GPIO位输出操作的几种方法

Cortex-M3中GPIO位输出操作的几种方法Cortex-M3中GPIO位输出操作的几种方法江南神枪1、端口位设置/清除在STM32F1xx系列芯片中,可对BSRR、BRR寄存器相应的位置1,以实现置位和清零操作,如:GPIOA->BSRR = (1<<3); // 设置端口A的位3为1GPIOA->BRR = (1<<3); // 清除端口A的位3为0在LPC17xx系列芯片中,可对FIOSET、FIOCLR寄存器相应的位置1,以实现置位和清零操作,如:LPC_GPIO2->FIOSET = (1<<3); // 设置端口2的位3为1LPC_GPIO2->FIOCLR = (1<<3); // 清除端口2的位3为02、端口直接输出在STM32F1xx系列芯片中,可对ODR寄存器相应的位置1或0,以实现置位和清零操作,如:GPIOA->ODR |= (1<<3); // 端口A的位3输出1GPIOA->ODR &= ~(1<<3); // 端口A的位3输出0在LPC17xx系列芯片中,可对FIOPIN寄存器相应的位置1或0,以实现置位和清零操作,如:LPC_GPIO2->FIOPIN |= (1<<3); // 端口2的位3输出1LPC_GPIO2->FIOPIN &= ~(1<<3); // 端口2的位3输出03、端口位带输出参考《Cortex-M3 权威指南》第五章,第5小节位带操作(87页~92页)。

为简化位带操作,可以定义一些宏。

比如,我们可以建立一个把“位带地址+位序号”转换成别名地址的宏,再建立一个把别名地址转换成指针类型的宏。

//1):把“位带地址+位序号”转换成别名地址的宏#define BITBAND(addr, bitnum) ((addr &0xF0000000)+0x2000000+((addr & 0xFFFFF)<<5)+(bitnum<<2)) //2):把该地址转换成一个指针#define MEM_ADDR(addr) *((volatile unsigned long *) (addr)) //3):使用位带别名地址访问#define BIT_ADDR(addr, bitnum) MEM_ADDR(BITBAND(addr, bitnum))应用如下:STM32F1xx系列芯片:#define PAout(n) BIT_ADDR((uint32_t)&GPIOA->ODR, n)PAout(3) = 1; //端口A的位3输出1PAout(3) = 0; //端口A的位3输出0LPC17xx系列芯片:#define P2out(n) BIT_ADDR((uint32_t)&LPC_GPIO2->FIOPIN, n)P2out(3) = 1; //端口2的位3输出1P2out(3) = 0; //端口2的位3输出04、端口位域输出定义一个端口位域,端口为16位的就定义16位(STM32F1xx),端口为32位的就定义32位(LPC17xx)。

Cortex M3

Cortex M3

开发工具
Keil ULINK仿真器
IAR JLink仿真器
对客户来说用什么技术、芯片不是主要的。主要的是能否满足要求。高性价比、开发门槛底、易于使用才是 硬道理。Cortex M3从理论上来说是高性价比。但目前已有的芯片的功能太少。Cortex M系列在处理能力基本与 ARM7同,主要是成本低,功耗小。
ARMCortex-M3内核的预取部件具有分支预测功能,可以预取分支目标的指令,使分支延迟减少到一个时钟周 期。
针对业界对ARM处理器中断响应的问题,Cortex-M3首次在内核上集成了嵌套向量中断控制器(NVIC)。 Cortex-M3的中断延迟只有12个时钟周期(ARM7需要24-42个周期);Cortex-M3还使用尾链技术,使得背靠背 (back-to-back)中断的响应只需要6个时钟周期(ARM7需要大于30个周期)。Cortex-M3采用了基于栈的异常模 式,使得芯片初始化的封装更为简单。
内核架构
ARMCortex-M3采用哈佛结构,并选择了适合于微控制器应用的三级流水线,但增加了分支预测功能。
现代处理器大多采用指令预取和流水线技术,以提高处理器的指令执行速度。流水线处理器在正常执行指令 时,如果碰到分支(跳转)指令,由于指令执行的顺序可能会发生变化,指令预取队列和流水线中的部分指令就 可能作废,而需要从新的重新取指、执行,这样就会使流水线“断流”,处理器性能因此而受到影响。特别是现 代C语言程序,经编译器优化生成的目标代码中,分支指令所占的比例可达10-20%,对流水线处理器的影响会的 更大。为此,现代高性能流水线处理器中一般都加入了分支预测部件,就是在处理器从存储器预取指令时,当遇 到分支(跳转)指令时,能自动预测跳转是否会发生,再从预测的方向进行取指,从而提供给流水线连续的指令 流,流水线就可以不断地执行有效指令,保证了其性能的发挥。

微处理器基础11CortexM3GPIO

微处理器基础11CortexM3GPIO
main() { long value; value=GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_8); If(value==0)
GPIO_WriteBit(GPIOA, GPIO_Pin_8, 0x100); else
GPIO_WriteBit(GPIOA, GPIO_Pin_8, 0x00); }
Cortex-M3 GPIO简单应用2
硬件电气连接 通过STM32F10x 的PA12脚操作LED
Cortex-M3 GPIO简单应用2
❖ 初始化端口
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能端口A的时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
Cortex-M3 GPIO寄存器说明
• GPIO通过7个32位寄存器进行操作
偏移地址 名称 0x00 CRL 0x04 CRH 0x08 IDR 0x0C ODR 0x10 BSRR 0x14 BRR 0x18 LCKR
类型 复位值
说明
读/写 0x44444444 配置寄存器低位(每个端口4位)
读/写 0x44444444 配置寄存器高位(每个端口4位)
读 0x0000 16位输入数据寄存器
读/写 0x0000 16位输出数据寄存器
写 0x00000000 位置位/复位寄存器
写 0x0000 位复位寄存器
读/写 0x00000 配置锁定寄存器
端口配置低寄存器 :用于配置GPIOx.0~GPIOx.7模式。 端口配置高寄存器:用于配置GPIOx.8~GPIOx.15模式。
微处理器基础
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

在Cortex-M3里,对于GPIO的配置种类有8种之多:
1)GPIO_Mode_AIN模拟输入;
2)GPIO_Mode_IN_FLOATING浮空输入;
3)GPIO_Mode_IPD下拉输入;
4)GPIO_Mode_IPU上拉输入;
5)GPIO_Mode_Out_OD开漏输出;
6)GPIO_Mode_Out_PP推挽输出;
7)GPIO_Mode_AF_OD复用开漏输出;
8)GPIO_Mode_AF_PP复用推挽输出;
图1 GPIO基本结构图
1.GPIO_Mode_AIN模拟输入
图2GPIO模拟输入结构图
信号从左边编号1的端口进入,从右边编号2的一端直接进入ADC模块。

所有的上拉、下拉电阻和施密特触发器,均处于断开状态,因此“输入数据寄存器”将不能反映端口上的电平状态,也就是说,模拟输入配置下,CPU不能在“输入数据寄存器”上读到有效的数据。

2.GPIO_Mode_IN_FLOATING浮空输入
图3GPIO浮空输入结构图
浮空输入模式:在这张图上,虚线框部分处于不工作状态,尤其是下半部分的输出电路,实际上是与端口处于隔离状态。

黄色的高亮部分显示了数据传输通道,外部的电平信号通过左边编号1的I/O端口进入STM32,经过编号2的施密特触发器的整形送入编号3的“输入数据寄存器”,在“输入数据寄存器”的另一端(编号4),CPU可以随时读出I/O 端口的电平状态。

3.GPIO_Mode_IPD下拉输入
图4GPIO下拉输入结构图
输入下拉模式:数据通道的下部,接入了一个下拉电阻,根据STM32的数据手册,这个下拉电阻阻值也是介于30K~50K欧姆。

4.GPIO_Mode_IPU上拉输入
图5GPIO上拉输入结构图
输入上拉模式:与前面的浮空输入模式相比,仅仅是在数据通道上部,接入了一个上拉电阻,根据STM32的数据手册,这个上拉电阻阻值介于30K~50K欧姆。

同样,CPU可以随时在“输入数据寄存器”的另一端,读出I/O端口的电平状态。

5.GPIO_Mode_Out_OD开漏输出
开漏形式的电路有以下几个特点:
1)利用外部电路的驱动能力,减少IC内部的驱动。

当IC内部MOSFET导通时,驱动电流是从外部的VCC流经Rpull-up ,MOSFET到GND。

IC内部仅需很小的栅极驱动电流。

2)一般来说,开漏是用来连接不同电平的器件,匹配电平用的。

因为开漏引脚不连接外部的上拉电阻时,只能输出低电平。

如果需要同时具备输出高电平的功能,则需要接上拉电阻。

优点是通过改变上拉电源的电压,便可以改变传输
电平。

比如可以提供TTL/CMOS电平输出等。

注意:上拉电阻的阻值决定了逻辑电平转换的沿的速度。

阻值越大,速度越低功耗越小,所以负载电阻的选择要兼顾功耗和速度。

3)OPEN-DRAIN也有其弱点,会带来上升沿的延时。

因为上升沿是通过外接上拉无源电阻对负载充电,所以当电阻选择小时延时就小,但功耗大;反之延时大功耗小。

一般如果对延时有要求,则建议用下降沿输出。

4)可以将多个开漏输出的Pin,连接到一条线上。

通过一只上拉电阻,在不增加任何器件的情况下,形成“与逻辑”关系。

这也是I2C,SMBus等总线判断总线占用状态的原理。

什么是线与?在一个结点(线)上,连接一个上拉电阻到电源VCC或VDD和n 个NPN或NMOS晶体管的集电极C或漏极D,这些晶体管的发射极E或源极S都接到地线上,只要有一个晶体管饱和,这个结点(线)就被拉到地线电平上.因为这些晶体管的基极注入电流(NPN)或栅极加上高电平(NMOS),晶体管就会饱和,所以这些基极或栅极对这个结点(线)的关系是或非NOR逻辑.如果这个结点后面加一个反相器,就是或OR逻辑。

其实可以简单的理解为:在所有引脚连在一起时,外接一上拉电阻,如果有一个引脚输出为逻辑0,相当于接地,与之并联的回路“相当于被一根导线短路”,所以外电路逻辑电平便为0,只有都为高电平时,与的结果才为逻辑1
6.GPIO_Mode_Out_PP推挽输出
推挽电路是两个参数相同的三极管或MOSFET,以推挽方式存在于电路中,各负责正负半周的波形放大任务,电路工作时,两只对称的功率开关管每次只有一个导通,所以导通损耗小、效率高。

输出既可以向负载灌电流,也可以从负载抽取电流。

推拉式输出级既提高电路的负载能力,又提高开关速度。

7.GPIO_Mode_AF_OD复用开漏输出
可以理解为GPIO口被用作第二功能时的配置情况(即并非作为通用IO口使用)。

8.GPIO_Mode_AF_PP复用推挽输出
可以理解为GPIO口被用作第二功能时的配置情况(即并非作为通用IO口使用)。

相关文档
最新文档