kopia lustrzana https://github.com/micropython/micropython
stm: Clean up main.c; disable libgcc by default.
f2d and d2f functions from libgcc does not work correctly, most likely due to the ABI being incorrect. libgcc disabled for now.pull/208/head
rodzic
d51cfd155c
commit
2c30256382
|
@ -36,7 +36,10 @@ CFLAGS += -Os -DNDEBUG
|
||||||
endif
|
endif
|
||||||
|
|
||||||
LDFLAGS = --nostdlib -T stm32f405.ld
|
LDFLAGS = --nostdlib -T stm32f405.ld
|
||||||
LIBS = $(shell $(CC) -print-libgcc-file-name)
|
LIBS =
|
||||||
|
|
||||||
|
# uncomment this if you want libgcc
|
||||||
|
#LIBS += $(shell $(CC) -print-libgcc-file-name)
|
||||||
|
|
||||||
SRC_C = \
|
SRC_C = \
|
||||||
main.c \
|
main.c \
|
||||||
|
@ -58,10 +61,10 @@ SRC_C = \
|
||||||
timer.c \
|
timer.c \
|
||||||
audio.c \
|
audio.c \
|
||||||
sdio.c \
|
sdio.c \
|
||||||
pybwlan.c \
|
|
||||||
i2c.c \
|
i2c.c \
|
||||||
usrsw.c \
|
usrsw.c \
|
||||||
adc.c \
|
adc.c \
|
||||||
|
# pybwlan.c \
|
||||||
|
|
||||||
SRC_S = \
|
SRC_S = \
|
||||||
startup_stm32f40xx.s \
|
startup_stm32f40xx.s \
|
||||||
|
@ -133,7 +136,7 @@ SRC_CC3K = \
|
||||||
ccspi.c \
|
ccspi.c \
|
||||||
pybcc3k.c \
|
pybcc3k.c \
|
||||||
|
|
||||||
OBJ = $(PY_O) $(addprefix $(BUILD)/, $(SRC_C:.c=.o) $(SRC_S:.s=.o) $(SRC_FATFS:.c=.o) $(SRC_STM:.c=.o) $(SRC_CC3K:.c=.o))
|
OBJ = $(PY_O) $(addprefix $(BUILD)/, $(SRC_C:.c=.o) $(SRC_S:.s=.o) $(SRC_FATFS:.c=.o) $(SRC_STM:.c=.o)) # $(SRC_CC3K:.c=.o))
|
||||||
#OBJ += $(addprefix $(BUILD)/, $(SRC_STM_OTG:.c=.o))
|
#OBJ += $(addprefix $(BUILD)/, $(SRC_STM_OTG:.c=.o))
|
||||||
|
|
||||||
all2: $(BUILD) $(BUILD)/flash.dfu
|
all2: $(BUILD) $(BUILD)/flash.dfu
|
||||||
|
|
|
@ -208,9 +208,11 @@ static const mp_obj_type_t led_obj_type = {
|
||||||
.methods = led_methods,
|
.methods = led_methods,
|
||||||
};
|
};
|
||||||
|
|
||||||
mp_obj_t pyb_Led(mp_obj_t led_id) {
|
static mp_obj_t pyb_Led(mp_obj_t led_id) {
|
||||||
pyb_led_obj_t *o = m_new_obj(pyb_led_obj_t);
|
pyb_led_obj_t *o = m_new_obj(pyb_led_obj_t);
|
||||||
o->base.type = &led_obj_type;
|
o->base.type = &led_obj_type;
|
||||||
o->led_id = mp_obj_get_int(led_id);
|
o->led_id = mp_obj_get_int(led_id);
|
||||||
return o;
|
return o;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
MP_DEFINE_CONST_FUN_OBJ_1(pyb_Led_obj, pyb_Led);
|
||||||
|
|
|
@ -1,8 +1,14 @@
|
||||||
typedef enum {
|
typedef enum {
|
||||||
|
// PYBv3
|
||||||
PYB_LED_R1 = 1,
|
PYB_LED_R1 = 1,
|
||||||
PYB_LED_R2 = 2,
|
PYB_LED_R2 = 2,
|
||||||
PYB_LED_G1 = 3,
|
PYB_LED_G1 = 3,
|
||||||
PYB_LED_G2 = 4,
|
PYB_LED_G2 = 4,
|
||||||
|
// PYBv4
|
||||||
|
PYB_LED_RED = 1,
|
||||||
|
PYB_LED_GREEN = 2,
|
||||||
|
PYB_LED_YELLOW = 3,
|
||||||
|
PYB_LED_BLUE = 4,
|
||||||
//STM32F4DISC
|
//STM32F4DISC
|
||||||
PYB_LED_R = 1,
|
PYB_LED_R = 1,
|
||||||
PYB_LED_G = 2,
|
PYB_LED_G = 2,
|
||||||
|
@ -14,4 +20,4 @@ void led_init(void);
|
||||||
void led_state(pyb_led_t led, int state);
|
void led_state(pyb_led_t led, int state);
|
||||||
void led_toggle(pyb_led_t led);
|
void led_toggle(pyb_led_t led);
|
||||||
|
|
||||||
mp_obj_t pyb_Led(mp_obj_t led_id);
|
MP_DECLARE_CONST_FUN_OBJ(pyb_Led_obj);
|
||||||
|
|
223
stm/main.c
223
stm/main.c
|
@ -61,21 +61,6 @@ void flash_error(int n) {
|
||||||
led_state(PYB_LED_R2, 0);
|
led_state(PYB_LED_R2, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void impl02_c_version(void) {
|
|
||||||
int x = 0;
|
|
||||||
while (x < 400) {
|
|
||||||
int y = 0;
|
|
||||||
while (y < 400) {
|
|
||||||
volatile int z = 0;
|
|
||||||
while (z < 400) {
|
|
||||||
z = z + 1;
|
|
||||||
}
|
|
||||||
y = y + 1;
|
|
||||||
}
|
|
||||||
x = x + 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void __fatal_error(const char *msg) {
|
void __fatal_error(const char *msg) {
|
||||||
lcd_print_strn("\nFATAL ERROR:\n", 14);
|
lcd_print_strn("\nFATAL ERROR:\n", 14);
|
||||||
lcd_print_strn(msg, strlen(msg));
|
lcd_print_strn(msg, strlen(msg));
|
||||||
|
@ -108,41 +93,6 @@ mp_obj_t pyb_delay(mp_obj_t count) {
|
||||||
return mp_const_none;
|
return mp_const_none;
|
||||||
}
|
}
|
||||||
|
|
||||||
mp_obj_t pyb_led(mp_obj_t state) {
|
|
||||||
led_state(PYB_LED_G1, rt_is_true(state));
|
|
||||||
return state;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
void g(uint i) {
|
|
||||||
printf("g:%d\n", i);
|
|
||||||
if (i & 1) {
|
|
||||||
nlr_jump((void*)(42 + i));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
void f(void) {
|
|
||||||
nlr_buf_t nlr;
|
|
||||||
int i;
|
|
||||||
for (i = 0; i < 4; i++) {
|
|
||||||
printf("f:loop:%d:%p\n", i, &nlr);
|
|
||||||
if (nlr_push(&nlr) == 0) {
|
|
||||||
// normal
|
|
||||||
//printf("a:%p:%p %p %p %u\n", &nlr, nlr.ip, nlr.sp, nlr.prev, nlr.ret_val);
|
|
||||||
g(i);
|
|
||||||
printf("f:lp:%d:nrm\n", i);
|
|
||||||
nlr_pop();
|
|
||||||
} else {
|
|
||||||
// nlr
|
|
||||||
//printf("b:%p:%p %p %p %u\n", &nlr, nlr.ip, nlr.sp, nlr.prev, nlr.ret_val);
|
|
||||||
printf("f:lp:%d:nlr:%d\n", i, (int)nlr.ret_val);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
void nlr_test(void) {
|
|
||||||
f(1);
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
void fatality(void) {
|
void fatality(void) {
|
||||||
led_state(PYB_LED_R1, 1);
|
led_state(PYB_LED_R1, 1);
|
||||||
led_state(PYB_LED_G1, 1);
|
led_state(PYB_LED_G1, 1);
|
||||||
|
@ -180,6 +130,8 @@ static const char *help_text =
|
||||||
" pyb.switch() -- return True/False if switch pressed or not\n"
|
" pyb.switch() -- return True/False if switch pressed or not\n"
|
||||||
" pyb.accel() -- get accelerometer values\n"
|
" pyb.accel() -- get accelerometer values\n"
|
||||||
" pyb.rand() -- get a 16-bit random number\n"
|
" pyb.rand() -- get a 16-bit random number\n"
|
||||||
|
" pyb.gpio(<port>) -- get port value (port='a4' for example)\n"
|
||||||
|
" pyb.gpio(<port>, <val>) -- set port value, True or False, 1 or 0\n"
|
||||||
;
|
;
|
||||||
|
|
||||||
// get some help about available functions
|
// get some help about available functions
|
||||||
|
@ -587,7 +539,7 @@ mp_obj_t pyb_hid_send_report(mp_obj_t arg) {
|
||||||
|
|
||||||
static void rtc_init(void) {
|
static void rtc_init(void) {
|
||||||
uint32_t rtc_clksrc;
|
uint32_t rtc_clksrc;
|
||||||
uint32_t timeout =10000;
|
uint32_t timeout = 1000000;
|
||||||
|
|
||||||
/* Enable the PWR clock */
|
/* Enable the PWR clock */
|
||||||
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
|
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
|
||||||
|
@ -839,7 +791,6 @@ soft_reset:
|
||||||
rt_store_attr(m, MP_QSTR_sync, rt_make_function_n(0, pyb_sync));
|
rt_store_attr(m, MP_QSTR_sync, rt_make_function_n(0, pyb_sync));
|
||||||
rt_store_attr(m, MP_QSTR_gc, rt_make_function_n(0, pyb_gc));
|
rt_store_attr(m, MP_QSTR_gc, rt_make_function_n(0, pyb_gc));
|
||||||
rt_store_attr(m, MP_QSTR_delay, rt_make_function_n(1, pyb_delay));
|
rt_store_attr(m, MP_QSTR_delay, rt_make_function_n(1, pyb_delay));
|
||||||
rt_store_attr(m, MP_QSTR_led, rt_make_function_n(1, pyb_led));
|
|
||||||
rt_store_attr(m, MP_QSTR_switch, (mp_obj_t)&pyb_switch_obj);
|
rt_store_attr(m, MP_QSTR_switch, (mp_obj_t)&pyb_switch_obj);
|
||||||
rt_store_attr(m, MP_QSTR_servo, rt_make_function_n(2, pyb_servo_set));
|
rt_store_attr(m, MP_QSTR_servo, rt_make_function_n(2, pyb_servo_set));
|
||||||
rt_store_attr(m, MP_QSTR_pwm, rt_make_function_n(2, pyb_pwm_set));
|
rt_store_attr(m, MP_QSTR_pwm, rt_make_function_n(2, pyb_pwm_set));
|
||||||
|
@ -849,7 +800,7 @@ soft_reset:
|
||||||
rt_store_attr(m, MP_QSTR_hid, rt_make_function_n(1, pyb_hid_send_report));
|
rt_store_attr(m, MP_QSTR_hid, rt_make_function_n(1, pyb_hid_send_report));
|
||||||
rt_store_attr(m, MP_QSTR_time, rt_make_function_n(0, pyb_rtc_read));
|
rt_store_attr(m, MP_QSTR_time, rt_make_function_n(0, pyb_rtc_read));
|
||||||
rt_store_attr(m, MP_QSTR_rand, rt_make_function_n(0, pyb_rng_get));
|
rt_store_attr(m, MP_QSTR_rand, rt_make_function_n(0, pyb_rng_get));
|
||||||
rt_store_attr(m, MP_QSTR_Led, rt_make_function_n(1, pyb_Led));
|
rt_store_attr(m, MP_QSTR_Led, (mp_obj_t)&pyb_Led_obj);
|
||||||
rt_store_attr(m, MP_QSTR_Servo, rt_make_function_n(1, pyb_Servo));
|
rt_store_attr(m, MP_QSTR_Servo, rt_make_function_n(1, pyb_Servo));
|
||||||
rt_store_attr(m, MP_QSTR_I2C, rt_make_function_n(2, pyb_I2C));
|
rt_store_attr(m, MP_QSTR_I2C, rt_make_function_n(2, pyb_I2C));
|
||||||
rt_store_attr(m, MP_QSTR_gpio, (mp_obj_t)&pyb_gpio_obj);
|
rt_store_attr(m, MP_QSTR_gpio, (mp_obj_t)&pyb_gpio_obj);
|
||||||
|
@ -990,151 +941,6 @@ soft_reset:
|
||||||
vstr_free(vstr);
|
vstr_free(vstr);
|
||||||
}
|
}
|
||||||
|
|
||||||
//printf("init;al=%u\n", m_get_total_bytes_allocated()); // 1600, due to qstr_init
|
|
||||||
//sys_tick_delay_ms(1000);
|
|
||||||
|
|
||||||
// Python!
|
|
||||||
if (0) {
|
|
||||||
//const char *pysrc = "def f():\n x=x+1\nprint(42)\n";
|
|
||||||
const char *pysrc =
|
|
||||||
// impl01.py
|
|
||||||
/*
|
|
||||||
"x = 0\n"
|
|
||||||
"while x < 400:\n"
|
|
||||||
" y = 0\n"
|
|
||||||
" while y < 400:\n"
|
|
||||||
" z = 0\n"
|
|
||||||
" while z < 400:\n"
|
|
||||||
" z = z + 1\n"
|
|
||||||
" y = y + 1\n"
|
|
||||||
" x = x + 1\n";
|
|
||||||
*/
|
|
||||||
// impl02.py
|
|
||||||
/*
|
|
||||||
"#@micropython.native\n"
|
|
||||||
"def f():\n"
|
|
||||||
" x = 0\n"
|
|
||||||
" while x < 400:\n"
|
|
||||||
" y = 0\n"
|
|
||||||
" while y < 400:\n"
|
|
||||||
" z = 0\n"
|
|
||||||
" while z < 400:\n"
|
|
||||||
" z = z + 1\n"
|
|
||||||
" y = y + 1\n"
|
|
||||||
" x = x + 1\n"
|
|
||||||
"f()\n";
|
|
||||||
*/
|
|
||||||
/*
|
|
||||||
"print('in python!')\n"
|
|
||||||
"x = 0\n"
|
|
||||||
"while x < 4:\n"
|
|
||||||
" pyb_led(True)\n"
|
|
||||||
" pyb_delay(201)\n"
|
|
||||||
" pyb_led(False)\n"
|
|
||||||
" pyb_delay(201)\n"
|
|
||||||
" x += 1\n"
|
|
||||||
"print('press me!')\n"
|
|
||||||
"while True:\n"
|
|
||||||
" pyb_led(pyb_sw())\n";
|
|
||||||
*/
|
|
||||||
/*
|
|
||||||
// impl16.py
|
|
||||||
"@micropython.asm_thumb\n"
|
|
||||||
"def delay(r0):\n"
|
|
||||||
" b(loop_entry)\n"
|
|
||||||
" label(loop1)\n"
|
|
||||||
" movw(r1, 55999)\n"
|
|
||||||
" label(loop2)\n"
|
|
||||||
" subs(r1, r1, 1)\n"
|
|
||||||
" cmp(r1, 0)\n"
|
|
||||||
" bgt(loop2)\n"
|
|
||||||
" subs(r0, r0, 1)\n"
|
|
||||||
" label(loop_entry)\n"
|
|
||||||
" cmp(r0, 0)\n"
|
|
||||||
" bgt(loop1)\n"
|
|
||||||
"print('in python!')\n"
|
|
||||||
"@micropython.native\n"
|
|
||||||
"def flash(n):\n"
|
|
||||||
" x = 0\n"
|
|
||||||
" while x < n:\n"
|
|
||||||
" pyb_led(True)\n"
|
|
||||||
" delay(249)\n"
|
|
||||||
" pyb_led(False)\n"
|
|
||||||
" delay(249)\n"
|
|
||||||
" x = x + 1\n"
|
|
||||||
"flash(20)\n";
|
|
||||||
*/
|
|
||||||
// impl18.py
|
|
||||||
/*
|
|
||||||
"# basic exceptions\n"
|
|
||||||
"x = 1\n"
|
|
||||||
"try:\n"
|
|
||||||
" x.a()\n"
|
|
||||||
"except:\n"
|
|
||||||
" print(x)\n";
|
|
||||||
*/
|
|
||||||
// impl19.py
|
|
||||||
"# for loop\n"
|
|
||||||
"def f():\n"
|
|
||||||
" for x in range(400):\n"
|
|
||||||
" for y in range(400):\n"
|
|
||||||
" for z in range(400):\n"
|
|
||||||
" pass\n"
|
|
||||||
"f()\n";
|
|
||||||
|
|
||||||
mp_lexer_t *lex = mp_lexer_new_from_str_len("<stdin>", pysrc, strlen(pysrc), 0);
|
|
||||||
|
|
||||||
// nalloc=1740;6340;6836 -> 140;4600;496 bytes for lexer, parser, compiler
|
|
||||||
printf("lex; al=%u\n", m_get_total_bytes_allocated());
|
|
||||||
sys_tick_delay_ms(1000);
|
|
||||||
qstr parse_exc_id;
|
|
||||||
const char *parse_exc_msg;
|
|
||||||
mp_parse_node_t pn = mp_parse(lex, MP_PARSE_FILE_INPUT, &parse_exc_id, &parse_exc_msg);
|
|
||||||
mp_lexer_free(lex);
|
|
||||||
if (pn != MP_PARSE_NODE_NULL) {
|
|
||||||
printf("pars;al=%u\n", m_get_total_bytes_allocated());
|
|
||||||
sys_tick_delay_ms(1000);
|
|
||||||
//parse_node_show(pn, 0);
|
|
||||||
mp_obj_t module_fun = mp_compile(pn, 0, false);
|
|
||||||
printf("comp;al=%u\n", m_get_total_bytes_allocated());
|
|
||||||
sys_tick_delay_ms(1000);
|
|
||||||
|
|
||||||
if (module_fun == mp_const_none) {
|
|
||||||
printf("compile error\n");
|
|
||||||
} else {
|
|
||||||
// execute it!
|
|
||||||
|
|
||||||
// flash once
|
|
||||||
led_state(PYB_LED_G1, 1);
|
|
||||||
sys_tick_delay_ms(100);
|
|
||||||
led_state(PYB_LED_G1, 0);
|
|
||||||
|
|
||||||
nlr_buf_t nlr;
|
|
||||||
if (nlr_push(&nlr) == 0) {
|
|
||||||
mp_obj_t ret = rt_call_function_0(module_fun);
|
|
||||||
printf("done! got: ");
|
|
||||||
mp_obj_print(ret, PRINT_REPR);
|
|
||||||
printf("\n");
|
|
||||||
nlr_pop();
|
|
||||||
} else {
|
|
||||||
// uncaught exception
|
|
||||||
printf("exception: ");
|
|
||||||
mp_obj_print((mp_obj_t)nlr.ret_val, PRINT_REPR);
|
|
||||||
printf("\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
// flash once
|
|
||||||
led_state(PYB_LED_G1, 1);
|
|
||||||
sys_tick_delay_ms(100);
|
|
||||||
led_state(PYB_LED_G1, 0);
|
|
||||||
|
|
||||||
sys_tick_delay_ms(1000);
|
|
||||||
printf("nalloc=%u\n", m_get_total_bytes_allocated());
|
|
||||||
sys_tick_delay_ms(1000);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// HID example
|
// HID example
|
||||||
if (0) {
|
if (0) {
|
||||||
uint8_t data[4];
|
uint8_t data[4];
|
||||||
|
@ -1170,23 +976,6 @@ soft_reset:
|
||||||
|
|
||||||
do_repl();
|
do_repl();
|
||||||
|
|
||||||
// benchmark C version of impl02.py
|
|
||||||
if (0) {
|
|
||||||
led_state(PYB_LED_G1, 1);
|
|
||||||
sys_tick_delay_ms(100);
|
|
||||||
led_state(PYB_LED_G1, 0);
|
|
||||||
impl02_c_version();
|
|
||||||
led_state(PYB_LED_G1, 1);
|
|
||||||
sys_tick_delay_ms(100);
|
|
||||||
led_state(PYB_LED_G1, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
// SD card testing
|
|
||||||
if (0) {
|
|
||||||
extern void sdio_init(void);
|
|
||||||
sdio_init();
|
|
||||||
}
|
|
||||||
|
|
||||||
printf("PYB: sync filesystems\n");
|
printf("PYB: sync filesystems\n");
|
||||||
pyb_sync();
|
pyb_sync();
|
||||||
|
|
||||||
|
@ -1196,7 +985,8 @@ soft_reset:
|
||||||
goto soft_reset;
|
goto soft_reset;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* now supplied by libgcc library
|
// these 2 functions seem to actually work... no idea why
|
||||||
|
// replacing with libgcc does not work (probably due to wrong calling conventions)
|
||||||
double __aeabi_f2d(float x) {
|
double __aeabi_f2d(float x) {
|
||||||
// TODO
|
// TODO
|
||||||
return 0.0;
|
return 0.0;
|
||||||
|
@ -1206,7 +996,6 @@ float __aeabi_d2f(double x) {
|
||||||
// TODO
|
// TODO
|
||||||
return 0.0;
|
return 0.0;
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
|
|
||||||
double sqrt(double x) {
|
double sqrt(double x) {
|
||||||
// TODO
|
// TODO
|
||||||
|
|
|
@ -11,7 +11,6 @@ Q(main)
|
||||||
Q(sync)
|
Q(sync)
|
||||||
Q(gc)
|
Q(gc)
|
||||||
Q(delay)
|
Q(delay)
|
||||||
Q(led)
|
|
||||||
Q(switch)
|
Q(switch)
|
||||||
Q(servo)
|
Q(servo)
|
||||||
Q(pwm)
|
Q(pwm)
|
||||||
|
|
|
@ -11,7 +11,7 @@ void *memcpy(void *dest, const void *src, size_t n);
|
||||||
void *memmove(void *dest, const void *src, size_t n);
|
void *memmove(void *dest, const void *src, size_t n);
|
||||||
void *memset(void *s, int c, size_t n);
|
void *memset(void *s, int c, size_t n);
|
||||||
|
|
||||||
//int strlen(const char *str);
|
size_t strlen(const char *str);
|
||||||
int strcmp(const char *s1, const char *s2);
|
int strcmp(const char *s1, const char *s2);
|
||||||
int strncmp(const char *s1, const char *s2, size_t n);
|
int strncmp(const char *s1, const char *s2, size_t n);
|
||||||
char *strndup(const char *s, size_t n);
|
char *strndup(const char *s, size_t n);
|
||||||
|
|
|
@ -286,6 +286,7 @@ void EXTI15_10_IRQHandler(void) {
|
||||||
// work out if it's A14 that had the interrupt
|
// work out if it's A14 that had the interrupt
|
||||||
if (EXTI_GetITStatus(EXTI_Line14) != RESET) {
|
if (EXTI_GetITStatus(EXTI_Line14) != RESET) {
|
||||||
led_toggle(PYB_LED_G2);
|
led_toggle(PYB_LED_G2);
|
||||||
|
/* these are needed for CC3000 support
|
||||||
extern void SpiIntGPIOHandler(void);
|
extern void SpiIntGPIOHandler(void);
|
||||||
extern uint32_t exti14_enabled;
|
extern uint32_t exti14_enabled;
|
||||||
extern uint32_t exti14_missed;
|
extern uint32_t exti14_missed;
|
||||||
|
@ -296,6 +297,7 @@ void EXTI15_10_IRQHandler(void) {
|
||||||
} else {
|
} else {
|
||||||
exti14_missed = 1;
|
exti14_missed = 1;
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
EXTI_ClearITPendingBit(EXTI_Line14);
|
EXTI_ClearITPendingBit(EXTI_Line14);
|
||||||
//printf("<- EXTI14 done\n");
|
//printf("<- EXTI14 done\n");
|
||||||
}
|
}
|
||||||
|
|
Ładowanie…
Reference in New Issue