目录
三、c语言
led接在P0^1口,高电平亮
共8位,对应P1口的8个IO,设置其工作模式,输入输出
输入0,输出1
使用到0口,写入0x01即可
共8位,对应P1口的8个IO,设置其输出高低电平
低电平0,高电平1
使用到0口,写入0x01即可输出高电平
可以看出P1口的寄存器DIR,OUT地址分别是
P1DIR:0x40004C04
P1OUT:0x40004C02
可以看出每个寄存器占用2字节空间,也就是16位,我们只使用到了低8位
EXPORT:表明该符号可以被外部模块使用,类似于C中的extern功能。
IMPORT:表明要调用的函数为外部文件定义
STRH:16位数据放入寄存器中
注:写入只能用STRH指令,不能用STR(因为是16位数据,用STR是32,会超出越界)
- ;主函数入口
- 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
地址是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--);
- }
- }