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