Código fuente del zumbador de control pwm
Si es así, puede consultar la siguiente rutina: Es un programa de muestra en el CD oficial de la suite adquirido por Wei Xue Electronics. ¡No sé si puedo ayudarte! Si tienes puntos, úsalos, ¡jeje!
/*========================================== === ===================================*/
/*Proyecto : a través del zumbador del controlador del sistema de demostración STM8 Timer 2 PWM*/
/*Módulo: main.c */
/*Compilador: compilador STM8 Universe C*/
/*Fecha: Febrero de 2009*/
/* - */
/*Descripción: Demostración de firmware para STM8 Mini Kit*/
/* Reproduce una canción a través del timbre. */
/*======================================== === ======================================*/
/ *** ************************************************* **** *************************
*
*Este firmware es para referencia únicamente y está destinado a que los Clientes proporcionen
*información codificada sobre sus productos para que puedan ahorrar
* tiempo. En consecuencia, STMicroelectronics no será responsable de ningún
* daño directo, indirecto o consecuente en relación con cualquier reclamo
* el contenido de dicho firmware y/o la responsabilidad del Cliente ante
*Aquí se encuentra la información de codificación relacionada con sus productos.
*
*Copyright 2008 STMicroelectronics
************************ ************************************************** * *******
*/
/*Incluye - */
#Incluye "STM8S105C_S.h" /*Registro y mapa de memoria archivos. */
/****************************************** ************************************/
/*Definición de macro p>
/***************************************** ** ********************************/
/*Descripción musical y codificación de notas. */
#define _END_ 0xFF /*La música termina. */
#define _PAUSE_ 0xFE /*Pausa entre diferentes melodías.
*/
/*Definición de tono de nota...*/
#define _FA0 0x00 /* FA- */
#define _SOL0 0x01 /* SOL - */
#define _LA0 0x02 /* LA- */
#define _SI0 0x03 /* SI- */
#define _DO 0x04 /* DO */
#define _RE 0x05 /* RE */
#define _MI 0x06 /* MI */
#define _FA 0x07 / *FA* /
#define _SOL 0x08 /* SOL */
#define _LA 0x09 /* LA */
#define _SI 0x0A /*SI */
#define _DO2 0x0B /* DO+ */
#define _M 0x0C /*Mute*/
#define _RE2 0x0D /* RE+ */
#define _SOL2 0x0E /* SOL+ */
#define _FAd 0x0F /* FA# */
/*Definición de longitud de nota.... .*/
#Definición sq 0x10 /*Media corchea. */
#Definición q 0x20 /*Corchea nota. */
#Definición qp 0x30 /* 1,5 corchea. */
#Definición c 0x40 /* Nota extraña. */
#Definición cn 0x60 /* 1.5 nota. */
#Definición m 0x80 /*Nota mínima. */
/*Aquí una nota se define por la combinación de dos partes, tono y duración.
Fácil de recuperar usando el operador binario AND: nota = tono + duración, p>
suma de tono y duración del amplificador=0*/
/****************************** ** ************************************************* /
/* Variables del segmento RAM*/
/*************************** ********* ******************************************* ********/
/*Variable global utilizada para almacenar resultados de ADC. */
Entero sin signo AD _ Valor
/*Variable global utilizada para almacenar la tecla presionada al cambiar de octava. */
Carácter sin signo Flag _ Octave _ Chg
/* Variable global utilizada como índice en la matriz de notas: posición en la melodía. */
unsigned int current _ note = 0;
/*Variable global utilizada como índice en la matriz de notas.
*/
Carácter sin firmar c1, c 1_buf;
/*Codificación de notas musicales~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ */
/* FA0 SOL0 LA0 SI0 DO RE MI FA SOLLAS DO2 MUTE RE2 SOL2 FA# */
/* TIM2 CCR1 byte alto. */
const unsigned char Low _ Note _ h[]/*low octave*/
={0x2C, 0x27, 0x23, 0x1F, 0x1D, 0x1A, 0x17, 0x16, 0x13, 0x11, 0x0F, 0x0E, 0x00, 0x0D, 0x09, 0x 15};
const unsigned char Hi_Note_h[] /*octava alta*/
={0x16, 0x13, 0x11, 0x0F, 0x0E, 0x0D, 0x0B, 0x0B, 0x09, 0x08, 0x07, 0x07, 0x00, 0x06, 0x04, 0x0A};
/* TIM2 CCR1 byte bajo. */
const unsigned char Low _ Note _ l[]/*low octave*/
={0xA4, 0xDC, 0x82, 0xA1, 0xEE, 0xA9, 0xAC, 0x62, 0xEE, 0xC1, 0xD0, 0xF0, 0x00, 0x4F, 0xF7, 0x2C};
const unsigned char Hi_Note_l[] /*octava alta*/
={0x52, 0xEE, 0xC1 , 0xD0, 0xF7, 0x54, 0xD6, 0x31, 0xF7, 0xE0, 0xE8, 0x78, 0x00, 0xA7, 0xFB, 0x96};
/* Secuencia de melodía real: un conjunto de notas. */
const unsigned char tune[] =
{
_M+sq, _M+sq, /*Se requieren dos "búferes" para una gestión fluida " Silenciar*/
/*Comentario actual/Comparación de inicialización del comentario actual. */
/* - DO2 SI LA SOL FA MI RE DO - */
/* - DO2 SI LA SOL FA MI RE DO - */
_DO+c, _RE+c, _MI+c, _FA+c, _SOL+c, _LA+c, _SI+c, _DO2+c, _M+m, _PAUSA_,
_DO2+c , _SI+c,_LA+c,_SOL+c,_FA+c,_MI+c,_RE+c,_DO+c,_M+m,_PAUSE_,
/* -Feliz año nuevo.
_DO+c, _DO+c, _DO+c, _M+sq, _DO+m, _SOLm, _MI+c, _M+sq, _MI+m, _DO+m, _DO+c ,
_MI+c, _M+sq, _SOL+m, _SOL+m, _FA+c, _MI+c, _M+sq, _RE+m, _M+sq, _RE+c, _MI+ c ,
_FA+m, _M+sq, _FA+m, _MI+c, _RE+c, _MI+m, _DO+m, _M+sq, _DO+c, _MI+c, _RE + m, _SOLm,
_SIc, _RE+c, _DO+m, _DO+m, _PAUSE_,
/* -Dos tigres.
_DO+c, _RE+c, _MI+c, _DO+c, _DO+c, _RE+c, _MI+c, _DO+c, _MI+c, _FA+c, _SOL+m ,_MI+c,
_FA+c,_SOL+m,_SOL+qp,_LA+sq,_SOL+qp,_FA+sq,_MI+c,_DO+c,_SOL+qp,_LA+ cuadrados ,
_SOL+qp, _FA+sq, _MI+c, _DO+c, _M+sq, _DO+c, _SOLc, _DO+m, _M+sq, _DO+c, _SOL0 + c,
_DO+m, _M+sq, _PAUSE_,
/* - Miel dulce.
_MI+m, _SOL+c, _LA+c, _MI+m, _MI+c, _DO+c, _RE+cn, _DO+q, _RE+c, _MI+q, _SOL+q , _MI+m,
_MI+m, _RE+c, _RE+c, _RE+c, _RE+q, _MI+q, _RE+q, _DO+cn, _LAq, _SOL cn , _DO+m,
_DO+c, _RE+c, _MI+cn, _RE+q, _MI+q, _RE+q, _SOL+q, _RE+m, _RE+m, _RE + m, _RE+m,
_MI+m, _SOL+c, _LA+c, _MI+m, _MI+c, _DO+c, _RE+cn, _DO+q, _RE+c, _MI +q, _SOL+q, _MI+m,
_MI+m, _RE+c, _RE+c, _RE+c, _RE+q, _MI+q, _RE+q, _DO+cn , _LAq,_SOLcn,_DO+m,
_DO+c,_MI+c,_RE+q,_DO+q,_DO+c,_LAq,_SOLcn,_DO+ m, _DO+m, _DO+m, _DO+m, _MI+m,
_MI+m, _SOLm, _LAq, _DO+q, _SOLq, _DO+m, _DO +m , _DO+m, _DO+m, _LAc,
_SIc, _LAc, _SIc, _LAc, _LAq, _DO+q, _SOLq, _SOL c, _MI+m, _MI+m,
_MI+m, _MI+m, _LAc, _SIc, _SIc, _LAc, _LAq, _DO+q, _LA0 +q, _SOLq,
_SOLc, _MI+m, _MI+m, _MI+m, _M+c, _SOL+q, _SOL+m, _M+c, _SOL+ q, _LA +q, _SOL+m,
_M+c, _SOL+q, _SOL+q, _SOL+c, _SOL+q, _SOL+c, _SOL+q, _LA+q, _SOL+m, _SOL+m,
_MI+m, _SOL+c, _LA+c, _MI+m, _MI+c, _DO+c, _RE+cn, _DO+q, _RE+c, _RE+q , _SOL+q, _MI+m,
_MI+m, _RE+c, _RE+c, _RE+c, _RE+q, _MI+q, _RE+q, _DO+ cn, _LAq ,
_SOLcn, _DO+m, _DO+c, _MI+c, _RE+q, _DO+q, _DO+c, _LAq, _SOLcn, _DO +m, _DO+ m,
_DO+m, _DO+m, _MI+m, _MI+m, _SOLm, _LAq, _SOLq, _LAq, _DO+m, _DO+m,
_DO+m, _DO+m, _PAUSE_,
/* - _END_ marca el final de la música - */
_END_ p>
};
/*************************************** ** *******************************************/
/*Definición de función*/
/********************************* ********* ******************************************* **/
/* - */
/*Nombre de la rutina: Buzz_Init */
/*Entrada/salida: Ninguna.
*/
/*Descripción: Inicializa TIM2 al modo PWM para control del zumbador. */
/* - */
void Buzz_Init (void)
{
PD_DDR = 0x 10;/ *Configurar PD4 como salida (para PWM). */
PD _ Cr 1 | = 0x 10; /* Salida PD4 push-pull. */
Tim 2 _ ccmr 1 | = 0x 70 /*Modo de salida PWM2. */
Tim 2 _ ccer 1 | = 0x 03; /* La polaridad CC es baja, habilita la salida PWM */
Tim 2 _ ARR = 0 /* Registro de control de frecuencia : ARR */
Tim 2 _ CCR 1 = 0; /*Registro de control del ciclo de trabajo: CCR */
Tim 2 _ PSCR = 0x 00; fCK_PSC. */
Tim 2 _ Cr 1 | = 0x 01 /* Habilitar TIM2. */
actual _ nota = 1;
}
/* - */
/*Nombre de la rutina: Buzz_Wait * /
/*Entrada/Salida: Duración de la nota (información MSB de 4 bits)/Ninguna. */
/*Descripción: 1) Pruebe el voltaje AIN y guárdelo en AD_Value. */
/* 2) Encuesta al camarero sobre la duración del ticket (basado en un retraso de 4 ms). */
/*Duración: Selección de corchea (2), negra (4) o blanca (8). */
/* - */
void Buzz_Wait(duración del carácter sin firmar)
{
int I = 0 ; p>
Carácter sin signo UC = 0;
Entero largo sin signo
/* Voltaje AIN muestreado en modo único ADC. */
ADC _ Cr 1 | = 0x 01; /* Primero configure ADON para encender el módulo ADC. */
I = 6; /*Espere & gt7us para asegurarse de que se complete el encendido del ADC. */
while(I-);
ADC _ Cr 1 | = 0x 01; /* Configure ADON nuevamente para iniciar la conversión de AD. */
Y (! (ADC _ CSR & amp0x 80)); /* Espere a que se complete la conversión de AD (EOP=1).
*/
/*Almacenar el valor de ADC en AD_Value */
AD _ Value =((((unsigned int)ADC _ DRH)<<2)+ADC_ DRL)> >2;
if(AD_Value <0x01)
{ AD_Value = 0x 01;}
if( AD_Value >0xC0)
{ AD_Value = 0xC0}
if (Flag_Octave_Chg==1)
{
temp =((((unsigned int)Bajo _ Nota _ h[ c 1 _ buf])& lt;& lt8)+Bajo _ Nota _ l[c 1 _ buf]);
}
Otro
{
temp =((((unsigned int)Hola _ Nota _ h[c 1 _ buf])& lt;& lt8) +Hola _ Nota _ l[c 1 _ buf]); p>
}
Temp =(Temp * AD _ Value)>& gt9;
/*Escribe el nuevo valor del ciclo de trabajo en CCR */
TIM2_CCR1H=(carácter sin signo)(((entero sin signo)Temp & amp0xff00)>& gt8);
Tim 2 _ CCR 1L =(carácter sin signo)((int sin signo)Temp & 0x 00 y siguientes);
/*Tiempo de retraso = Duración* Y */
while (UC <duración)/*El siguiente bucle se ejecuta durante tiempos de "duración". */
{
while(i<1200) /*Este bucle "Y" espera unos 4,3 milisegundos, */
{
i++;
}
I = 0;
uc++;
}
} p>
/* - */
/*Nombre de la rutina: Buzz_PlayTune */
/*Entrada/salida: Ninguna. */
/*Descripción: Reproducir partitura musical (una canción a la vez). */
/* - */
void Buzz_PlayTune (void)
{
UI sin firmar;
Temp_DCR largo sin firmar;
Temperatura de carácter sin firmar;
while(1)
{
if(tune[current_note] == _END_)
{
/*La música termina y vuelve al principio. 1 no dice nada en */
/* el comienzo de la matriz de notas; */
nota_actual = 1;
Pausa;
}
else if(melodía[nota_actual]= = _ PAUSA _)
{
/*La canción termina, guarda la posición en la canción y deja de reproducir. */
actual _ note++;
Pausa;
}
Otro
{
c 1 = tune[current_notes];
/*Carga las notas (o silencio) en el registro correspondiente*/
/*La información de la nota solo se compone de 4 acarreo de bits más bajo.
*/
c 1 _ buf = c 1 & 0x0f
if (Flag_Octave_Chg==1)
{
temp_DCR =((((unsigned int)Bajo _ Nota _ h[c 1 _ buf])& lt; & lt8)+Bajo _ Nota _ l[c 1 _ buf]);
Tim 2_ARRH = Low_Note_h[c 1_buf];
Tim 2_ARRL = Low_Note_l[c 1_buf];
}
p>Otro
{ p>
temp _ DCR =((((unsigned int)Hola _ Nota _ h[c 1 _ buf])<<8) +Hola _ Nota _ l[c 1 _ buf]);
Tim 2 _ ARRH = Hola _ Nota _ h[c 1 _ buf];
Tim 2 _ ARRL = Hola _ Nota _ l[c 1 _ buf];
}
DCR temporal = (DCR temporal * valor publicitario)>& gt9;
/* El nuevo valor del ciclo de trabajo se escribe en DCR0. */
temp=((entero sin signo)temp _ DCR & 0xff00)>& gt8;
TIM2_CCR1H=(carácter sin signo)temp
temp=( (entero sin signo)temp _ DCR & 0x 00 ff);
TIM2_CCR1L=(carácter sin signo)temp
/*La duración de espera de la nota. */
/*La información de duración la transportan los 4 bits más altos. */
wait (c 1 & 0xf 0);
/* Avanzar por la matriz de notas: tune. */
actual _ nota++;
}
}
}
/* - */
/*Nombre de la rutina: GPIO_Init */
/*Entrada/salida: Ninguna. */
/*Descripción: Inicializa el GPIO del LED TLI. */
/* - */
void GPIO_Init(void)
{
/* Configuración LED IO*/ p>
/* LD3: PD3 */
/* LD2: PD1 */
/* LD1: PD0 */
PD _ DDR | = 0x0D/*salida. */
PD _ Cr 1 | = 0x0D; /*Empujar y tirar. */
PD_CR2 = 0x00/*Velocidad de salida hasta 2MHz. */
/* Interrupción externa PD7 */
EXTI _ Cr 1 = 0x 00 /*Sensibilidad de interrupción externa (TLI). */
EXTI_CR2=0x00
PD_DDR&=~0x80/*PD7: Entrada*/
PD_CR2=0x80/ * Habilitar interrupciones TLI. */
}
/* - */
/*Nombre de la rutina: CLK_Initialization*/
/*Entrada/salida: ninguno.
*/
/*Descripción: Fuente del reloj de inicialización*/
/* - */
void CLK_Init(void)
{
/*Configurar preescalador HSI*/
CLK_CKDIVR &= ~ 0x 10;/* 01: fHSI= salida fHSI RC/2. */
/*Configurar el preescalador del reloj de la CPU*/
CLK _ CKDIVR = 0x 01;* 001: fCPU=fMASTER/2. */
}
/* - */
/*Nombre de rutina: ADC_Init */
/*Entrada/salida: ninguno. */
/*Descripción: Inicializa el convertidor AD. */
/* - */
void ADC_Init(void)
{
ADC _ CR2 = 0x00
ADC_Cr 1 = 0x 00;
ADC_CSR = 0x03
ADC_TDRL = 0x 20
}
/* - */
/*Nombre de rutina: TIM_Init */
/*Entrada/salida: Ninguna. */
/*Descripción: Inicializa TIM4 como base de tiempo del LED. */
/* - */
tiempo de anulación _ Init(void)
{
/* Configuración del periférico TIM4* /
/*Configuración de la base de tiempos*/
Tim 4 _ PSCR = 0x 04 /*Configurar el preescalador de TIM4. */
TIM4 _ ARR = 0xFF/*Configurar ciclo TIM4. */
/*Contador TIM4 habilitado*/
Tim 4 _ Cr 1 | = 0x 01; */
Tim 4 _ IER | = 0x 01; /* Habilitar interrupción OVR de TIM4. */
}
/* - */
/*Rutina:principal */
/*Entrada principal*/
/* - */
Administrador no válido (no válido)
{
Unsigned int j;
_ASM ("sim");/*Deshabilitar interrupciones. */
flag _ Octave _ Chg = 0;
CLK _Initialization();
GPIO _ Init(); ();
ADC_Init();
_ASM("rim"); /* Habilitar interrupciones. */
Buzz_Init(). /*Inicializa el temporizador periférico. */
mientras ( 1)
{
/*Reproduce la partitura actual. */
buzz _ play tune();
buzz _ Wait(0x 80); /*Espera aproximadamente un segundo. */
}
}
/* -Fin del archivo- */