Artery_AT32F437_Start_MPyAT.../src/main.c

99 lines
2.1 KiB
C

#include <stdio.h>
/* SDK drivers */
#include "at32f435_437_board.h"
#include "at32f435_437_clock.h"
#include "at32f435_437_i2c.h"
/* ATE */
#include "app_adc.h"
#include "app_ate_impl.h"
static ate_t s_ate = {
.ops =
{
.read = ate_impl_i2c_read,
.write = ate_impl_i2c_write,
.delay = ate_impl_delay,
},
};
static int app_ad_da_test(void);
int main(void) {
system_clock_config();
at32_board_init();
uart_print_init(115200);
app_adc_init();
ate_impl_i2c_init();
if (ate_init(&s_ate) != ATE_RET_SUCCESS) {
printf("Failed to initialize ATE.\r\n");
goto dead_loop;
}
printf("ATE initialized.\r\n");
at32_led_on(LED3);
if (app_ad_da_test() < 0) {
goto fail_exit;
}
at32_led_off(LED3);
at32_led_on(LED4);
ate_led_set(&s_ate, ATE_LED_G, true);
for (;;) {
/* -- */
}
fail_exit:
at32_led_off(LED3);
at32_led_on(LED2);
ate_led_set(&s_ate, ATE_LED_R, true);
dead_loop:
for (;;) {
/* -- */
}
}
static int app_ad_da_test(void) {
printf("[ADDA] Test started.\r\n");
for (uint16_t i = 0; i < 1024; i += 16) {
ate_led_set(&s_ate, ATE_LED_B, true);
ate_dac_set(&s_ate, i);
delay_ms(10);
uint16_t ad_result = app_adc_read();
uint16_t ad_voltage = ad_result * 3300 / 4096;
uint16_t da_voltage = i * 3300 / 1024;
int delta_voltage = ad_voltage - da_voltage;
printf("[ADDA] AD voltage: %5dmV, set: %5dmV, delta: %5dmV\r\n", ad_voltage, da_voltage, delta_voltage);
if (ad_voltage > da_voltage) {
if (ad_voltage - da_voltage > 100) {
return -1;
}
} else if (da_voltage > ad_voltage) {
if (da_voltage - ad_voltage > 100) {
return -1;
}
}
ate_led_set(&s_ate, ATE_LED_B, false);
delay_ms(10);
}
printf("[ADDA] Test completed.\r\n");
return 0;
}