forked from trocache/RefKEIL
Changes on MyGPIO_Init function
This commit is contained in:
parent
de0c34c2ec
commit
9ed6e01eeb
4 changed files with 113 additions and 47 deletions
|
|
@ -1,29 +1,41 @@
|
||||||
#include "Driver_GPIO.h"
|
#include "Driver_GPIO.h"
|
||||||
#include "stm32f10x.h"
|
#include "stm32f10x.h"
|
||||||
|
|
||||||
|
void test() {
|
||||||
|
int a = 20;
|
||||||
|
}
|
||||||
|
|
||||||
void MyGPIO_Init(MyGPIO_Struct_TypeDef * GPIOStructPtr) {
|
void MyGPIO_Init(MyGPIO_Struct_TypeDef * GPIOStructPtr) {
|
||||||
// variable pour stocker la configuration du GPIO
|
// Activation des horloges des ports A et C
|
||||||
uint32_t tmpreg = 0;
|
RCC->APB2ENR |= (RCC_APB2ENR_IOPCEN);
|
||||||
|
RCC->APB2ENR |= (RCC_APB2ENR_IOPAEN);
|
||||||
// configurer le mode de la broche GPIO
|
|
||||||
if ((GPIOStructPtr->GPIO_Pin & 0x8) != 0) { // si la broche a une résistance de pull-up ou pull-down activée
|
// On calcule la position de la broche à configurer en utilisant le numéro de broche contenu dans la structure GPIOStructPtr
|
||||||
tmpreg |= ((uint32_t)GPIOStructPtr->GPIO_Conf & (uint32_t)0x0F) << ((uint32_t)(((uint32_t)GPIOStructPtr->GPIO_Pin & (uint32_t)0x07) * 4));
|
uint32_t GPIO_Pin = 1 << GPIOStructPtr->GPIO_Pin;
|
||||||
} else { // sinon
|
|
||||||
tmpreg |= ((uint32_t)GPIOStructPtr->GPIO_Conf & (uint32_t)0x0F) << ((uint32_t)(((uint32_t)GPIOStructPtr->GPIO_Pin & (uint32_t)0x07) * 4) + 2);
|
// On vérifie si la broche à configurer se trouve dans les 8 premières broches (CRL) ou les 8 dernières broches (CRH)
|
||||||
|
if (GPIOStructPtr->GPIO_Pin <= 7) { // Si la broche est dans les 8 premières broches (CRL)
|
||||||
|
// On réinitialise les 4 bits de configuration de la broche en utilisant un masque qui est décalé vers la gauche de (GPIOStructPtr->GPIO_Pin * 4) bits pour cibler la broche à configurer
|
||||||
|
GPIOStructPtr->GPIO->CRL &= ~(0xF << (GPIOStructPtr->GPIO_Pin * 4));
|
||||||
|
// On configure la broche selon la configuration souhaitée en utilisant un masque qui est décalé vers la gauche de (GPIOStructPtr->GPIO_Pin * 4) bits pour cibler la broche à configurer
|
||||||
|
GPIOStructPtr->GPIO->CRL |= (GPIOStructPtr->GPIO_Conf << (GPIOStructPtr->GPIO_Pin * 4));
|
||||||
|
}
|
||||||
|
else { // Si la broche est dans les 8 dernières broches (CRH)
|
||||||
|
// On réinitialise les 4 bits de configuration de la broche en utilisant un masque qui est décalé vers la gauche de ((GPIOStructPtr->GPIO_Pin - 8) * 4) bits pour cibler la broche à configurer
|
||||||
|
GPIOStructPtr->GPIO->CRH &= ~(0xF << ((GPIOStructPtr->GPIO_Pin - 8) * 4));
|
||||||
|
// On configure la broche selon la configuration souhaitée en utilisant un masque qui est décalé vers la gauche de ((GPIOStructPtr->GPIO_Pin - 8) * 4) bits pour cibler la broche à configurer
|
||||||
|
GPIOStructPtr->GPIO->CRH |= (GPIOStructPtr->GPIO_Conf << ((GPIOStructPtr->GPIO_Pin - 8) * 4));
|
||||||
}
|
}
|
||||||
|
|
||||||
// configurer la vitesse de la broche GPIO
|
// Si la broche est en entrée, on la configure en input mode avec pull-up/pull-down désactivé
|
||||||
tmpreg |= (uint32_t)0x2 << ((uint32_t)(((uint32_t)GPIOStructPtr->GPIO_Pin & (uint32_t)0x07) * 4) + 2);
|
if (GPIOStructPtr->GPIO_Conf == In_Floating || GPIOStructPtr->GPIO_Conf == In_PullDown || GPIOStructPtr->GPIO_Conf == In_PullUp) {
|
||||||
|
// On met la broche en input mode en utilisant le registre BSRR de la GPIO
|
||||||
// configurer le GPIO mode alternate function (AF)
|
GPIOStructPtr->GPIO->BSRR = GPIO_Pin << 16;
|
||||||
if ((GPIOStructPtr->GPIO_Conf & 0x8) != 0) { // si la broche est configurée en alternate function
|
}
|
||||||
tmpreg &= ~(((uint32_t)0x0F) << ((uint32_t)(((uint32_t)GPIOStructPtr->GPIO_Pin & (uint32_t)0x07) * 4)));
|
else { // Si la broche est en sortie, on la configure en output mode et on met la broche à 0 (niveau bas)
|
||||||
tmpreg |= ((uint32_t)GPIOStructPtr->GPIO_Conf & (uint32_t)0x0F) << ((uint32_t)(((uint32_t)GPIOStructPtr->GPIO_Pin & (uint32_t)0x07) * 4));
|
// On met la broche en output mode en utilisant le registre BSRR de la GPIO
|
||||||
|
GPIOStructPtr->GPIO->BSRR = GPIO_Pin;
|
||||||
}
|
}
|
||||||
|
|
||||||
// configurer la broche GPIO
|
|
||||||
GPIOStructPtr->GPIO->CRL &= ~(0xF << ((GPIOStructPtr->GPIO_Pin & 0x7) * 4)); // effacer les bits de configuration actuels
|
|
||||||
GPIOStructPtr->GPIO->CRL |= tmpreg; // écrire la nouvelle configuration
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -46,6 +58,16 @@ void MyGPIO_Set(GPIO_TypeDef * GPIO, char GPIO_Pin) {
|
||||||
GPIO->BSRR |= (uint32_t)(1 << GPIO_Pin); // Set la pin correspondante en écrivant un 1 dans le bit correspondant de BSRR
|
GPIO->BSRR |= (uint32_t)(1 << GPIO_Pin); // Set la pin correspondante en écrivant un 1 dans le bit correspondant de BSRR
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MyGPIO_Reset(GPIO_TypeDef * GPIO, char GPIO_Pin)
|
||||||
|
{
|
||||||
|
// Calcul de la valeur du masque à appliquer pour réinitialiser la broche
|
||||||
|
uint32_t mask = 1 << GPIO_Pin; // on décale le bit 1 de GPIO_Pin positions vers la gauche
|
||||||
|
|
||||||
|
// Réinitialisation de la broche GPIO en niveau bas
|
||||||
|
GPIO->BRR = mask; // on met à 1 tous les bits correspondant aux broches à réinitialiser, ce qui les mettra à 0 (niveau bas)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void MyGPIO_Toggle(GPIO_TypeDef * GPIO, char GPIO_Pin) {
|
void MyGPIO_Toggle(GPIO_TypeDef * GPIO, char GPIO_Pin) {
|
||||||
GPIO->ODR ^= (1 << GPIO_Pin); // On fait un XOR pour toggle la pin correspondante
|
GPIO->ODR ^= (1 << GPIO_Pin); // On fait un XOR pour toggle la pin correspondante
|
||||||
}
|
}
|
||||||
|
|
@ -1,33 +1,29 @@
|
||||||
#include "stm32f10x.h"
|
#include "stm32f10x.h"
|
||||||
|
#include "Driver_GPIO.h"
|
||||||
|
|
||||||
int main(void)
|
int main(void) {
|
||||||
{
|
|
||||||
// Voir ~p113 et ~p170 du manual
|
|
||||||
|
|
||||||
// Activation des horloges des ports A et C
|
// Configure la broche PA5 en sortie
|
||||||
RCC->APB2ENR |= (RCC_APB2ENR_IOPCEN);
|
MyGPIO_Struct_TypeDef GPIO_InitStructure;
|
||||||
RCC->APB2ENR |= (RCC_APB2ENR_IOPAEN);
|
GPIO_InitStructure.GPIO_Pin = 5;
|
||||||
|
GPIO_InitStructure.GPIO_Conf = Out_Ppull;
|
||||||
|
GPIO_InitStructure.GPIO = GPIOA;
|
||||||
|
MyGPIO_Init(&GPIO_InitStructure);
|
||||||
|
|
||||||
// Configuration de PC13 en input pull-up
|
// Configure la broche PC13 en entrée avec une résistance de pull-up
|
||||||
GPIOC->CRH &= ~(GPIO_CRH_CNF13) | (GPIO_CRH_MODE13); // Mise à 0 de CNF13 et MODE13 pour fonctionnement en Input pull-down voir p160
|
GPIO_InitStructure.GPIO_Pin = 13;
|
||||||
GPIOC->CRH |= GPIO_CRH_CNF13_0; // Mise à 1 de CNF1 pour fonctionnement input pull up/down
|
GPIO_InitStructure.GPIO_Conf = In_PullUp;
|
||||||
GPIOC->ODR |= GPIO_ODR_ODR13; //Pull up -> ODR13 à 0
|
GPIO_InitStructure.GPIO = GPIOC;
|
||||||
|
MyGPIO_Init(&GPIO_InitStructure);
|
||||||
|
|
||||||
// Configuration de PA5 en sortie push-pull
|
while(1) {
|
||||||
GPIOA->CRL &= ~(GPIO_CRL_MODE5);
|
// Vérifie si le bouton est pressé
|
||||||
GPIOA->CRL &= ~(GPIO_CRL_CNF5);
|
if(MyGPIO_Read(GPIOC, 13) == 0) {
|
||||||
GPIOA->CRL |= GPIO_CRL_MODE5_0;
|
// Toggle la LED
|
||||||
|
MyGPIO_Toggle(GPIOA, 5);
|
||||||
while (1)
|
|
||||||
{
|
// Delay pour éviter les rebonds du au ressort du bouton
|
||||||
// Vérification de l'état du bouton
|
for(int i = 0; i < 1000000; i++);
|
||||||
if ((GPIOC->IDR & GPIO_IDR_IDR13) == 0)
|
|
||||||
{
|
|
||||||
// Inversion de l'état de la broche PA5
|
|
||||||
GPIOA->ODR ^= GPIO_ODR_ODR5;
|
|
||||||
|
|
||||||
// Attente pour éviter les rebonds du bouton
|
|
||||||
for (int i = 0; i < 1000000; i++);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -384,10 +384,34 @@
|
||||||
|
|
||||||
<Group>
|
<Group>
|
||||||
<GroupName>drivers</GroupName>
|
<GroupName>drivers</GroupName>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>1</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
<cbSel>0</cbSel>
|
<cbSel>0</cbSel>
|
||||||
<RteFlg>0</RteFlg>
|
<RteFlg>0</RteFlg>
|
||||||
|
<File>
|
||||||
|
<GroupNumber>2</GroupNumber>
|
||||||
|
<FileNumber>2</FileNumber>
|
||||||
|
<FileType>1</FileType>
|
||||||
|
<tvExp>0</tvExp>
|
||||||
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
|
<bDave2>0</bDave2>
|
||||||
|
<PathWithFileName>..\drivers\Driver_GPIO.c</PathWithFileName>
|
||||||
|
<FilenameWithoutPath>Driver_GPIO.c</FilenameWithoutPath>
|
||||||
|
<RteFlg>0</RteFlg>
|
||||||
|
<bShared>0</bShared>
|
||||||
|
</File>
|
||||||
|
<File>
|
||||||
|
<GroupNumber>2</GroupNumber>
|
||||||
|
<FileNumber>3</FileNumber>
|
||||||
|
<FileType>5</FileType>
|
||||||
|
<tvExp>0</tvExp>
|
||||||
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
|
<bDave2>0</bDave2>
|
||||||
|
<PathWithFileName>..\drivers\Driver_GPIO.h</PathWithFileName>
|
||||||
|
<FilenameWithoutPath>Driver_GPIO.h</FilenameWithoutPath>
|
||||||
|
<RteFlg>0</RteFlg>
|
||||||
|
<bShared>0</bShared>
|
||||||
|
</File>
|
||||||
</Group>
|
</Group>
|
||||||
|
|
||||||
<Group>
|
<Group>
|
||||||
|
|
|
||||||
|
|
@ -393,6 +393,18 @@
|
||||||
</Group>
|
</Group>
|
||||||
<Group>
|
<Group>
|
||||||
<GroupName>drivers</GroupName>
|
<GroupName>drivers</GroupName>
|
||||||
|
<Files>
|
||||||
|
<File>
|
||||||
|
<FileName>Driver_GPIO.c</FileName>
|
||||||
|
<FileType>1</FileType>
|
||||||
|
<FilePath>..\drivers\Driver_GPIO.c</FilePath>
|
||||||
|
</File>
|
||||||
|
<File>
|
||||||
|
<FileName>Driver_GPIO.h</FileName>
|
||||||
|
<FileType>5</FileType>
|
||||||
|
<FilePath>..\drivers\Driver_GPIO.h</FilePath>
|
||||||
|
</File>
|
||||||
|
</Files>
|
||||||
</Group>
|
</Group>
|
||||||
<Group>
|
<Group>
|
||||||
<GroupName>::CMSIS</GroupName>
|
<GroupName>::CMSIS</GroupName>
|
||||||
|
|
@ -789,6 +801,18 @@
|
||||||
</Group>
|
</Group>
|
||||||
<Group>
|
<Group>
|
||||||
<GroupName>drivers</GroupName>
|
<GroupName>drivers</GroupName>
|
||||||
|
<Files>
|
||||||
|
<File>
|
||||||
|
<FileName>Driver_GPIO.c</FileName>
|
||||||
|
<FileType>1</FileType>
|
||||||
|
<FilePath>..\drivers\Driver_GPIO.c</FilePath>
|
||||||
|
</File>
|
||||||
|
<File>
|
||||||
|
<FileName>Driver_GPIO.h</FileName>
|
||||||
|
<FileType>5</FileType>
|
||||||
|
<FilePath>..\drivers\Driver_GPIO.h</FilePath>
|
||||||
|
</File>
|
||||||
|
</Files>
|
||||||
</Group>
|
</Group>
|
||||||
<Group>
|
<Group>
|
||||||
<GroupName>::CMSIS</GroupName>
|
<GroupName>::CMSIS</GroupName>
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue