/** * Initialize internal state of the cpu load process. */ void cpu_load_process_init() { (void)gpc_setup_reg(GPROT_CPU_LOAD, (u16 *)&cpu_load_process_state.mean_cycles); (void)gpc_setup_reg(GPROT_CPU_LOAD_MAX, (u16 *)&cpu_load_process_state.max_cycles); (void)gpc_setup_reg(GPROT_CPU_LOAD_MIN, (u16 *)&cpu_load_process_state.min_cycles); (void)sys_tick_timer_register(cpu_load_process_soft_timer_callback, CLP__TIME_BASE); cpu_load_process_reset(); }
/** * Sys Tick soft timer test main function */ int main(void){ uint32_t timer; mcu_init(); led_init(); sys_tick_init(); (void)sys_tick_timer_register(sys_tick_timer_callback, 1000000); while (true) { timer = sys_tick_get_timer(); while (!sys_tick_check_timer(timer, 50000)) { __asm("nop"); } TOGGLE(LED_GREEN); } }
/** * Callback from the soft sys tick timer */ void sys_tick_timer_callback(int id) { (void)sys_tick_timer_register(sys_tick_timer_callback_one_shot, 100000); }
/** * Initialize the ADC peripherals and internal state of the driver */ void adc_init(void) { NVIC_InitTypeDef nvic; GPIO_InitTypeDef gpio; ADC_InitTypeDef adc; /* enable ADC1 clock */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_ADC1, ENABLE); /* Configure and enable ADC interrupt */ nvic.NVIC_IRQChannel = ADC1_2_IRQn; nvic.NVIC_IRQChannelPreemptionPriority = 0; nvic.NVIC_IRQChannelSubPriority = 0; nvic.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&nvic); /* GPIOA: ADC Channel 0, 1, 2, 3 as analog input * Ch 3 -> Battery Voltage * Ch 4 -> Current * Ch 5 -> Temperature */ gpio.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5; gpio.GPIO_Mode = GPIO_Mode_AIN; gpio.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &gpio); adc_data.battery_voltage = 0; adc_data.current = 0; adc_data.temp = 0; /* Configure ADC1 */ adc.ADC_Mode = ADC_Mode_Independent; adc.ADC_ScanConvMode = ENABLE; adc.ADC_ContinuousConvMode = ENABLE; adc.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; adc.ADC_DataAlign = ADC_DataAlign_Right; adc.ADC_NbrOfChannel = 0; ADC_Init(ADC1, &adc); ADC_InjectedSequencerLengthConfig(ADC1, 3); ADC_InjectedChannelConfig(ADC1, ADC_CHANNEL_BATTERY_VOLTAGE, 1, ADC_SampleTime_239Cycles5); ADC_InjectedChannelConfig(ADC1, ADC_CHANNEL_CURRENT, 2, ADC_SampleTime_239Cycles5); ADC_InjectedChannelConfig(ADC1, ADC_CHANNEL_TEMP, 3, ADC_SampleTime_239Cycles5); /* ADC1 injected external trigger configuration */ ADC_ExternalTrigInjectedConvConfig(ADC1, ADC_ExternalTrigInjecConv_None); /* Enable ADC1 JEOC interrupt */ ADC_ITConfig(ADC1, ADC_IT_JEOC, ENABLE); /* Enable ADC1 */ ADC_Cmd(ADC1, ENABLE); /* Enable ADC1 reset calibaration register */ ADC_ResetCalibration(ADC1); /* Check the end of ADC1 reset calibration */ while (ADC_GetResetCalibrationStatus(ADC1) == SET) ; /* Start ADC1 calibaration */ ADC_StartCalibration(ADC1); /* Check the end of ADC1 calibration */ while (ADC_GetCalibrationStatus(ADC1) == SET) ; /* Start ADC1 Software Conversion */ ADC_SoftwareStartInjectedConvCmd(ADC1, ENABLE); /* Register adc as a timed callback */ sys_tick_timer_register(adc_conv_trigger, 1000); }