Vous n'êtes pas seuls dans l'Univers !
/
Exemples de programmes avec la carte « STM32VLDISCOVERY ».
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)
{
}
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)
{
}
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)
{
}
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