MSP432P 汇编,C语言点灯

目录

一、查看芯片手册

1.1、寄存器DIR

1.2、寄存器OUT

1.3、寄存器地址

二、汇编

2.1、用到指令

2.2、完整代码

三、c语言​​​​​​​

一、查看芯片手册

led接在P0^1口,高电平亮

1.1、寄存器DIR

MSP432P 汇编,C语言点灯_第1张图片

 共8位,对应P1口的8个IO,设置其工作模式,输入输出

输入0,输出1

使用到0口,写入0x01即可

1.2、寄存器OUT

MSP432P 汇编,C语言点灯_第2张图片

共8位,对应P1口的8个IO,设置其输出高低电平

低电平0,高电平1

使用到0口,写入0x01即可输出高电平

1.3、寄存器地址

MSP432P 汇编,C语言点灯_第3张图片

 可以看出P1口的寄存器DIR,OUT地址分别是

P1DIR:0x40004C04

P1OUT:0x40004C02

MSP432P 汇编,C语言点灯_第4张图片

 可以看出每个寄存器占用2字节空间,也就是16位,我们只使用到了低8位

二、汇编

2.1、用到指令

EXPORT:表明该符号可以被外部模块使用,类似于C中的extern功能。

IMPORT:表明要调用的函数为外部文件定义

STRH:16位数据放入寄存器中

注:写入只能用STRH指令,不能用STR(因为是16位数据,用STR是32,会超出越界)

2.2、完整代码

;主函数入口
main PROC
	EXPORT  main
	;设置P1^0为输出
	LDR     R4, =0x01
	LDR     R5, =0x40004C04
	STRH	R4,[R5]
	ENDP

;led闪烁
led PROC
	;打开LED,输出高电平,并延时
	LDR     R4, =0x01
	LDR     R5, =0x40004C02
	STRH	R4,[R5]
	LDR     R0, =delay
    BLX     R0
	
	;关闭LED,输出低电平,并延时
	LDR     R4, =0x00
	LDR     R5, =0x40004C02
	STRH	R4,[R5]
	LDR     R0, =delay
    BLX     R0
	
	;跳转回LED函数,实现循环
	B led
	ENDP

;延时函数
delay PROC
	LDR R2, =500000
	LDR R3, =0x0
	ENDP
delay_loop PROC
	SUB R2, R2, #1 ;每次R2减一
	CMP R2, R3 ;比较
	BNE delay_loop ;不相等,跳转回delay_loop
	BX LR	;函数调用返回
	ENDP	

三、c语言

地址是32位,存储是16位

所以指针类型也必须是16位的,32位会越界访问(导致程序不能正常运行)

一个指针变量占用4字节内存空间(无论是什么类型的指针变量都是4,类型只决定可以访问的内存空间是多少字节,例如:char*只能访问1字节内存,int*访问4个连续的内存空间4字节)

每一个地址空间是1字节内存单元

MSP432P 汇编,C语言点灯_第5张图片

int main(void)
{
    volatile uint32_t i;
	volatile uint16_t* QWQW = (volatile uint16_t *)0x40004c02;
	volatile uint16_t* QWQW1 = (volatile uint16_t *)0x40004c04;
	*QWQW1=0x01;//设置为输出

    while(1)
    {

		*QWQW = 0x01; //点亮
        for(i=100000; i>0; i--);//延时
		*QWQW = 0x00; //熄灭
	    for(i=100000; i>0; i--);
    }
}

MSP432P 汇编,C语言点灯_第6张图片

 

你可能感兴趣的:(ARM,开发语言)