#概要
vistaでstm32duinoやってみた。
AMラジオを鳴らしてみた。
#サンプルコード
volatile int v;
#define CLOCK (1000000/8)
#define UA 1
#define SILO 2
#define DO 3
#define DOSH 4
#define RE 5
#define RESH 6
#define MI 7
#define FA 8
#define FASH 9
#define SO 10
#define SOSH 11
#define LA 12
#define SIFL 13
#define SI 14
#define DOHI 15
#define DOHS 16
#define REHI 17
#define REHS 18
#define MIHI 19
#define FAHI 20
#define FAHS 21
#define END0 0x30
#define OFF0 0x31
#define T03 4
#define T06 8
#define T09 12
#define NOTE 32
byte musicData[200] = {
DO, T03,
FA, T03,
FA, T09,
FA, T03,
MI, T03,
RE, T03,
DO, T03,
RE, T09,
DO, T03,
DO, T03,
UA, T03,
DO, T03,
RE, T06,
RE, T03,
RE, T03,
RE, T03,
FA, T03,
RE, T03,
MI, T06,
UA, T03,
OFF0, T03,
UA, T03,
DO, T03,
RE, T06,
RE, T03,
FA, T03,
SO, T06,
FA, T03,
MI, T03,
FA, T06,
MI, T03,
RE, T03,
RE, T06,
DO, T03,
RE, T06,
RE, T03,
RE, T03,
LA, T03,
FA, T03,
LA, T03,
SO, T09,
OFF0, T03,
DO, T03,
FA, T09,
FA, T03,
FA, T03,
MI, T03,
RE, T03,
DO, T03,
RE, T09,
DO, T03,
DO, T03,
UA, T06,
DO, T03,
RE, T03,
RE, T06,
RE, T03,
RE, T03,
FA, T03,
RE, T03,
MI, T03,
UA, T06,
OFF0, T03,
UA, T03,
DO, T03,
RE, T06,
RE, T03,
FA, T03,
SO, T06,
FA, T03,
MI, T03,
FA, T06,
MI, T03,
RE, T03,
RE, T06,
DO, T03,
RE, T06,
RE, T03,
RE, T03,
LA, T03,
FA, T03,
LA, T03,
SO, T09,
END0, T03,
END0, T03
};
void playTone(byte tone0, byte tempo) {
int i,
hz,
itone;
switch (tone0)
{
case UA:
hz = 466 / NOTE;
itone = ((int) (CLOCK / 466)) << 3;
break;
case SILO:
hz = 493 / NOTE;
itone = ((int) (CLOCK / 493)) << 3;
break;
case DO:
hz = 523 / NOTE;
itone = ((int) (CLOCK / 523)) << 3;
break;
case DOSH:
hz = 554 / NOTE;
itone = ((int) (CLOCK / 554)) << 3;
break;
case RE:
hz = 587 / NOTE;
itone = ((int) (CLOCK / 587)) << 3;
break;
case RESH:
hz = 622 / NOTE;
itone = ((int) (CLOCK / 622)) << 3;
break;
case MI:
hz = 659 / NOTE;
itone = ((int) (CLOCK / 659)) << 3;
break;
case FA:
hz = 698 / NOTE;
itone = ((int) (CLOCK / 698)) << 3;
break;
case FASH:
hz = 739 / NOTE;
itone = ((int) (CLOCK / 739)) << 3;
break;
case SO:
hz = 783 / NOTE;
itone = ((int) (CLOCK / 783)) << 3;
break;
case SOSH:
hz = 830 / NOTE;
itone = ((int) (CLOCK / 830)) << 3;
break;
case LA:
hz = 880 / NOTE;
itone = ((int) (CLOCK / 880)) << 3;
break;
case SIFL:
hz = 932 / NOTE;
itone = ((int) (CLOCK / 932)) << 3;
break;
case SI:
hz = 987 / NOTE;
itone = ((int) (CLOCK / 987)) << 3;
break;
case DOHI:
hz = 1046 / NOTE;
itone = ((int) (CLOCK / 1046)) << 3;
break;
case DOHS:
hz = 1108 / NOTE;
itone = ((int) (CLOCK / 1108)) << 3;
break;
case REHI:
hz = 1174 / NOTE;
itone = ((int) (CLOCK / 1174)) << 3;
break;
case REHS:
hz = 1244 / NOTE;
itone = ((int) (CLOCK / 1244)) << 3;
break;
case MIHI:
hz = 1318 / NOTE;
itone = ((int) (CLOCK / 1318)) << 3;
break;
case FAHI:
hz = 1396 / NOTE;
itone = ((int) (CLOCK / 1396)) << 3;
break;
case FAHS:
hz = 1480 / NOTE;
itone = ((int) (CLOCK / 1480)) << 3;
break;
default:
hz = 880 / NOTE;
itone = ((int) (CLOCK / 880)) << 3;
break;
}
for ( ; tempo > 0; tempo--)
{
if ((tone0 == OFF0) || (tone0 == END0))
{
delayMicroseconds(NOTE * 1000);
}
else
{
for (i = 0; i < hz; i++)
{
pinMode(PC13, INPUT);
delayMicroseconds(itone);
pinMode(PC13, OUTPUT);
delayMicroseconds(itone);
}
}
}
delayMicroseconds(50000);
}
void isr0(void) {
if (v == 0)
{
GPIOC->BSRR = 0b0010000000000000;
v = 1;
}
else
{
GPIOC->BSRR = 0b0010000000000000 << 16;
v = 0;
}
}
void setup() {
pinMode(PC13, OUTPUT);
digitalWrite(PC13, HIGH);
TIM_TypeDef * Instance = TIM1;
HardwareTimer * MyTim = new HardwareTimer(Instance);
MyTim->setOverflow(12, MICROSEC_FORMAT);
MyTim->attachInterrupt(isr0);
MyTim->resume();
}
void loop() {
int i;
byte tone0,
tempo;
for (i = 0; i < 80; i++)
{
tone0 = musicData[i * 2];
tempo = musicData[i * 2 + 1];
playTone(tone0, tempo);
}
}
以上。