Affichage_Atrylec_com

Vous n'êtes pas seuls dans l'Univers !

Transistor_100

STM32VLDISCOVERY - Exemples de programmes

Exemples de programmes avec la carte « STM32VLDISCOVERY ».

Je veux remonter ! | Liste

1) Allumer une LED

Code source : Exemple - Allumage de la LED verte de la carte « STM32VLDISCOVERY »



#include <stm32f10x_lib.h>

void ConfigPortC()
{
	RCC->APB2ENR |= (1 << 4);

	GPIOC->CRH = ((GPIOC->CRH & 0x00000000) | (0x00000033));
}

int main(void)
{
	ConfigPortC();

	GPIOC->ODR |= (1 << 9); /* Allumage de la LED verte, située sur la broche PC9 */

	while(1)
	{

	}
}

void SystemInit (void)
{ 

}


Je veux remonter ! | Liste

2) Faire clignoter une LED avec une attente active

Code source : Exemple - Faire clignoter une LED avec une attente active



#include <stm32f10x_lib.h>

void Delai(int t)
{
	int i;

	for(i = 0; i < (100 * t); i++);
}

void ConfigPortC()
{
	RCC->APB2ENR |= (1 << 4);
	GPIOC->CRH = ((GPIOC->CRH & 0x00000000) | (0x00000033));
}

int main(void)
{
	ConfigPortC();

	while(1)
	{
		GPIOC->ODR |= (1 << 9); /* Allumage de la LED verte, située sur la broche PC9 */

		Delai(1000);
		GPIOC->ODR &= ~(1 << 9); /* Extinction de la LED verte, située sur la broche PC9 */
		Delai(1000);
	}
}

void SystemInit (void)
{ 

}


Je veux remonter ! | Liste

3) Faire clignoter une LED avec une interruption

Code source : Exemple - Faire clignoter une LED avec une interruption



#include <stm32f10x_lib.h>

#define DELAIS 1000

/* Variables   globales */

int g_Compteur = 0;

void ConfigPortC()
{
	RCC->APB2ENR |= (1 << 4);

	GPIOC->CRH = ((GPIOC->CRH & 0x00000000) | (0x00000033));
}


void InitTimer2()
{            
	RCC->APB1ENR |= 0x1; /* Activation du timer 2 */

	TIM2->CR1 = 0x00000095;   /* Le timer 2 utilise l'horloge interne, sans division.
Il recharge automatiquement la valeur contenue dans le registre « TIM2->ARR »,
lorsque le comptage est arrivé à son terme.
Le timer 2 va fonctionner en mode "Edge-aligned".
Le timer 2 fonctionnera en mode de décomptage.
Cela signifie donc qu'à chaque fois que le timer 2 arrivera en fin de cycle,
une interruption sera générée.
Le timer 2 fonctionnera de manière cyclique, et non pas une seule fois. */

TIM2->ARR = 0x00000FA0;

TIM2->DIER = TIM2->DIER | (1 << 0);   /* Permettre la mise à jour sur une interruption */

}

void TIM2_IRQHandler(void) __irq 
{
	g_Compteur++;

	if(g_Compteur == (DELAIS / 2))
	{
		GPIOC->ODR |= (1 << 9); /* Allumage de la LED verte, située sur la broche PC9 */

	}
	if(g_Compteur > DELAIS)
	{
		GPIOC->ODR &= ~(1 << 9); /* Extinction de la LED verte, située sur la broche PC9 */

		g_Compteur = 0;
	}

	TIM2->SR &= (~1); /* Ceci doit toujours être la dernière ligne de l'interruption.
On réarme l'interruption du timer 2 */
} void InitITTimer2() { /* Activation de l'interruption */ NVIC->ISER[0] |= (1 << 28); /* L'interruption qui correspond au timer 2 est située en position 28,
dans la table des vecteurs */
} int main(void) { ConfigPortC(); InitTimer2(); InitITTimer2(); while(1) { } } void SystemInit (void) { }
Je veux remonter ! | Liste

4) Faire clignoter une LED avec une interruption,
avec relocalisation de la table des vecteurs d'interruptions

Code source : Exemple - Faire clignoter une LED avec une interruption, avec relocalisation de la table des vecteurs d'interruptions



#include <stm32f10x_lib.h>

#define DELAIS 1000

/* Variables globales */
int g_Compteur = 0;

void ConfigPortC()
{
RCC->APB2ENR |= (1 << 4);

GPIOC->CRH = ((GPIOC->CRH & 0x00000000) | (0x00000033));
}

void InitTimer2()
{            
	RCC->APB1ENR |= 0x1; /* Activation du timer 2 */

	TIM2->CR1 = 0x00000095;   /* Le timer 2 utilise l'horloge interne, sans division.
Il recharge automatiquement la valeur contenue dans le registre « TIM2->ARR »,
lorsque le comptage est arrivé à son terme.
Le timer 2 va fonctionner en mode "Edge-aligned".
Le timer 2 fonctionnera en mode de décomptage.
Cela signifie donc qu'à chaque fois que le timer 2 arrivera en fin de cycle,
une interruption sera générée.
Le timer 2 fonctionnera de manière cyclique, et non pas une seule fois. */

TIM2->ARR = 0x00000FA0;

TIM2->DIER = TIM2->DIER | (1 << 0);   /* Permettre la mise à jour sur une interruption */

}

void it_timer2(void) __irq 
{
	g_Compteur++;

	if(g_Compteur == (DELAIS / 2))
	{
		GPIOC->ODR |= (1 << 9); /* Allumage de la LED verte, située sur la broche PC9 */

	}
	if(g_Compteur > DELAIS)
	{
		GPIOC->ODR &= ~(1 << 9); /* Extinction de la LED verte, située sur la broche PC9 */
		g_Compteur = 0;
	}

	TIM2->SR &= (~1); /* Ceci doit toujours être la dernière ligne de l'interruption.
On réarme l'interruption du compteur 2 */
} void InitITTimer2() { int adrExcept; int * pt; /* Déclaration d'un pointeur sur un nombre entier */ pt = (int*)0x200001B0; /* On veut que la nouvelle adresse
du début de la table des vecteurs soit de 0x20000100, et le déplacement du vecteur de l'interruption du Timer 2
par rapport au début de cette table est de 0x000000B0, donc 0x20000100 + 0x000000B0 = 0x200001B0 */
/* 1) Nouvelle adresse du début de la table des vecteurs */ SCB->VTOR = 0x20000100; /* 2) Ecriture du vecteur correspondant au Timer 2, dans la table des vecteurs */ adrExcept = (int)it_timer2; /* Récupération de l'adresse qui correspond au début
de la fonction « it_timer2 » */
*pt = adrExcept; /* Ecriture de cette adresse à l'endroit que pointe adrExecpt, c'est-à-dire écriture de la valeur de l'adresse qui correspond
au début de la fonction « it_timer2 », dans la case mémoire numéro 0x200001B0 */
/* 3) Activation de l'interruption */ NVIC->ISER[0] |= (1 << 28); /* L'interruption qui correspond au Timer 2 est située en position 28,
dans la table des vecteurs */
} int main(void) { ConfigPortC(); initTimer2(); initITTimer2(); while(1) { } } void SystemInit (void) { }

Commentaires (0)

Ajouter un commentaire

Votre pseudo :

Votre commentaire :

Je veux remonter !