MSP432P 汇编,C语言点灯

182 阅读3分钟

​​开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第26天,点击查看活动详情

目录

一、查看芯片手册

1.1、寄存器DIR

1.2、寄存器OUT

1.3、寄存器地址

二、汇编

2.1、用到指令

2.2、完整代码

三、c语言

一、查看芯片手册

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

1.1、寄存器DIR

​编辑

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

输入0,输出1

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

1.2、寄存器OUT

​编辑

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

低电平0,高电平1

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

1.3、寄存器地址

​编辑

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

P1DIR:0x40004C04

P1OUT:0x40004C02

​编辑

可以看出每个寄存器占用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字节内存单元

​编辑

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--);
    }
}

​编辑