application: add command to set/show target voltage
This commit is contained in:
parent
bb15fdc634
commit
caed09f4db
|
@ -11,6 +11,7 @@
|
||||||
#include <string.h> // string utilities
|
#include <string.h> // string utilities
|
||||||
#include <time.h> // date/time utilities
|
#include <time.h> // date/time utilities
|
||||||
#include <ctype.h> // utilities to check chars
|
#include <ctype.h> // utilities to check chars
|
||||||
|
#include <math.h> // rounding utilities
|
||||||
|
|
||||||
/* STM32 (including CM3) libraries */
|
/* STM32 (including CM3) libraries */
|
||||||
#include <libopencmsis/core_cm3.h> // Cortex M3 utilities
|
#include <libopencmsis/core_cm3.h> // Cortex M3 utilities
|
||||||
|
@ -88,6 +89,30 @@ size_t putc(char c)
|
||||||
return length; // return number of characters printed
|
return length; // return number of characters printed
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** print float with fixed precision
|
||||||
|
* @param[in] fpu float to print
|
||||||
|
* @param[in] precision number of digits after comma to print
|
||||||
|
* @note %f is used to force scientific notation
|
||||||
|
*/
|
||||||
|
static void print_fpu(double fpu, uint8_t precision)
|
||||||
|
{
|
||||||
|
uint32_t multiplier = 1;
|
||||||
|
for (uint8_t i = 0; i < precision; i++) {
|
||||||
|
multiplier *= 10;
|
||||||
|
}
|
||||||
|
double to_print = round(fpu * multiplier);
|
||||||
|
printf("%d.", (int32_t)to_print / multiplier);
|
||||||
|
char decimal[32];
|
||||||
|
snprintf(decimal, LENGTH(decimal), "%u", abs(to_print) % multiplier);
|
||||||
|
if (strlen(decimal) > precision) {
|
||||||
|
decimal[precision] = 0;
|
||||||
|
}
|
||||||
|
for (uint8_t i = strlen(decimal); i < precision; i++) {
|
||||||
|
putc('0');
|
||||||
|
}
|
||||||
|
puts(decimal);
|
||||||
|
}
|
||||||
|
|
||||||
/** get RCC from corresponding port
|
/** get RCC from corresponding port
|
||||||
* @param[in] port port address
|
* @param[in] port port address
|
||||||
* @return RCC address corresponding to port
|
* @return RCC address corresponding to port
|
||||||
|
@ -179,6 +204,47 @@ static void mux_select(int8_t channel)
|
||||||
|
|
||||||
// menu commands
|
// menu commands
|
||||||
|
|
||||||
|
/** measure and print target voltage
|
||||||
|
* @param[in] argument 0 to no provide power, 3 to provide 3.3V
|
||||||
|
*/
|
||||||
|
static void command_target_voltage(void* argument)
|
||||||
|
{
|
||||||
|
(void)argument; // we won't use the argument
|
||||||
|
|
||||||
|
// set voltage
|
||||||
|
if (argument) { // if argument is provided
|
||||||
|
const uint8_t voltage = *(uint32_t*)argument; // get target voltage
|
||||||
|
switch (voltage) {
|
||||||
|
case 0:
|
||||||
|
gpio_set(GPIO_PORT(TARGET_3V_PIN), GPIO_PIN(TARGET_3V_PIN)); // disable 3V output
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
gpio_clear(GPIO_PORT(TARGET_3V_PIN), GPIO_PIN(TARGET_3V_PIN)); // enable 3V output
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
puts("unknown voltage to set\n");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
sleep_us(100); // wait a bit for voltage to settle
|
||||||
|
}
|
||||||
|
|
||||||
|
// show voltage output
|
||||||
|
if (!gpio_get(GPIO_PORT(TARGET_3V_PIN), GPIO_PIN(TARGET_3V_PIN))) {
|
||||||
|
puts("target voltage set to 3.3 V\n");
|
||||||
|
} else {
|
||||||
|
puts("target voltage externally provided\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
float* voltages = measure_voltages(); // measure voltages
|
||||||
|
puts("target voltage: ");
|
||||||
|
print_fpu(voltages[1], 2);
|
||||||
|
puts(" V");
|
||||||
|
if (voltages[1] < 1.0) {
|
||||||
|
puts(" (warning: target voltage seems not connected)");
|
||||||
|
}
|
||||||
|
putc('\n');
|
||||||
|
}
|
||||||
|
|
||||||
/** display available commands
|
/** display available commands
|
||||||
* @param[in] argument no argument required
|
* @param[in] argument no argument required
|
||||||
*/
|
*/
|
||||||
|
@ -383,7 +449,7 @@ static const struct menu_command_t menu_commands[] = {
|
||||||
.command_handler = &command_help,
|
.command_handler = &command_help,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.shortcut = 'v',
|
.shortcut = 'V',
|
||||||
.name = "version",
|
.name = "version",
|
||||||
.command_description = "show software and hardware version",
|
.command_description = "show software and hardware version",
|
||||||
.argument = MENU_ARGUMENT_NONE,
|
.argument = MENU_ARGUMENT_NONE,
|
||||||
|
@ -430,6 +496,14 @@ static const struct menu_command_t menu_commands[] = {
|
||||||
.argument_description = NULL,
|
.argument_description = NULL,
|
||||||
.command_handler = &command_bootloader,
|
.command_handler = &command_bootloader,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
.shortcut = 'v',
|
||||||
|
.name = "voltage",
|
||||||
|
.command_description = "set/measure target voltage",
|
||||||
|
.argument = MENU_ARGUMENT_UNSIGNED,
|
||||||
|
.argument_description = "[0|3|5]",
|
||||||
|
.command_handler = &command_target_voltage,
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
static void command_help(void* argument)
|
static void command_help(void* argument)
|
||||||
|
|
Loading…
Reference in New Issue