/* Gibt ein paar Töne der Tonleiter aus. Ein Rechtecksignal der Frequenz des Tons wird mit dem Systicktimer erzeugt. Der Timer startet mit der Frequenz 2*Frequenz_des_Tons und pro Schwingung 2 Mal aufgerufen. Beim ersten Mal wird das Rechtecksignal ein- und beim zweiten Mal wieder ausgeschatlet. Die Tonausgabe liegt an am Pin PA4. Es wird eine einfache Tonleiter, pro Ton 1/2 Sekunde, ausgegeben. Schaltung: Ausgabe-Pin --> 2K -> Kopfhörer -> GND Am Ausgabepin muss ein etwa 1K bis 2K grosser Vorwiderstand vor dem Kopfhörer angeschlossen sein. Danach der Kopfhörer und dann 0V (-, Erde, GND). Grösse des Wiederstandes: Sei Impedanz des Kopfhörers 240 Ohm Rk: Die Leistung P sollte kleiner 1mW betragen. P = I * V = V/(Rk+Rv) * (I*Rk) = (V/(Rk+Rv))**2 * Rk V = 3.3V, Rk = 240 Ohm, und Vorwiederstand Rv = 2K ==> P = 0.5mW Am besten wird der Kopfhörer über einen "Audio jack" / Klinkenbuchse 3.5mm angeschlossen. */ int main(void) { enable_gpio_clockcntrl(GPIO_PORTA_BIT/*switch+audio out*/|GPIO_PORTE_BIT/*led*/); config_input_gpio(GPIO_PORTA, GPIO_PIN0, GPIO_PULL_OFF); config_output_gpio(GPIO_PORTA, GPIO_PIN4); config_output_gpio(GPIO_PORTE, GPIO_PINS(15,8)); config_systick(8000000/*dummy*/, systickcfg_CORECLK|systickcfg_INTERRUPT); write1_gpio(GPIO_PORTE, GPIO_PIN8); while (1) { if (read_gpio(GPIO_PORTA, GPIO_PIN0) == 1) { setperiod_systick(note_period[C1]); counter = 0; isON = 1; start_systick(); for (unsigned tone = C1+1; tone <= C2; ++tone) { unsigned led = 8 + (tone & 7); setpins_gpio(GPIO_PORTE, GPIO_PINS(led,led), GPIO_PINS(15,8)&~led); while (4000000 > counter) ; while (! isON) ; while (isON) ; counter = 0; setperiod_systick(note_period[tone]); } stop_systick(); while (read_gpio(GPIO_PORTA, GPIO_PIN0) == 1) ; } } }
/* Gibt mit 11025 Hz gesampeltes Geräusch an Pin PA4 und PA5 mittels Digital-Analog-Converter aus. Eine 3.5mm Kopfhörerbuchse sollte an die Anschlüsse GND, PA4 und PA5 angeschlossen werden per Steckbrett und Jumper-Kabel. Ein Vorwiderstand zwischen GND und Buchse von mind. 100Ohm und fertig. Kopfhörer angeschlossen, nun kann der Sound akustisch wahrgenommen werden. Ein Druck auf den User-Button erzeugt ein Schussgeräusch, dann ein UFO und danach erklingt eine Explosion. Wird die Usertaste erneut gedrückt, bevor das Geräusch ausgeklungen ist, wird die Ausgabe wiederholt, beginnend mit dem Schussgeräusch. */ int main(void) { enable_gpio_clockcntrl(GPIO_PORTA_BIT/*switch+audio-out*/|GPIO_PORTE_BIT/*led*/); enable_dac_clockcntrl(); config_input_gpio(GPIO_PORTA, GPIO_PIN0, GPIO_PULL_OFF); // Wichtig: Zuerst IOPIN auf analog umschalten, damit keine parasitären Ströme fliessen config_analog_gpio(GPIO_PORTA, GPIO_PIN4); #if defined(USE_EXTI_LINE9) config_output_gpio(GPIO_PORTA, GPIO_PIN9); #endif config_output_gpio(GPIO_PORTE, GPIO_PINS(15,8)); #if defined(USE_SWTRIGGER) config_dac(DAC1, dac_channel_DUAL, daccfg_ENABLE_CHANNEL|daccfg_ENABLE_TRIGGER|daccfg_TRIGGER_SOFTWARE); #elif defined(USE_EXTI_LINE9) config_dac(DAC1, dac_channel_DUAL, daccfg_ENABLE_CHANNEL|daccfg_ENABLE_TRIGGER|daccfg_TRIGGER_EXTI_LINE9); #else config_dac(DAC1, dac_channel_DUAL, daccfg_ENABLE_CHANNEL|daccfg_DISABLE_TRIGGER); #endif if (isenabled_dac(DAC1, dac_channel_1) != 1 || isenabled_dac(DAC1, dac_channel_2) != 1 || isenabled_dac(DAC1, dac_channel_DUAL) != 1) { // error write1_gpio(GPIO_PORTE, GPIO_PINS(15,8)); } config_systick((8000000+11025/2) / 11025, systickcfg_CORECLK|systickcfg_INTERRUPT); write1_gpio(GPIO_PORTE, GPIO_PIN8); while (1) { if (read_gpio(GPIO_PORTA, GPIO_PIN0) == 1) { stop_systick(); counter = 0; soundnr = 0; start_systick(); write1_gpio(GPIO_PORTE, GPIO_PIN9); while (read_gpio(GPIO_PORTA, GPIO_PIN0) == 1) ; write0_gpio(GPIO_PORTE, GPIO_PIN9); } } }
int main(int argc, char const *argv[]) { switch_on_hse(); construct_exceptions(); construct_nvic(); construct_systick(); construct_scheduler(); construct_app(); construct_rcc(); construct_gpio(); construct_tim14(); start_exceptions(); start_nvic(); start_systick(); start_rcc(); start_gpio(); start_tim14(); start_app(); /* must be last */ start_scheduler(); }
int main (void) { SystemCoreClockUpdate (); GPIOInit (); while (GPIOGetValue (BTN_PORT, BTN_PIN) == 0) ; POWER_ON; SSP_IOConfig (SSP_NUM); /* initialize SSP port, share pins with SPI1 on port2(p2.0-3). */ SSP_Init (SSP_NUM); UARTInit (115200); LED1_ON; TIMInit (0, 2 * SystemCoreClock); TIMInit (1, SystemCoreClock); TIMInit16 (1, SystemCoreClock); TIMInit16 (0, SystemCoreClock); enable_timer16 (0); // Initialize SYstick SysTick_Config ( SYSTICK_DELAY); MSP5701_init (); SST25_init (); //LED1_BLINK; // TODO: insert code here NVIC_ClearPendingIRQ (EINT0_IRQn); NVIC_ClearPendingIRQ (EINT1_IRQn); NVIC_EnableIRQ (EINT0_IRQn); NVIC_EnableIRQ (EINT1_IRQn); clearAllEvents(); while (1) { if (checkEvent(BtnPressed)) { // Start measuring. //GPIOSetValue(LED1_PORT, LED1_PIN, ~GPIOGetValue(LED1_PORT,LED1_PIN)&0x1); clearEvent(BtnPressed); if (measure == 1) { measure = 0; live = 0; /* Save data info */ storage_save_data_info (&actual_record); meas_pointer = 0; stop_systick (); } else { measure = 1; meas_pointer = 0; storage_init (&actual_record); start_systick (); } clearEvent(BtnPressed); } if (checkEvent(PowerOff)) { // Turn off device. storage_save_data_info (&actual_record); meas_pointer = 0; measure = 0; LED1_OFF; LED2_OFF; UARTSend ((uint8_t*) "sleep\r\n", 7); POWER_OFF ; while (1) ; clearEvent(PowerOff); } if (checkEvent(UART_data)) { clearEvent(UART_data); uint8_t command = get_uart_char (); switch (command) { case 'e': stop_systick (); SST25_erase (0, SIZE_FULL); break; case 'r': measure = 0; /* Save data info */ if (actual_record.rec_index != -1) { storage_save_data_info (&actual_record); } meas_pointer = 0; stop_systick (); send_data (); break; case 'l': sleep = 0; measure = 1; live = 1; start_systick (); break; case 'n': live = 0; measure = 1; storage_init (&actual_record); start_systick (); sleep = 1; break; case 's': live = 0; sleep = 1; measure = 0; /* Save data info */ storage_save_data_info (&actual_record); meas_pointer = 0; stop_systick (); break; default: break; } } if (TimeTick & measure) { TimeTick = 0; /* Do stuff */ MSP5701_measure_press (&press); if (live == 0) { memcpy ((uint8_t*) (meas_buffer + meas_pointer), &press, sizeof(press)); meas_pointer += sizeof(press); if (meas_pointer >= SAMPLE_BUFFER_LENGTH - 1) { /* Store samples in external memory */ uint32_t length_written = storage_save_data ( &actual_record, meas_buffer, SAMPLE_BUFFER_LENGTH); meas_pointer = 0; if (length_written != SAMPLE_BUFFER_LENGTH) { /* Run out of memory - stop measuring */ measure = 0; meas_pointer = 0; storage_save_data_info (&actual_record); /* Turn off device */ POWER_OFF ; } } } else { /*Transmit live*/ UARTSend ((uint8_t*) &press, 4); UARTSend ((uint8_t*) "\r\n", 2); } } if (sleep == 1) { __WFI (); } } return 0; }