8.裸板--C语言下的寄存器的读写置位清零操作

从CPU的角度来看,外设的寄存器跟通用寄存器操作一样,对它们的地址进行读写移位等操作即可进行配置读取写入等动作。

通用寄存器有15个

寄存器名字
Reg# APCS 意义
R0 a1 工作寄存器
R1 a2 "
R2 a3 "
R3 a4 "
R4 v1 必须保护
R5 v2 "
R6 v3 "
R7 v4 "
R8 v5 "
R9 v6 "
R10 sl 栈限制
R11 fp 桢指针
R12 ip 内部过程调用寄存器
R13 sp 栈指针
R14 lr 连接寄存器
R15 pc 程序计数器

假设某外设地址为0x56000050。(外设地址可查芯片手册)

1.汇编模式的操作

读值:

mov r0,r1  

mov r0,立即数

ldr 

写值:

str 

C语言下,对地址进读写是通过指针来操作,地址可查芯片手册获得。

C语言下要对r0~r15进行操作,需要插入汇编。

 #define UART_BASE_ADRS (0x56000050)     /* 串口的基地址 */
 #define UART_RHR *(volatile unsigned char *)(UART_BASE_ADRS + 1)  /* 数据接受寄存器 */
#define UART_THR *(volatile unsigned char *)(UART_BASE_ADRS + 2)  /* 数据发送寄存器 */
UART_BASE_ADRS =配置值;
UART_THR = ch; /* 发送数据 */
ch = UART_RHR; /* 接收数据 */

即:

TYPE *p=addr;

*p=vale;

把vale写入地址addr的内存,写入sizeof(TYPE)字节

寄存器置位:UART_BASE_ADRS|=(1<

寄存器清零:UART_BASE_ADRS&=~((1<

其他:

r0-r3 用作传入函数参数,传出函数返回值。在子程序调用之间,可以将 r0-r3 用于任何用途。

被调用函数在返回之前不必恢复 r0-r3。如果调用函数需要再次使用 r0-r3 的内容,则它必须保留这些内容。

r4-r11 被用来存放函数的局部变量。如果被调用函数使用了这些寄存器,它在返回之前必须恢复这些寄存器的值。

r12 是内部调用暂时寄存器 ip。它在过程链接胶合代码(例如,交互操作胶合代码)中用于此角色。

在过程调用之间,可以将它用于任何用途。被调用函数在返回之前不必恢复 r12。

r13 是栈指针 sp。它不能用于任何其它用途。sp 中存放的值在退出被调用函数时必须与进入时的值相同。

r14 是链接寄存器 lr。如果您保存了返回地址,则可以在调用之间将 r14 用于其它用途,程序返回时要恢复

r15 是程序计数器 PC。它不能用于任何其它用途。(程序计数器是用于存放下一条指令所在单元的地址的地方

注意:在中断程序中,所有的寄存器都必须保护

你可能感兴趣的:(裸板,单片机,c语言,嵌入式硬件)