Member 12674320 Ответов: 1

Встроенный системный ввод-вывод с отображением памяти


Шаг 1: Определите единую структуру adc_t для всех регистров

Шаг 2: назначьте указатель на структуру adc_t по базовому адресу, сопоставленному с памятью

Шаг 3: Создайте uint16_t pot_read( void), разделив выборку АЦП на 4, чтобы поместить 12-битное значение в диапазон от 0 до 1023

Шаг 4: вызов функции выше в основной

Что я уже пробовал:

ЭТО ТО, ЧТО У МЕНЯ ЕСТЬ ДО СИХ ПОР.
любая помощь будет оценена по достоинству

#include <stdint.h>
#include "led.h"
#include <assert.h>

/*!
* @brief Delay for some number of milliseconds, by wasting CPU cycles.
*
* @param[in] ms  Number of milliseconds to busy-wait.
* @return void
*/


// a single struct for all the registers 
typedef struct {

  uint8_t AD_Control_Register ;
  
  uint8_t unused1[3];
  uint16_t AD_Channel_Select_Register_0;
  
  uint16_t AD_Channel_Select_Register_1;
  
  uint16_t AD_Converted_Value_Addition_Mode_Select_Register_0;

  uint16_t  AD_Converted_Value_Addition_Mode_Select_Register_1;
  
  uint8_t AD_Converted_Value_Addition_Count_Select_Register;
   
  uint16_t AD_Control_Extended_Register ;
  
  uint8_t AD_Start_Trigger_Select_Register;
  
  uint16_t AD_Converted_Extended_Input_Control_Register;
  
  uint16_t AD_Temperature_Sensor_Data_Register;
  
  uint16_t AD_Internal_Reference_Voltage_Data_Register;
  
  uint16_t AD_Data_Register_y;
  
  uint8_t unused2[11];
  uint16_t AD_Sampling_State_Register_01 ;
  
  uint8_t unused3[9];
  uint16_t AD_Sampling_State_Register_23;
  

} adc_t;


// assign a pointer to the memory-mapped base address 
adc_t* adc_regs = (adc_t *)adc_regs_base_address;


/* new function:
   this function will divide the raw ADC sample by 4 to put the 12 bit value into the range 
   0 to 1023 ms
*/
uint16_t pot_read()
{
    // adc_t *adc_regs = get mapped address here;
  
    // create the 12-bit value if necessary (if the registers are 8-bit wide), and divide by four.
    uint16_t adc_value = ((adc_regs -> value_lo) | ((adc_regs -> value_hi & 0x0f) << 8));
    
    // unmap here if necessary
    
    return adc_value / 4;
    
} 

1 Ответов

Рейтинг:
0

Jochen Arndt

На этот вопрос нельзя ответить без дополнительной информации.

Имя структуры adc_t указывает, что он относится к какому-то виду регистров АЦП (аналого-цифрового преобразователя). Они обычно указываются в техническом описании встроенной системы.

Назначение указателя на эту структуру требует знания адреса. В зависимости от системы может быть достаточно просто назначить адрес с помощью приведения:

adc_t* adc_regs = (adc_t *)adc_regs_base_address;

где adc_regs_base_address является ли жестко закодированный адрес постоянным (например, define заявление или как шестнадцатеричный адрес).

Если это невозможно, то может существовать системная функция для отображения адреса (например, mmap(2): map/unmap files/devices into memory - man-страница Linux[^] с Linux).

Третий шаг требует знания регистров АЦП. В типичной системе используйте вышеупомянутую отображенную память для чтения соответствующих регистров, при необходимости создайте 12-битное значение (если регистры имеют ширину 8 бит) и разделите на четыре.
Типичным примером кода может быть:
uint16_t pot_read()
{
    //adc_t *adc_regs = get mapped address here;
    uint16_t adc_value = adc_regs->value_lo | 
        ((adc_regs->value_hi & 0x0f) << 8);
    // unmap here if necessary
    return adc_value / 4;
}


Jochen Arndt

Я заметил, что вы обновили свой вопрос, определив имена регистров АЦП и вставив фрагменты кода из моего ответа. Для других, читающих обновленный вопрос, мой ответ теперь кажется бесполезным.

Так в чем же проблема замены имен регистров моего примера именем регистра данных из структуры adc_t в функции pot_read () (это 16-битный регистр, делающий функцию еще проще)?

Проблема отображения все еще не может быть решена без знания системы.

Вы также приняли мой ответ и отменили его несколько часов спустя. Это и редактирование вопроса таким образом, что мой ответ кажется бесполезным, - это грубое поведение.

Ваш вопрос выглядит как домашнее задание. Для такого вопроса я дал вам больше информации, чем вы получили бы от большинства других здесь, в CodeProject.

Если это не домашнее задание, и вы должны разработать систему, вы должны научиться читать спецификации и спецификации системы, чтобы получить информацию, необходимую для реализации таких задач.