This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] MSP432P401R:MSP432P401R

Guru**** 2589280 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/632143/msp432p401r-msp432p401r

部件号:MSP432P401R

大家好,我正在使用MSP432P401R Launchpad (红色板)。 我正尝试打开引脚1.0 ,2.0 ,2.1 ,2.2 ,基本上是LED1和LED2 (RGB)上的LED指示灯。 我遇到了一些问题,希望有人能帮助我理解某些概念。

问题1)我将P1DIR初始化为#237 (引脚1.1 和引脚1.4 是输入引脚,其他所有引脚均为输出),P1REN和P1OUT初始化为#0x12 (激活两个按钮引脚1.1 和引脚1.4 上的上拉电阻器)。 但当我尝试从P1IN读取时,我不断收到0x0.0012万。 为什么在未按下按钮时输入针脚读数较高。 在我下面的代码中,我正在执行独家或修复,但这对我来说似乎不正确。

谢谢你  

.cdecls C,list,"msp432p401r.h"	
	.text
	.global main
	
: BL		init_port_1		;Branch到函数init_port_1
		BL		init_port_2		;Branch到函数init_port_2
		
		mov		r3,#0x4c02		;移动地址的下16位(端口1
		movt	r3,#0x4000		;移动地址的上16位) 输出
				
		mov	r1,#0x4c00		;移动地址的下16位(端口1
		movt	r1,#0x4000		;移动地址	输入的上16位)

		mov		r2,#0x4c03		;移动地址的下16位(端口2
		movt	r2,#0x4000		;移动地址	输出的上16位)
		
		b		loop			; BRANCH至LOOP函数

		
;此函数将初始化端口1
init_port_1: 	MOV		R0,#0x4c04		;移动地址的下16位(端口1
				movt	R0,#0x4000		;移动地址	方向的上16位)
				
				mov 	r1,#0x4c06		;移动地址的下16位(端口1
				movt. 	R1,#0x4000		;移动地址的上16位 r)
				
				mov	r2,#0x4c02		;移动地址的下16位	(端口1
				movt. 	r2,#0x4000		;移动地址		输出的上16位)
				
				mov		r5,#0x4c0A		;移动地址的下16位(端口1
				movt. 	R5,#0x4000		;移动地址的上16位 sel0)
				
				mov		R6,#0x4c0C		;移动地址的下16位(端口1
				movt	R6,#0x4000		;移动地址的上16位 sel0)
		
				mov		r3,#237		;将237位移动到寄存器3以供以后使用
				mov 	R4,#18			;将18位移到寄存器4中,以便以后使用
				
				strb 	R3,[R0]		;将1位存储到端口1方向地址
				strb 	R4,[R1]		;将18位存储到端口1 REN地址(引脚1.1 和1.4)

				strb中 	R4,[R2]		;将18位存储到端口1输出地址以启用上拉		
				
				BX		LR				;从调用此函数的位置返回


;此函数将初始化端口2
init_port_2: 	MOV		R1,#0x4c05		;移动地址的下16位(端口2
				movt	R1,#0x4000		;移动地址的上16位) mov

						r2,#0x4c03		;移动地址的下16位(端口2
				movt. 	r2,#0x4000		;移动地址	输出的上16位)
		
				mov	R0,#0x07		;将七位移动到寄存器2
				
				strb中 	R0,[R1]		;将7位存储到端口2方向地址针脚2.0 ,2.1 ,2.2
				
				mov 	r0,#0			;将0位移至寄存器0
				
				strb 	R0,[R2]		;将0位存储到所有端口2引脚中,所有引脚均为低
				
				BX		LR				;


;以下功能将持续搜索按键
回路: 	ldrb	R0,[R1]		;将寄存器1中的值加载到寄存器0中,这是从端口1

		EOR		R0 #18读取			的值;这是为了修复输入引脚不能正常工作

		的CMP 	R0,#2			;如果寄存器0等于#2,则正在按下引脚1.1 ,即左按钮
		,即		eq
		bleq	按钮1			;如果等于

		CMP,则分支到按钮1功能 	R0,#16			;如果寄存器0等于#2,则正在按下针1.4 ,即右键
		,它		相当于
		bleq	按钮2			;如果等于
		
		CMP,则分支到按钮2功能 	r0,#18			;如果寄存器0等于#18,则插针4和插针1被按下,即两个按钮
		都		是eq
		both	_buttons;	如果b
		
				loop相等,分支到both _buttons功能			;分支到循环功能,这是一个无限循环


; 以下功能检查将打开红色LED和绿色一
个按钮1: 	MOV		R7,#1
			MOV 	R8,#2

			直发 	R7,[R3]	;将1位存储到寄存器3
			strb中的端口1输出地址 	R8,[R2]	;将1位存储到端口2 LED2 (RGB)
			
			BX		LR			中;从调用此函数的位置返回


;以下功能将打开绿色LED
按钮2: 	MOV		R7,#1
			MOV 	R8,#4

			strb	R7,[R3]
			strb. 	R8,[R2]	;将2位存储到寄存器0
			
			BX		LR中的端口2方向地址			中;从调用此函数的位置返回
			
			
;以下功能将打开蓝色LED
Both按钮: 	MOV 7号,7号		;
				移动 	R8,#1		;

				strb. 	R8,	[R3]	;
				strb. 	R7,[R2]	;将4位存储到寄存器0
				
				BX		LR中的端口2方向地址			;从调用此函数的位置返回 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果将引脚配置为GPIO输入,则引脚应读数为高,内部上拉打开且没有硬/强外部接地。 IIRC,从启动板示意图中,按下按钮将使引脚接地,然后读数应为零。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果我理解正确的话。 当我将P1DIR设置为#237时,我正在设置输入引脚1.1 amd 1.4 ,它们自然读数高,直到我按下它们。 当我按下这些按钮时,它们会接地读数为0作为输入。 是这样吗? 谢谢你。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    正确
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    很抱歉,还有一个我不理解的问题。 我不知道为什么它没有在原始帖子中发布,但在我的循环功能中,我一直在寻找一个已按下的按钮,当我按下某个按钮时,某些指示灯亮起,例如,如果左按钮打开,则LED1和LED2 (绿色)打开 正如预期的那样,但是当我尝试从P1IN读取时,我收到了0x0.0001万而不是0x0.0012万。而且无论我按什么,输入P1IN都不会再读取我的按钮。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果您在P1OUT中设置了位(=1)(例如,为WFP 1.0 LED设置),则会在P1IN中反映出来。 如果您想比较P1IN的特定值,您需要对您不感兴趣的位进行比较。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢,是的,这很有意义。 但是在第一次单击按钮后,无论我单击了多少次按钮,我的P1IN都不会再从板上的按钮读取输入读数。 为什么? 我需要中断吗? 谢谢你
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    当您达到这种状态时,P1IN是什么样子的?

    更广泛地说:我看不到任何在您松开按钮时关闭LED的逻辑。 这是您观察到的内容吗?

    更一般地说:我看不到任何关闭看门狗(WDT)的代码。 使用此类无状态程序时,MCU可能会反复重置,但仍(有时/大部分)显示为正常运行。 尝试在main中的第二个指令上设置断点以捕获此问题。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢,我让我的代码发挥作用,我更了解MSP432p401r的工作方式。 谢谢大家。