Микропроцессоры и микроконтроллеры

 
 
 
«Отладка кода вдвое сложнее, чем его написание. Так что если вы пишете код настолько умно, насколько можете, то вы по определению недостаточно сообразительны, чтобы его отлаживать.»
Brian W. Kernighan.
Русский | Українська


Микропроцессоры и микроконтроллеры :: JAVA и STM32 - курс экспресс-программирования с MicroEJ :: JAVA и STM32 - курс экспресс-программирования с MicroEJ. Часть девятая

JAVA и STM32 - курс экспресс-программирования с MicroEJ. Часть девятая

Все, что вам нужно сделать, это создать новую конфигурацию с опцией « Выполнить в EmbJPF» , чтобы приложение было готово к программированию в памяти микроконтроллера.

Листинг 6. Код основного метода

public static void main(String[] args) {

    DAC dac = new DAC();
    ADC adc = new ADC();
       
    dac.init();
    adc.init();
       
    MWT.RenderingContext.add(new PlainTheme());
    Desktop desktop = new Desktop();
    Panel panel = new Panel();
    GridComposite gc = new GridComposite(MWT.VERTICAL, 4);
       
    TitleLabel title = new TitleLabel("ADC/DAC EXAMPLE");
    title.setFontSize(LookExtension.GET_X_BIG_FONT_INDEX);
    gc.add(title);
    
    FlowComposite fcDac = new FlowComposite();
       
    TitleLabel labelDacTitle = new TitleLabel("Dac Value [mV]:");
    fcDac.add(labelDacTitle);
       
    TextField dacValueField = new TextField("--------");
    fcDac.add(dacValueField);
       
    Scale scaleDac = new Scale(0, 300);
    scaleDac.setListener(new DACScaleListener(dacValueField, dac));
    fcDac.add(scaleDac);
       
    gc.add(fcDac);

    FlowComposite fcAdc = new FlowComposite();
       
    TitleLabel labelAdcTitle = new TitleLabel("ADC Value [mV]:");
    fcAdc.add(labelAdcTitle);
       
    TextField adcValueField = new TextField("--------");
    fcAdc.add(adcValueField);
       
    Button buttonAdc = new Button("Get ADC value");
    buttonAdc.setListener(new ADCButtonListener(adcValueField, adc));
    fcAdc.add(buttonAdc);

    gc.add(fcAdc);
       
    panel.setWidget(gc);
    panel.show(desktop, true);
    desktop.show();
}

Основа датчика

Перед запуском приложения вам все равно нужно внести изменения в BSC, добавив поддержку передатчиков. После запуска проекта в среде uVision создайте два новых файла adc.c и dac.c, содержащие реализации функций управления преобразователем, объявленные в Java. Эти функции показаны в листингах 7 и 8 .

Листинг. 7. Реализация функции инициализации и восстановления аналого-цифрового преобразователя.

void Java_app_ADC_ADCInit(void) {
    
    printf("ADC initn");
    
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC3, ENABLE);
    
    GPIO_InitTypeDef GPIO_InitStructure;
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;
  GPIO_Init(GPIOC, &GPIO_InitStructure);

  ADC_CommonInitTypeDef ADC_CommonInitStructure;
  ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;
  ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div2;
  ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;
  ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;
  ADC_CommonInit(&ADC_CommonInitStructure);

  ADC_InitTypeDef ADC_InitStructure;
  ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
  ADC_InitStructure.ADC_ScanConvMode = DISABLE;
  ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
  ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Left;
  ADC_InitStructure.ADC_NbrOfConversion = 1;
  ADC_Init(ADC3, &ADC_InitStructure);

  ADC_RegularChannelConfig(ADC3, ADC_Channel_13, 1, ADC_SampleTime_3Cycles);
  ADC_Cmd(ADC3, ENABLE);   
}

int Java_app_ADC_ADCGetValue(void) {
    
    printf("ADC get valuen");
    
    ADC_SoftwareStartConv(ADC3);
    
    while(ADC_GetFlagStatus(ADC3, ADC_FLAG_EOC) == RESET)
        __NOP();
    
    ADC_ClearFlag(ADC3, ADC_FLAG_EOC);
    
    uint32_t data = ADC_GetConversionValue(ADC3) >> 4;
    data = data * 3000/4096;
    
    return (int)data;
}

Листинг. 8. Реализация функции инициализации и установка значения цифро-аналогового преобразователя.
void Java_app_DAC_DACInit(void) {
    
    printf("DAC initn");
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
    
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Pin        = GPIO_Pin_5;
    GPIO_InitStructure.GPIO_Speed     = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode     = GPIO_Mode_AN;
    GPIO_InitStructure.GPIO_PuPd    = GPIO_PuPd_NOPULL;

    GPIO_Init(GPIOA, &GPIO_InitStructure);
    
    DAC_InitTypeDef  DAC_InitStructure;
    DAC_InitStructure.DAC_Trigger = DAC_Trigger_None;
  DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None;
  DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Enable;
  DAC_Init(DAC_Channel_2, &DAC_InitStructure);
    DAC_Cmd(DAC_Channel_2, ENABLE);
    
    DAC_SetChannel2Data(DAC_Align_12b_L, 0x0);
}

void Java_app_DAC_DACSetValue(int value) {
    printf("DAC set value %dn", value);
    
    uint32_t data = value * 4095 / 3000;
    
    DAC_SetChannel2Data(DAC_Align_12b_R, (uint16_t)data);
}

Сразу можно увидеть характерные названия всех четырех функций. В связи с тем, что они вызываются из кода Java, в их именах должен быть полный путь к своим объявлениям в приложении, включая пакеты и классы, в которых они расположены. Помимо названий, они ничем не отличаются от функций, известных из примеров стандартной периферийной библиотеки STM32 . Функции конфигурации инициализируют тактовые сигналы для своих периферийных устройств, а назначенные порты GPIO (PC3 для ADC и PA5 для DAC) заполняют структуры инициализации. Функция, считывающая значение АЦП, не использует прерывания, но после запуска преобразования ожидает его завершения, о чем сигнализирует соответствующий флаг.

Теперь можно скомпилировать проект и запрограммировать память микроконтроллера. После каждого вызова функции C в средстве просмотра отладки (printf ) вы можете наблюдать журналы, отображаемые отдельными функциями.

P.S. Отдельно хотелось бы обратить внимание уважаемого читателя на сайт спонсора нашего ресурса it-services.com.ua. Если вам потребуется компьютерная помощь высокого класса в Киеве - рекомендуем обратиться именно к ним.