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

 
 
 
«Иногда лучше остаться спать дома в понедельник, чем провести всю неделю отлаживая написанный в понедельник код.»
Christopher Thompson
Русский | Українська


Микропроцессоры и микроконтроллеры :: 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. Если вам потребуется компьютерная помощь высокого класса в Киеве - рекомендуем обратиться именно к ним.