Red de conocimiento informático - Problemas con los teléfonos móviles - Código fuente del zumbador de control pwm

Código fuente del zumbador de control pwm

¿Está utilizando la placa de desarrollo STM8S en el "Kit de experiencia tres en uno del microcontrolador ST"?

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

/***************************************** ** ********************************/

/*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,

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_

};

/*************************************** ** *******************************************/

/*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

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++;

}

}

/* - */

/*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

{

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*/

/* 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- */