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