
独立可编程的单个I/O
输入或输出可以任意组合
单口可单独配置中断(仅适用于前6组端口),每个中断都可以单独使能并配置为在输入信号的上升沿或下降沿提供中断。所有中断都被送入编码的中断向量寄存器,允许应用程序确定端口的具体是哪个引脚存在触发事件
独立的输入和输出数据寄存器
可单独配置上拉或下拉电阻
超低功耗模式下的唤醒功能(仅适用于某些端口)
可单独配置的高驱动I/O(仅适用于某些IO)
大多数端口包含8条I/O线
每个I/O可单独配置为输入和输出方向
每个IO都可以单独读取和写入
上述这些我们主要了解一下432的I/O概况,也让我们了解到432的I/O功能还是相当丰富的
接下里废话不多说,进入正题,对I/O的寄存器进行详细介绍,并就如何完成I/O配置进行介绍
输入寄存器(PxIN)当引脚配置为I / O功能时,每个PxIN寄存器中的每个位都反映相应I / O引脚上输入信号的值。
这些寄存器是只读的。
位= 0:输入低电平
位= 1:输入为高电平
输出寄存器(PxOUT)当引脚配置为I / O功能,输出方向时,每个PxOUT寄存器中的每个位都是相应I / O引脚上输出的值。
位= 0:输出为低
位= 1:输出为高
如果引脚配置为I / O功能,则输入方向和上拉或下拉电阻使能; PxOUT寄存器中的相应位选择上拉或下拉。
位= 0:引脚被下拉
位= 1:引脚被上拉
方向寄存器(PxDIR)每个PxDIR寄存器中的每个位在为I / O功能配置时选择相应I / O引脚的方向。
大多数情况下,PxDIR寄存器在配置外设功能时控制I / O的方向。
必须根据外设功能的要求设置为外设功能选择的I / O引脚的PxDIR位。
对于某些辅助功能,如eUSCI,I / O方向由辅助功能本身控制,而不是由PxDIR寄存器控制。
有关更多详细信息,请参阅器件专用数据表。
位= 0:端口引脚切换到 输入 方向
位= 1:端口引脚切换到 输出 方向
上拉或下拉电阻使能寄存器(PxREN)每个PxREN寄存器中的每个位使能或禁止相应I / O引脚的上拉或下拉电阻。
PxOUT寄存器中的相应位选择引脚是否包含上拉或下拉。
位= 0:上拉或下拉电阻禁用
位= 1:上拉或下拉电阻使能
PxDIR PxREN PxOUT I/O configuration
0 0 x 输入
0 1 0 输入带下拉电阻
0 1 1 输入带上拉电阻
1 x x 输出
有两种类型的I / O可用。一个具有常规驱动强度,另一个具有高驱动强度。
大多数I / O具有常规驱动强度,而某些选定的I / O具有高驱动强度。
有关具有高驱动强度的I / O,请参见特定于器件的数据表。
PxDS寄存器用于选择高驱动强度I / O的驱动强度。
位= 0:高驱动强度I / O配置为常规驱动强度
位= 1:高驱动强度I / O配置为高驱动强度
PxDS寄存器对只有常规驱动的I / O没有任何影响强度
功能选择寄存器(PxSEL0,PxSEL1)端口引脚通常与其他外设模块功能复用。
每个PxSEL位用于选择引脚功能 - I / O端口或外设模块功能。
I / O功能选择
PxSEL1 PxSEL0 I / O功能
0 0 选择通用I / O
0 1 选择主模块功能
1 0 选择辅助模块功能
1 1 选择第三模块功能将PxSEL1或PxSEL0位设置为模块功 能不会自动设置引脚方向。
当选择端口引脚作为外设模块的输入时,这些外设模块的输入信号是器件引脚上信号的锁存表示。
当PxSEL1和PxSEL0不是00时,内部输入信号跟随所有连接模块的引脚信号。
但是,如果PxSEL1和PxSEL0 = 00,则在复位PxSEL1和PxSEL0位之前,外设的输入会保持器件引脚上输入信号的值。
由于PxSEL1和PxSEL0位不驻留在连续的地址中,因此无法同时更改这两个位。
例如,应用程序可能需要将P1.0从通用I / O更改为驻留在P1.0上的第三模块功能。
最初,P1SEL1 = 00h且P1SEL0 = 00h。要更改功能,必须同时写入P1SEL1 = 01h和P1SEL0 = 01h。
如果没有首先通过中间配置,这是不可能的,并且从应用的角度来看,这种配置可能是不希望的。
PxSELC补码寄存器可用于处理这种情况。PxSELC寄存器始终读为0. PxSELC寄存器的每个设置位补充PxSEL1和PxSEL0寄存器的相应位。
在本例中,最初P1SEL1 = 00h且P1SEL0 = 00h,写入P1SELC = 01h会导致写入P1SEL1 = 01h和P1SEL0 = 01h
特定端口的所有Px中断标志优先,PxIFG.0为最高,并组合为一个中断向量。
优先级最高的中断在PxIV寄存器中生成一个数字。
可以评估此编号或将其添加到程序计数器中以自动输入相应的软件例程。禁用的Px中断不会影响PxIV值。 PxIV寄存器仅为半字访问。
每个PxIFG位是其相应I / O引脚的中断标志位,当引脚选择输入信号边沿时,该标志位置1。当相应的PxIE位置1时,所有PxIFG中断标志都会请求中断。
软件还可以设置每个PxIFG标志,提供一种生成软件启动中断的方法。
位= 0:无中断待定数字I / O操作
位= 1:中断待处理只有转换而不是静态级别会导致中断。
如果在Px中断服务程序期间或Px中断服务程序执行完成后任何PxIFG标志置1,则设置的PxIFG标志会产生另一个中断。这确保了每个转换都得到确认。
注:更改PxOUT,PxDIR或PxREN时的PxIFG标志写入PxOUT,PxDIR或PxREN会导致设置相应的PxIFG标志。
对PxIV寄存器的任何访问(读或写)都会自动复位最高待处理中断标志。如果设置了另一个中断标志,则在服务初始中断后立即产生另一个中断。
例如,假设P1IFG.0具有最高优先级。如果在中断服务程序访问P1IV寄存器时设置了P1IFG.0和P1IFG.2标志,P1IFG.0将自动复位。
P1IFG.0中断服务程序完成后,P1IFG.2产生另一个中断。
每个PxIES位选择相应I / O引脚的中断沿。
位= 0:各自的PxIFG标志在低电平到高电平转换时置1
位= 1:各自的PxIFG标志在高电平到低电平的转换时置1
注意:写入PxIES为每个相应的I / O写入PxIES可能会导致设置相应的中断标志。
PxIES中断边沿选择寄存器 PxIN PxIFG
0→1 0 可设置
0→1 1 不变
1→0 0 不变
1→0 1 可设置
中断允许寄存器(PxIE)每个PxIE位使能相关的PxIFG中断标志。
位= 0:禁止中断
位= 1:中断使能
注意:当器件工作在低功耗模式LPM3,LPM4和LPMx.5以外的任何功耗模式时,中断功能仅在对于具有相应中断功能的I / O,PxSEL1和PxSEL0位为0。
需要对PxIE和PxIES寄存器进行适当的编程。
当器件工作在任何低功耗模式LPM3,LPM4或LPMx.5时,唤醒功能可用于相应的唤醒能力I / O的PxSEL1,PxSEL0位组合00,01和10 。
需要对PxIE寄存器进行适当的编程以进行唤醒。 PxIES寄存器配置无需关注,并且在唤醒事件的上升沿或下降沿触发唤醒。
4~0 PxIV 15~5 保留 复位0h
端口x中断向量值00h =无中断未决
02h =中断源:端口x.0中断;中断标志:PxIFG.0;中断优先级:最高
04h =中断源:端口x.1中断;中断标志:PxIFG.1
06h =中断源:端口x.2中断;中断标志:PxIFG.2
08h =中断源:端口x.3中断;中断标志:PxIFG.3
0Ah =中断源:端口x.4中断;中断标志:PxIFG.4
0Ch =中断源:端口x.5中断;中断标志:PxIFG.5
0Eh =中断源:端口x.6中断;中断标志:PxIFG.6
10b =中断源:端口x.7中断;中断标志:PxIFG.7;中断优先级:最低
低功耗暂且就不考虑~如果承接特定项目才会使用到低功耗的功能,端口低功耗在第12章
在系统复位之后,所有端口引脚都配置为输入,其模块功能被禁用。为防止浮动输入,应尽量在主函数开头提前初始化引脚。
未使用端口引脚的配置为防止浮动输入并降低功耗,未使用的I/O引脚应配置为I/O功能的输出,并保持其未连接的状态
PxOUT位的值无关紧要,因为引脚未连接。可以通过将未使用引脚的PxREN位置1来使能集成上拉或下拉电阻,以防止浮动输入。
O(∩_∩)O哈哈~
下面的端口初始化时MSP432P401R双侧按键的初始化
void GPIO_SW1_2_Init(void) //使能I/O 中断
{//该函数是初始话P1.1和P1.4
P1->SEL0 &=~0X12;
P1->SEL1 &=~0x12;
// 设置为通用I/O口模式
P1->DIR &=~0X12;
//~(0001 0010) = 1110 1101 按位与上这个二进制码将P1.1和P1.4设置为输入
P1->REN |=0x12; //上拉使能
P1->OUT |=0x12; //上拉
P1->IFG &=~0X12;//清除中断标志位
P1->IE |=0x12;//中断使能标志位
P1->IES|=0x02;//下降沿触发
NVIC->IP[8] = (NVIC->IP[8]&0x00FFFFFF)|0x40000000; // 优先级设定为2
NVIC->ISER[1] = 0x00000008; // 使能P1口中断
}
NVIC支持:•64个中断。
•每个中断的可编程优先级为0-7。较高级别对应较低优先级,因此级别0是最高中断优先级。
•低延迟异常和中断处理。
•中断信号的电平和脉冲检测。
•动态重新确定中断的优先级。
•将优先级值分组为组优先级和子优先级字段。
•中断尾链。
•外部不可屏蔽中断(NMI)。

nvic的中断源有64个

中断使能寄存器有两个 分别管理32位中断

中断优先级分组 详情参考手册

1

2

3

4
由上面四张图可见,I/O口1在NVIC的中断向量处于第35位 35>31
所以使用ISER[1]寄存器去使能中断 35-31=4 ISER[1]的第四位置1 使能端口1中断
NVIC->ISER[1] = 0x00000008; // 使能P1口中断
Irq 0至3优先级寄存器。使用中断优先级寄存器为每个可用中断分配0到255之间的优先级。0是最高优先级,255是最低优先级。

IPR0 Register
Irq 4到7优先级寄存器。使用中断优先级寄存器为每个可用中断分配0到255之间的优先级。0是最高优先级,255是最低优先级。

IPR1 Register
Irq 8到11优先级寄存器。使用中断优先级寄存器为每个可用中断分配0到255之间的优先级。0是最高优先级,255是最低优先级。

IPR2 Register
Irq 12至15优先级寄存器。使用中断优先级寄存器为每个可用中断分配0到255之间的优先级。0是最高优先级,255是最低优先级。

IPR3 Register
Irq 16至19优先级寄存器。使用中断优先级寄存器为每个可用中断分配0到255之间的优先级。0是最高优先级,255是最低优先级。

IPR4 Register
Irq 20至23优先级寄存器。使用中断优先级寄存器为每个可用中断分配0到255之间的优先级。0是最高优先级,255是最低优先级。

IPR5 Register

优先级设置 中断向量组35 优先级设置为2
第一步 找到start_msc432p401r_ssc.c系统文件

中断函数
找到PORT1_IRQHandler() 中断函数入口
void PORT1_IRQHandler(void)
{
uint8_t status;
status=P1->IV;
if(status==0x04)//端口中断向量表 0x04
{
P2->OUT &=~0x07;//p2.0 p2.1 p2.2输出0
P1->OUT ^=0X01;//翻转红灯
Reflectance_data=Reflectance_Read(500);
lefthand_xunji(Reflectance_data);
// Motor_Forward(6000,6000);//快速直行
}
if(status==0x0A) //端口中断向量表 0x0A
{
P1->OUT &=~0X01;
P2->OUT ^=0X04;//翻转
Motor_Right(6000,6000);//右转
// SysTick_Wait10ms(2);//延时20MS
// Motor_Stop();//停止
}
}
2019/8/4 公司记
详情参考

