MSP432P 汇编,C语言点灯

目录

一、查看芯片手册

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

 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dz小伟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值