8.裸板--C语言下的寄存器的读写置位清零操作
從CPU的角度來看,外設的寄存器跟通用寄存器操作一樣,對它們的地址進行讀寫移位等操作即可進行配置讀取寫入等動作。
通用寄存器有15個
| 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<<n)|(1<<m);
寄存器清零:UART_BASE_ADRS&=~((1<<n)|(1<<m));
其他:
r0-r3?用作傳入函數參數,傳出函數返回值。在子程序調用之間,可以將 r0-r3 用于任何用途。
被調用函數在返回之前不必恢復 r0-r3。如果調用函數需要再次使用 r0-r3 的內容,則它必須保留這些內容。
r4-r11?被用來存放函數的局部變量。如果被調用函數使用了這些寄存器,它在返回之前必須恢復這些寄存器的值。
r12?是內部調用暫時寄存器 ip。它在過程鏈接膠合代碼(例如,交互操作膠合代碼)中用于此角色。
在過程調用之間,可以將它用于任何用途。被調用函數在返回之前不必恢復 r12。
r13?是棧指針 sp。它不能用于任何其它用途。sp 中存放的值在退出被調用函數時必須與進入時的值相同。
r14?是鏈接寄存器 lr。如果您保存了返回地址,則可以在調用之間將 r14 用于其它用途,程序返回時要恢復
r15?是程序計數器 PC。它不能用于任何其它用途。(程序計數器是用于存放下一條指令所在單元的地址的地方)
注意:在中斷程序中,所有的寄存器都必須保護
總結
以上是生活随笔為你收集整理的8.裸板--C语言下的寄存器的读写置位清零操作的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何在网上查入团年月
- 下一篇: 基于vue框架添加侧边栏