void audio_init(void) { // DAC peripheral clock RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE); // DAC channel 2 (DAC_OUT2 = PA.5) configuration GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOA, &GPIO_InitStructure); // DAC channel2 Configuration 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); // Enable DAC Channel2 DAC_Cmd(DAC_Channel_2, ENABLE); // from now on use DAC_SetChannel2Data to trigger a conversion sample_buf_in = 0; sample_buf_out = 0; // enable interrupt // Python interface mp_obj_t m = mp_obj_new_module(qstr_from_str_static("audio")); rt_store_attr(m, qstr_from_str_static("dac"), rt_make_function_n(1, pyb_audio_dac)); rt_store_attr(m, qstr_from_str_static("is_full"), rt_make_function_n(0, pyb_audio_is_full)); rt_store_attr(m, qstr_from_str_static("fill"), rt_make_function_n(1, pyb_audio_fill)); rt_store_name(qstr_from_str_static("audio"), m); }
scope_t *scope_new(scope_kind_t kind, mp_parse_node_t pn, uint unique_code_id, uint emit_options) { scope_t *scope = m_new(scope_t, 1); scope->kind = kind; scope->parent = NULL; scope->next = NULL; scope->pn = pn; switch (kind) { case SCOPE_MODULE: scope->simple_name = 0; break; case SCOPE_FUNCTION: case SCOPE_CLASS: assert(MP_PARSE_NODE_IS_STRUCT(pn)); scope->simple_name = MP_PARSE_NODE_LEAF_ARG(((mp_parse_node_struct_t*)pn)->nodes[0]); break; case SCOPE_LAMBDA: scope->simple_name = qstr_from_str_static("<lambda>"); break; case SCOPE_LIST_COMP: scope->simple_name = qstr_from_str_static("<listcomp>"); break; case SCOPE_DICT_COMP: scope->simple_name = qstr_from_str_static("<dictcomp>"); break; case SCOPE_SET_COMP: scope->simple_name = qstr_from_str_static("<setcomp>"); break; case SCOPE_GEN_EXPR: scope->simple_name = qstr_from_str_static("<genexpr>"); break; default: assert(0); } scope->id_info_alloc = 8; scope->id_info_len = 0; scope->id_info = m_new(id_info_t, scope->id_info_alloc); scope->flags = 0; scope->num_params = 0; /* not needed scope->num_default_params = 0; scope->num_dict_params = 0; */ scope->num_locals = 0; scope->unique_code_id = unique_code_id; scope->emit_options = emit_options; return scope; }
void timer_init(void) { timer_py_callback = mp_const_none; // TIM6 clock enable RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE); // Compute the prescaler value so TIM6 runs at 20kHz uint16_t PrescalerValue = (uint16_t) ((SystemCoreClock / 2) / 20000) - 1; // Time base configuration TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_TimeBaseStructure.TIM_Period = 20000; // timer cycles at 1Hz TIM_TimeBaseStructure.TIM_Prescaler = PrescalerValue; TIM_TimeBaseStructure.TIM_ClockDivision = 0; // unused for TIM6 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; // unused for TIM6 TIM_TimeBaseInit(TIM6, &TIM_TimeBaseStructure); // enable perhipheral preload register TIM_ARRPreloadConfig(TIM6, ENABLE); // enable interrupt when counter overflows TIM_ITConfig(TIM6, TIM_IT_Update, ENABLE); // set up interrupt NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel = TIM6_DAC_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0f; // lowest priority NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0f; // lowest priority NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); // TIM6 enable counter TIM_Cmd(TIM6, ENABLE); // Python interface mp_obj_t m = mp_obj_new_module(qstr_from_str_static("timer")); rt_store_attr(m, qstr_from_str_static("callback"), rt_make_function_n(1, timer_py_set_callback)); rt_store_attr(m, qstr_from_str_static("period"), rt_make_function_n(1, timer_py_set_period)); rt_store_attr(m, qstr_from_str_static("prescaler"), rt_make_function_n(1, timer_py_set_prescaler)); rt_store_attr(m, qstr_from_str_static("value"), rt_make_function_n(0, timer_py_get_value)); rt_store_name(qstr_from_str_static("timer"), m); }
void rt_init(void) { rt_q_append = qstr_from_str_static("append"); rt_q_pop = qstr_from_str_static("pop"); rt_q_sort = qstr_from_str_static("sort"); rt_q_join = qstr_from_str_static("join"); rt_q_format = qstr_from_str_static("format"); rt_q___build_class__ = qstr_from_str_static("__build_class__"); rt_q___next__ = qstr_from_str_static("__next__"); rt_q_AttributeError = qstr_from_str_static("AttributeError"); rt_q_IndexError = qstr_from_str_static("IndexError"); rt_q_KeyError = qstr_from_str_static("KeyError"); rt_q_NameError = qstr_from_str_static("NameError"); rt_q_TypeError = qstr_from_str_static("TypeError"); rt_q_SyntaxError = qstr_from_str_static("SyntaxError"); rt_q_ValueError = qstr_from_str_static("ValueError"); // locals = globals for outer module (see Objects/frameobject.c/PyFrame_New()) map_locals = map_globals = mp_map_new(MP_MAP_QSTR, 1); mp_qstr_map_lookup(map_globals, qstr_from_str_static("__name__"), true)->value = mp_obj_new_str(qstr_from_str_static("__main__")); // init built-in hash table mp_map_init(&map_builtins, MP_MAP_QSTR, 3); // built-in exceptions (TODO, make these proper classes) mp_qstr_map_lookup(&map_builtins, rt_q_AttributeError, true)->value = mp_obj_new_exception(rt_q_AttributeError); mp_qstr_map_lookup(&map_builtins, rt_q_IndexError, true)->value = mp_obj_new_exception(rt_q_IndexError); mp_qstr_map_lookup(&map_builtins, rt_q_KeyError, true)->value = mp_obj_new_exception(rt_q_KeyError); mp_qstr_map_lookup(&map_builtins, rt_q_NameError, true)->value = mp_obj_new_exception(rt_q_NameError); mp_qstr_map_lookup(&map_builtins, rt_q_TypeError, true)->value = mp_obj_new_exception(rt_q_TypeError); mp_qstr_map_lookup(&map_builtins, rt_q_SyntaxError, true)->value = mp_obj_new_exception(rt_q_SyntaxError); mp_qstr_map_lookup(&map_builtins, rt_q_ValueError, true)->value = mp_obj_new_exception(rt_q_ValueError); // built-in core functions mp_qstr_map_lookup(&map_builtins, rt_q___build_class__, true)->value = rt_make_function_2(mp_builtin___build_class__); mp_qstr_map_lookup(&map_builtins, qstr_from_str_static("__repl_print__"), true)->value = rt_make_function_1(mp_builtin___repl_print__); // built-in user functions mp_qstr_map_lookup(&map_builtins, qstr_from_str_static("abs"), true)->value = rt_make_function_1(mp_builtin_abs); mp_qstr_map_lookup(&map_builtins, qstr_from_str_static("all"), true)->value = rt_make_function_1(mp_builtin_all); mp_qstr_map_lookup(&map_builtins, qstr_from_str_static("any"), true)->value = rt_make_function_1(mp_builtin_any); mp_qstr_map_lookup(&map_builtins, qstr_from_str_static("bool"), true)->value = rt_make_function_var(0, mp_builtin_bool); mp_qstr_map_lookup(&map_builtins, qstr_from_str_static("callable"), true)->value = rt_make_function_1(mp_builtin_callable); mp_qstr_map_lookup(&map_builtins, qstr_from_str_static("chr"), true)->value = rt_make_function_1(mp_builtin_chr); #if MICROPY_ENABLE_FLOAT mp_qstr_map_lookup(&map_builtins, qstr_from_str_static("complex"), true)->value = (mp_obj_t)&mp_builtin_complex_obj; #endif mp_qstr_map_lookup(&map_builtins, qstr_from_str_static("dict"), true)->value = rt_make_function_0(mp_builtin_dict); mp_qstr_map_lookup(&map_builtins, qstr_from_str_static("divmod"), true)->value = rt_make_function_2(mp_builtin_divmod); #if MICROPY_ENABLE_FLOAT mp_qstr_map_lookup(&map_builtins, qstr_from_str_static("float"), true)->value = (mp_obj_t)&mp_builtin_float_obj; #endif mp_qstr_map_lookup(&map_builtins, qstr_from_str_static("hash"), true)->value = (mp_obj_t)&mp_builtin_hash_obj; mp_qstr_map_lookup(&map_builtins, qstr_from_str_static("int"), true)->value = (mp_obj_t)&mp_builtin_int_obj; mp_qstr_map_lookup(&map_builtins, qstr_from_str_static("iter"), true)->value = (mp_obj_t)&mp_builtin_iter_obj; mp_qstr_map_lookup(&map_builtins, qstr_from_str_static("len"), true)->value = rt_make_function_1(mp_builtin_len); mp_qstr_map_lookup(&map_builtins, qstr_from_str_static("list"), true)->value = rt_make_function_var(0, mp_builtin_list); mp_qstr_map_lookup(&map_builtins, qstr_from_str_static("max"), true)->value = rt_make_function_var(1, mp_builtin_max); mp_qstr_map_lookup(&map_builtins, qstr_from_str_static("min"), true)->value = rt_make_function_var(1, mp_builtin_min); mp_qstr_map_lookup(&map_builtins, qstr_from_str_static("next"), true)->value = (mp_obj_t)&mp_builtin_next_obj; mp_qstr_map_lookup(&map_builtins, qstr_from_str_static("ord"), true)->value = rt_make_function_1(mp_builtin_ord); mp_qstr_map_lookup(&map_builtins, qstr_from_str_static("pow"), true)->value = rt_make_function_var(2, mp_builtin_pow); mp_qstr_map_lookup(&map_builtins, qstr_from_str_static("print"), true)->value = rt_make_function_var(0, mp_builtin_print); mp_qstr_map_lookup(&map_builtins, qstr_from_str_static("range"), true)->value = rt_make_function_var(1, mp_builtin_range); mp_qstr_map_lookup(&map_builtins, qstr_from_str_static("set"), true)->value = (mp_obj_t)&mp_builtin_set_obj; mp_qstr_map_lookup(&map_builtins, qstr_from_str_static("sum"), true)->value = rt_make_function_var(1, mp_builtin_sum); mp_qstr_map_lookup(&map_builtins, qstr_from_str_static("type"), true)->value = (mp_obj_t)&mp_builtin_type_obj; next_unique_code_id = 2; // 1 is reserved for the __main__ module scope unique_codes = NULL; #ifdef WRITE_CODE fp_write_code = fopen("out-code", "wb"); #endif }