Basic speaker testing on a STM32L053R8 board. Based on other examples and improved using commands sent from PC over serial-USB (t=Tone, s=Sweep, p=Police, h=Song, space=Exit). A small 8-Ohm speaker directly plugged on GND/PA_0 (PWM out) makes a low but clearly audible sound.

Dependencies:   mbed

Revision:
0:59717cf94c6a
Child:
1:7fdec2560f78
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Fri Jan 09 17:46:14 2015 +0000
@@ -0,0 +1,99 @@
+#include "mbed.h"
+
+//  Notes      
+#define A4      440        
+#define B4b     446         
+#define C4      261
+#define C4_1    130 
+#define C5      523      
+#define D4      293   
+#define D4b     277               
+#define E4      329          
+#define F4      349           
+#define G4      392  
+ 
+const int notes[] = {C4_1,C4,D4,C4,F4,E4,C4_1,C4,D4,C4,G4,F4,C4_1,C4,C5,A4,F4,E4,D4,B4b,B4b,A4,F4,G4,F4};
+const int intervals[] = {4, 4, 8, 8, 8, 10, 4, 4, 8, 8, 8, 10, 4, 4, 8, 8, 8, 8, 8, 4, 4, 8, 8, 8, 12};     
+
+// speaker sound effect demo using PWM hardware output
+PwmOut speaker(PA_0);
+// serail port to PC (over USB)
+Serial pc(USBTX, USBRX); // tx, rx
+ 
+int main()
+{
+    int i;
+    char c = 0;
+    
+    // Intro ( ta-dah @ 500Hz )
+    speaker.period(1.0/500.0); // 500hz period
+    speaker =0.5; //50% duty cycle - max volume
+    wait(.05);
+    speaker=0.0; // turn off audio
+    wait(.05);
+    speaker =0.5; //50% duty cycle - max volume
+    wait(.5);
+    speaker=0.0; // turn off audio
+    
+    pc.printf (" \n");
+    pc.printf ("t=Tone, s=Sweep, p=Police, h=Song\n");
+    
+    while(c != ' ') {
+       
+       c=pc.getc();
+       pc.printf("%c",c);
+       wait(.1);
+       
+       switch (c)
+       {
+           case 't':
+           pc.printf ("Tone...\n");
+           // generate a short 150Hz tone using PWM hardware output
+           // something like this can be used for a button click effect for feedback
+           speaker =0.25; //25% duty cycle - mid range volume
+           for (i=0; i<10; i++) {
+              speaker.period(1.0/150.0); // 500hz period
+
+              wait(.02);
+           }
+           speaker=0.0; // off
+           break;
+           
+           case 's':
+           pc.printf ("Sweep...\n");
+           // sweep up in frequency by changing the PWM period
+           speaker=0.25;
+           for (i=0; i<8000; i=i+100) {
+              speaker.period(1.0/float(i));
+              wait(.02);
+           }
+           speaker=0.0; // off
+           break;
+
+           case 'p':
+           pc.printf ("Police...\n");
+           // two tone police siren effect - two periods or two frequencies
+           // increase volume - by changing the PWM duty cycle
+           for (i=0; i<26; i=i+2) {
+              speaker.period(1.0/969.0);
+              speaker = float(i)/50.0;
+              wait(.5);
+              speaker.period(1.0/800.0);
+              wait(.5);
+           }
+           speaker=0.0; // off
+           break;
+           
+           case 'h':
+           // Play "happy birthday"
+           speaker=0.25;
+           for (int i=0;i<=24;i++) {
+               speaker.period(1.0/notes[i]);
+               wait(0.8*intervals[i]/10);
+           }
+           speaker=0.0; // off
+           break;
+      }
+   }
+   pc.printf ("Bye...\n");
+}
\ No newline at end of file