Встроенный системный ввод-вывод с отображением памяти
Шаг 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; }