访问内存映射I/O

Access Memory Mapped I/O

本文关键字:映射 内存 访问      更新时间:2023-10-16

我对嵌入式系统编程很陌生,我只需要学习如何通过c++代码操纵给定的。

给定

:

电机1映射到0x60000000

电机2映射到0x50000000

以下是当前32位寄存器的定义
REGISTER NAME            |     BYTE OFFSET        |     NOTES
----------------------------------------------------------------------
motor_interrupt               0x00                 service interrupts
motor_status                  0x01                 enable on demand access to status elements
motor_command                 0x02                 enable command of the motor

REGISTER NAME           |   NAME   |  BITS   | ACCESS TYPE   | DESC 
----------------------------------------------------------------------------------
motor_interrupt_register
                           CLOSED      0          R/W         high when motor transitions to CLOSED position
                           OPEN        1          R/W         high when motor transitions to OPEN position
                           RESERVED    2.31       N/A         reserved for future use
motor_status        
                           SPEED       0.2         R          speed in counts/seconds
                           STATE        3          R          current state of motor
                           POSITION    4.13        R          current position of the motor
                           RESERVED    14.31       n/a         reserved for future use

我发现很难看到使用给定的示例c++代码,此时我所知道的是我需要访问register_name并设置它们的位来执行特定的任务或读取寄存器名以获得状态。

我想如果在c++代码中使用,我可以更好地理解它。给定的是一个自动门系统(我没有写按钮的细节)。我需要在c++中访问register_name或byte_offset吗?

非常感谢您的帮助

C/c++读中断/状态寄存器的例子:

volatile uint32_t * const motor1 = (uint32_t *)0x60000000; // base addresses for motors 1 and 2
volatile uint32_t * const motor2 = (uint32_t *)0x50000000;
enum  // register offsets from base address
{
    motor_interrupt, // 0x00 - service interrupts
    motor_status,    // 0x01 - enable on demand access to status elements
    motor_command    // 0x02 - enable command of the motor
}
// read status/interrupt registers
uint32_t current_int_1 = motor1[motor_interrupt];
uint32_t current_int_2 = motor2[motor_interrupt];
uint32_t current_status_1 = motor1[motor_status];
uint32_t current_status_2 = motor2[motor_status];

类似地将32位值写入命令寄存器:

motor1[motor_command] = 0x8000 | (0x12 << 6) | 0x01;
motor2[motor_command] = 0x0;