Advertisement
GeeckoDev

underworld theme mario

May 25th, 2012
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.36 KB | None | 0 0
  1. #include <stm32f10x.h>
  2.  
  3. /*
  4. {LA, 3, DCROCHE},
  5.             {LA, 3, DCROCHE},
  6.             {0, 0, DCROCHE},
  7.             {LA, 3, DCROCHE},
  8.             {0, 0, DCROCHE},
  9.             {FA, 3, DCROCHE},
  10.             {LA, 3, DCROCHE},
  11.             {0, 0, DCROCHE},
  12.             {DO, 4, DCROCHE},
  13.             {0, 0, DCROCHE},
  14.             {0, 0, CROCHE},
  15.             {0, 0, NOIRE},
  16.            
  17.             {DO, 4, DCROCHE},
  18.             {0, 0, DCROCHE},
  19.             {0, 0, DCROCHE},
  20.             {LA, 3, DCROCHE},
  21.             {0, 0, DCROCHE},
  22.             {0, 0, DCROCHE},
  23.             {FA, 3, DCROCHE},
  24.             {0, 0, DCROCHE},
  25.             {0, 0, CROCHE},
  26.             {LAd, 3, DCROCHE},
  27.             {0, 0, DCROCHE},
  28.             {DO, 4, DCROCHE},
  29.             {0, 0, DCROCHE},
  30.             {SI, 3, DCROCHE},
  31.             {LAd, 3, DCROCHE},
  32.             {0, 0, RONDE}
  33. */
  34.  
  35. void Enable_GPIO(void)
  36. {
  37.         RCC->APB2ENR |= 0x013C;
  38. }
  39.  
  40. void Init_GPIO(void)
  41. {
  42.         GPIOA->CRL = 0x00030004; // PA4 (Speaker) en Push-Pull et PA0 (Wake Up) en Floating Input
  43. }
  44.  
  45. void TIM1_UP_IRQHandler(void)
  46. {
  47.         if (TIM1->SR & 1)
  48.       {
  49.                 GPIOA->ODR ^= 0x10;
  50.               TIM1->SR &= ~1;
  51.         }
  52. }
  53.  
  54. typedef struct
  55. {
  56.         int frequence; // hertz
  57.         int octave; // 1 à 4
  58.         int duree; // 1/4 temps
  59. } Note;
  60.  
  61. enum
  62. {
  63.         DO = 65,
  64.       DOd = 69,
  65.         RE = 73,
  66.       REd = 78,
  67.       MI = 82,
  68.       FA = 87,
  69.       FAd = 92,
  70.       SOL = 98,
  71.       SOLd = 104,
  72.       LA = 110,
  73.       LAd = 117,
  74.       SI = 123
  75. };
  76.  
  77. enum
  78. {
  79.         RONDE = 16,
  80.       BLANCHE = 8,
  81.       NOIRE = 4,
  82.         CROCHE = 2,
  83.       DCROCHE = 1
  84. };
  85.  
  86. int main (void)
  87. {
  88.         int tempo = 200*4; // bpm
  89.         Note notes[] =
  90.         {
  91.                 {DO, 3, NOIRE},
  92.                 {DO, 4, NOIRE},
  93.                 {LA, 2, NOIRE},
  94.                 {LA, 3, NOIRE},
  95.                 {LAd, 2, NOIRE},
  96.                 {LAd, 3, NOIRE},
  97.                 {0, 0, BLANCHE},
  98.                 {0, 0, RONDE},
  99.                 {DO, 3, NOIRE},
  100.                 {DO, 4, NOIRE},
  101.                 {LA, 2, NOIRE},
  102.                 {LA, 3, NOIRE},
  103.                 {LAd, 2, NOIRE},
  104.                 {LAd, 3, NOIRE},
  105.                 {0, 0, BLANCHE},
  106.                 {0, 0, RONDE},
  107.  
  108.                 {FA, 2, NOIRE},
  109.                 {FA, 3, NOIRE},
  110.                 {RE, 2, NOIRE},
  111.                 {RE, 3, NOIRE},
  112.                 {REd, 2, NOIRE},
  113.                 {REd, 3, NOIRE},
  114.                 {0, 0, BLANCHE},
  115.                 {0, 0, RONDE},
  116.                 {FA, 2, NOIRE},
  117.                 {FA, 3, NOIRE},
  118.                 {RE, 2, NOIRE},
  119.                 {RE, 3, NOIRE},
  120.                 {REd, 2, NOIRE},
  121.                 {REd, 3, NOIRE},
  122.                 {0, 0, BLANCHE},
  123.                 {0, 0, BLANCHE},
  124.                 {REd, 3, CROCHE},
  125.                 {RE, 3, CROCHE},
  126.                 {DOd, 3, NOIRE},
  127.                
  128.                 {DO, 3, BLANCHE},
  129.                 {REd, 3, BLANCHE},
  130.                 {RE, 3, BLANCHE},
  131.                 {SOLd, 2, BLANCHE},
  132.                 {SOL, 2, BLANCHE},
  133.                 {DOd, 3, BLANCHE},
  134.                                
  135.                 {DO, 3, CROCHE},
  136.                 {FAd, 3, CROCHE},
  137.                 {FA, 3, NOIRE},
  138.                 {MI, 3, CROCHE},
  139.                 {LAd, 3, CROCHE},
  140.                 {LA, 3, NOIRE},
  141.                 {SOLd, 3, NOIRE},
  142.                 {REd, 3, NOIRE},
  143.                 {SI, 2, BLANCHE},
  144.                 {LAd, 2, NOIRE},
  145.                 {LA, 2, NOIRE},
  146.                 {SOLd, 2, BLANCHE},
  147.                
  148.                 {0, 0, RONDE},
  149.                 {0, 0, RONDE},
  150.                 {0, 0, RONDE},
  151.         };
  152.         int i=0, j=0;
  153.    
  154.         Enable_GPIO();
  155.         Init_GPIO();
  156.        
  157.         /* Initialisation Timer 1 (TIM1) */
  158.    
  159.         RCC->APB2ENR |= (1 << 11); // Validation Timer 1
  160.         TIM1->CR1    |= 0x0001; // Timer 1 Enable
  161.         TIM1->DIER   |= 1;
  162.         TIM1->ARR     = 500;
  163.         *(volatile unsigned long *)0xE000E100 |= (1<<25);
  164.        
  165.         TIM1->PSC = 72000000 / TIM1->ARR / (notes[i].frequence << (notes[i].octave));
  166.        
  167.         while (1)
  168.         {
  169.                 unsigned int cochon = 5000000*60/tempo;
  170.                 while (cochon--);
  171.  
  172.                 j++;
  173.                 if (j >= notes[i].duree)
  174.                 {
  175.                         i++;
  176.                         TIM1->PSC = 72000000 / TIM1->ARR / (notes[i].frequence << (notes[i].octave));
  177.                         j=0;
  178.                 }
  179.                 if (i >= sizeof(notes) / sizeof(Note))
  180.                 {
  181.                     i = 0;
  182.                     TIM1->PSC = 72000000 / TIM1->ARR / (notes[i].frequence << (notes[i].octave));
  183.                 }
  184.         }
  185. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement