Téléverser les fichiers vers "/"
This commit is contained in:
parent
9495da0f39
commit
f55bd2b960
4 changed files with 341 additions and 0 deletions
54
MyGPIO.c
Normal file
54
MyGPIO.c
Normal file
|
|
@ -0,0 +1,54 @@
|
||||||
|
#include "stm32f10x.h"
|
||||||
|
|
||||||
|
|
||||||
|
void GPIO_configure(GPIO_TypeDef *GPIO ,int pin, char mode){
|
||||||
|
if (mode == 0){ // floating input (par défaut
|
||||||
|
}
|
||||||
|
if (mode == 1) { // output push pull 2MHZ
|
||||||
|
GPIO->CRL = (GPIO->CRL & ~(0xF<<pin*4)) | (0x2<<pin*4);
|
||||||
|
}
|
||||||
|
if (mode == 2) { // input pullup
|
||||||
|
GPIO->CRL = (GPIO->CRL & ~(0xF<<pin*4)) | (0x8<<pin*4);
|
||||||
|
GPIO->ODR |= (1<<pin);
|
||||||
|
}
|
||||||
|
if (mode == 3){ // out push pull 2MHz
|
||||||
|
if (pin < 8) {
|
||||||
|
GPIO->CRL = (GPIO->CRL & ~(0xF<<pin*4)) | (0xA<<pin*4);
|
||||||
|
GPIO->ODR |= (1<<pin);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
pin = pin-8;
|
||||||
|
GPIO->CRH = (GPIO->CRH & ~(0xF<<pin*4)) | (0xA<<pin*4);
|
||||||
|
GPIO->ODR |= (1<<pin);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void allume_led (GPIO_TypeDef *GPIO , char GPIO_Pin){
|
||||||
|
GPIO->ODR |= (1<<GPIO_Pin);
|
||||||
|
};
|
||||||
|
|
||||||
|
void eteindre_led (GPIO_TypeDef *GPIO , char GPIO_Pin){
|
||||||
|
GPIO->ODR &= ~(1<<GPIO_Pin);
|
||||||
|
};
|
||||||
|
|
||||||
|
void toggle_pin (GPIO_TypeDef *GPIO , char GPIO_Pin){
|
||||||
|
if ((GPIO->ODR & (1<<GPIO_Pin)) == 0)
|
||||||
|
GPIO->ODR |= (1<<GPIO_Pin);
|
||||||
|
else
|
||||||
|
GPIO->ODR &= ~(1<<GPIO_Pin);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
int GPIO_bouton_read (GPIO_TypeDef *GPIO , char GPIO_Pin ){
|
||||||
|
if ((GPIO->IDR & (1<<GPIO_Pin)) == 0) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
};
|
||||||
156
MyPWM.c
Normal file
156
MyPWM.c
Normal file
|
|
@ -0,0 +1,156 @@
|
||||||
|
#include "stm32f10x.h"
|
||||||
|
#include "MyTimer.h"
|
||||||
|
#include "MyGPIO.h"
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
void My_PWM_Channel_Config(TIM_TypeDef* Timer , char channel){
|
||||||
|
switch (channel) {
|
||||||
|
case 1:
|
||||||
|
// Configuration de CC1
|
||||||
|
Timer->CCMR1 &= ~TIM_CCMR1_CC1S; // Output
|
||||||
|
Timer->CCMR1 |= TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1; // Mode PWM 1 (0b110)
|
||||||
|
Timer->CCMR1 |= TIM_CCMR1_OC1PE; // Preload Enable
|
||||||
|
Timer->CCR1 = 0;
|
||||||
|
Timer->CCER |= TIM_CCER_CC1E; // Output Enable
|
||||||
|
break; // <<-- AJOUTER LE BREAK
|
||||||
|
|
||||||
|
case 2:
|
||||||
|
// Configuration de CC2 (vos registres dans le code initial étaient incohérents)
|
||||||
|
Timer->CCMR1 &= ~TIM_CCMR1_CC2S; // Output
|
||||||
|
Timer->CCMR1 |= TIM_CCMR1_OC2M_2 | TIM_CCMR1_OC2M_1; // Mode PWM 1 (0b110)
|
||||||
|
Timer->CCMR1 |= TIM_CCMR1_OC2PE; // Preload Enable
|
||||||
|
Timer->CCR2 = 0;
|
||||||
|
Timer->CCER |= TIM_CCER_CC2E; // Output Enable
|
||||||
|
break;}
|
||||||
|
|
||||||
|
|
||||||
|
Timer->CR1 |= TIM_CR1_ARPE; // Auto-Reload Preload
|
||||||
|
Timer->BDTR |= TIM_BDTR_MOE; // Main Output Enable (pour les timers avancés TIM1/8)
|
||||||
|
Timer->EGR |= TIM_EGR_UG;
|
||||||
|
Timer->CR1 |= TIM_CR1_CEN;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void MyTimer_PWM(TIM_TypeDef * Timer , int Channel){
|
||||||
|
int pwrmd;
|
||||||
|
#if POWERMODE //Powermode 1
|
||||||
|
pwrmd = 0b110;
|
||||||
|
#else
|
||||||
|
pwrmd = 0b111; //Powermode 2
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (Channel == 1){
|
||||||
|
Timer->CCMR1 &= ~(0b111<<4); //On clear les trois bits qui sont de pwm
|
||||||
|
Timer->CCMR1 |= (pwrmd<<4); //On affecte le powermode au bits de lecture pour le µ-controlleur
|
||||||
|
Timer->CCMR1 |= TIM_CCMR1_OC1PE; //Update preload, il n'affecte pas le valeur avant que la prochaine cycle
|
||||||
|
Timer->CCER = TIM_CCER_CC1E; //Enable le pin voulu basculer
|
||||||
|
}
|
||||||
|
else if (Channel == 2){
|
||||||
|
Timer->CCMR1 &= ~(0b111<<12); //Le TIMx_CCMR1 configure deux channels, de bit [6:4] CH1, [14:12] CH2 (OC2M = Output Channel 2 )
|
||||||
|
Timer->CCMR1 |= (pwrmd<<12);
|
||||||
|
Timer->CCMR1 |= TIM_CCMR1_OC2PE;
|
||||||
|
Timer->CCER |= TIM_CCER_CC2E;
|
||||||
|
}
|
||||||
|
else if (Channel == 3){
|
||||||
|
Timer->CCMR1 &= ~(0b111<<4);
|
||||||
|
Timer->CCMR2 |= (pwrmd<<4);
|
||||||
|
Timer->CCMR2 |= TIM_CCMR2_OC3PE;
|
||||||
|
Timer->CCER |= TIM_CCER_CC3E;
|
||||||
|
}
|
||||||
|
else if (Channel == 4){
|
||||||
|
Timer->CCMR1 &= ~(0b111<<12);
|
||||||
|
Timer->CCMR2 |= (pwrmd<<12);
|
||||||
|
Timer->CCMR2 |= TIM_CCMR2_OC4PE;
|
||||||
|
Timer->CCER |= TIM_CCER_CC4E;
|
||||||
|
}
|
||||||
|
|
||||||
|
//En dessous d'ici, on a l'aide du plus gentil chat que je connais
|
||||||
|
// Enable auto-reload preload -- //Ensures that your initial configuration — PWM mode, duty cycle, period — actually takes effect before the timer starts counting.
|
||||||
|
Timer->CR1 |= TIM_CR1_ARPE;
|
||||||
|
// Force update event to load ARR and CCR values immediately
|
||||||
|
Timer->EGR |= TIM_EGR_UG;
|
||||||
|
// Start the timer
|
||||||
|
Timer->CR1 |= TIM_CR1_CEN;
|
||||||
|
|
||||||
|
switch (Channel) {
|
||||||
|
case 1:
|
||||||
|
if (Timer == TIM1){GPIOA->CRH &= ~(0xF<<0*4); GPIOA->CRH |= (0xA<<0*4); TIM1->BDTR |= 1<<15; }
|
||||||
|
if (Timer == TIM2){GPIOA->CRL &= ~(0xF<<0*4); GPIOA->CRL |= (0xA<<0*4);}
|
||||||
|
if (Timer == TIM3){GPIOA->CRL &= ~(0xF<<6*4); GPIOA->CRL |= (0xA<<6*4);}
|
||||||
|
if (Timer == TIM4){GPIOB->CRL &= ~(0xF<<5*4); GPIOB->CRL |= (0xA<<5*4);}
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
if (Timer == TIM1){GPIOA->CRH &= ~(0xF<<1*4); GPIOA->CRL |= (0xA<<1*4); TIM1->BDTR |= 1<<15;}
|
||||||
|
if (Timer == TIM2){GPIOA->CRL &= ~(0xF<<1*4); GPIOA->CRL |= (0xA<<1*4);}
|
||||||
|
if (Timer == TIM3){GPIOA->CRL &= ~(0xF<<7*4); GPIOA->CRL |= (0xA<<7*4);}
|
||||||
|
if (Timer == TIM4){GPIOB->CRL &= ~(0xF<<7*4); GPIOB->CRL |= (0xA<<7*4);}
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
if (Timer == TIM1){GPIOA->CRH &= ~(0xF<<2*4); GPIOA->CRH |= (0xA<<2*4); TIM1->BDTR |= 1<<15;}
|
||||||
|
if (Timer == TIM2){GPIOA->CRL &= ~(0xF<<2*4); GPIOA->CRL |= (0xA<<2*4);}
|
||||||
|
if (Timer == TIM3){GPIOB->CRL &= ~(0xF<<0*4); GPIOB->CRL |= (0xA<<0*4);}
|
||||||
|
if (Timer == TIM4){GPIOB->CRH &= ~(0xF<<0*4); GPIOB->CRH |= (0xA<<0*4);}
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
if (Timer == TIM1){GPIOA->CRH &= ~(0xF<<3*4); GPIOA->CRH |= (0xA<<3*4); TIM1->BDTR |= 1<<15;}
|
||||||
|
if (Timer == TIM2){GPIOA->CRL &= ~(0xF<<3*4); GPIOA->CRL |= (0xA<<3*4);}
|
||||||
|
if (Timer == TIM3){GPIOB->CRL &= ~(0xF<<1*4); GPIOB->CRL |= (0xA<<1*4);}
|
||||||
|
if (Timer == TIM4){GPIOB->CRH &= ~(0xF<<1*4); GPIOB->CRH |= (0xA<<1*4);}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//Une fonction qui met le bon PWM volue
|
||||||
|
int Set_DutyCycle_PWM(TIM_TypeDef *Timer, int Channel, int DutyC){
|
||||||
|
int CCR_VAL = (Timer -> ARR + 1) * DutyC / 100;
|
||||||
|
switch (Channel){
|
||||||
|
case 1: Timer->CCR1 = CCR_VAL;
|
||||||
|
case 2: Timer->CCR2 = CCR_VAL;
|
||||||
|
case 3: Timer->CCR3 = CCR_VAL;
|
||||||
|
case 4: Timer->CCR4 = CCR_VAL;
|
||||||
|
default: break;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
Timer->EGR |= TIM_EGR_UG;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void initPlato(TIM_TypeDef * Timer, int Channel){ // Config du moteur servo
|
||||||
|
|
||||||
|
GPIO_configure(GPIOA, 2, 1); //config pin de direction 0 ou 1
|
||||||
|
if (Timer == TIM3) {
|
||||||
|
EnableTimer(TIM3);
|
||||||
|
MyTimer_Base_Init(TIM3, 159, 17); // Pour obtenir fréq de 20kHZ
|
||||||
|
if (Channel == 3){
|
||||||
|
GPIO_configure(GPIOB, 0, 1); // Outut push pull alternate, config pin de consigne entre -100 et 100
|
||||||
|
MyTimer_PWM(TIM3, 3); //TIM3 CH3
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
//printf("Ce pilote n'existe pas");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
//printf("Ce pilote n'existe pas");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Update_Motor_PWM(signed char Consigne, TIM_TypeDef * Timer, int Channel) {
|
||||||
|
int duty_cycle = abs(Consigne);
|
||||||
|
Set_DutyCycle_PWM(Timer, Channel, duty_cycle);
|
||||||
|
|
||||||
|
if (Consigne>0){
|
||||||
|
allume_led(GPIOA, 2);
|
||||||
|
};
|
||||||
|
if (Consigne<0){
|
||||||
|
eteindre_led(GPIOA,2 );
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
//Timer->EGR |= TIM_EGR_UG;
|
||||||
|
}
|
||||||
|
|
||||||
61
MyUart.c
Normal file
61
MyUart.c
Normal file
|
|
@ -0,0 +1,61 @@
|
||||||
|
#include "stm32f10x.h"
|
||||||
|
#include "MyGPIO.h"
|
||||||
|
#include "MyTimer.h"
|
||||||
|
|
||||||
|
void My_USART_Config(USART_TypeDef* USARTx, uint32_t baudrate) { //QUE POUR USART1
|
||||||
|
|
||||||
|
// Configuration PA9 (Tx) en Alternate Function Push-Pull
|
||||||
|
GPIO_configure(GPIOA, 9 , 3);
|
||||||
|
// Configuration PA10 (Rx) en Input Floating
|
||||||
|
GPIO_configure(GPIOA, 10 , 2);
|
||||||
|
NVIC_EnableIRQ(USART1_IRQn);
|
||||||
|
NVIC_SetPriority(USART1_IRQn, 3<<4);
|
||||||
|
|
||||||
|
|
||||||
|
RCC->APB2ENR |= RCC_APB2ENR_USART1EN;
|
||||||
|
// USARTx->CR2 |= USART_CR2_CLKEN;
|
||||||
|
USARTx->CR1 |= USART_CR1_UE;
|
||||||
|
USARTx->BRR = baudrate;
|
||||||
|
USARTx->CR1 |= USART_CR1_TE;
|
||||||
|
USARTx->CR1 |= USART_CR1_RE;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
void USART_Send_Char(USART_TypeDef* USARTx, char car) {
|
||||||
|
while ((USARTx->SR & USART_SR_TXE)==0){
|
||||||
|
}
|
||||||
|
|
||||||
|
USARTx->DR = car;
|
||||||
|
};
|
||||||
|
|
||||||
|
void USART_Send_String(USART_TypeDef *USARTx, char *pString)
|
||||||
|
{
|
||||||
|
while (*pString != '\0')
|
||||||
|
{
|
||||||
|
USART_Send_Char(USARTx, *pString);
|
||||||
|
pString++;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void (*pFnc_Receive) (char);
|
||||||
|
|
||||||
|
void USART_IT_Receive_Enable(USART_TypeDef* USARTx) {
|
||||||
|
USARTx->CR1 |= USART_CR1_RXNEIE;
|
||||||
|
};
|
||||||
|
|
||||||
|
void Init_IT_Receive(void (*Receive_IT_function) (char)){
|
||||||
|
pFnc_Receive = Receive_IT_function;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void USART1_IRQHandler(void){
|
||||||
|
signed char commande = USART1->DR;
|
||||||
|
if (pFnc_Receive != 0) {
|
||||||
|
pFnc_Receive(commande);
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
70
Mytimer.c
Normal file
70
Mytimer.c
Normal file
|
|
@ -0,0 +1,70 @@
|
||||||
|
#include "stm32f10x.h"
|
||||||
|
|
||||||
|
|
||||||
|
void EnableTimer(TIM_TypeDef *Timer){
|
||||||
|
if(Timer == TIM2){
|
||||||
|
RCC -> APB1ENR |= RCC_APB1ENR_TIM2EN;
|
||||||
|
}
|
||||||
|
else if(Timer == TIM3){
|
||||||
|
RCC -> APB1ENR |= RCC_APB1ENR_TIM3EN;
|
||||||
|
}
|
||||||
|
else if(Timer == TIM4){
|
||||||
|
RCC -> APB1ENR |= RCC_APB1ENR_TIM4EN;
|
||||||
|
}
|
||||||
|
else if(Timer == TIM1){
|
||||||
|
RCC->APB2ENR |= RCC_APB2ENR_TIM1EN;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void MyTimer_Base_Init(TIM_TypeDef *Timer, unsigned short Autoreload, unsigned short Prescaler){
|
||||||
|
if (Timer == TIM1) {
|
||||||
|
RCC->APB2ENR |= RCC_APB2ENR_TIM1EN; //L'horloge est enabléd
|
||||||
|
} else if (Timer == TIM2) {
|
||||||
|
TIM2->CR1 |= TIM_CR1_CEN; //On enable l'horloge interne
|
||||||
|
RCC->APB1ENR |= RCC_APB1ENR_TIM2EN;
|
||||||
|
} else if (Timer == TIM3) {
|
||||||
|
RCC->APB1ENR |= RCC_APB1ENR_TIM3EN;
|
||||||
|
} else if (Timer == TIM4) {
|
||||||
|
RCC->APB1ENR |= RCC_APB1ENR_TIM4EN;
|
||||||
|
}
|
||||||
|
Timer->ARR |= Autoreload;
|
||||||
|
Timer->PSC |= Prescaler;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void (*pFnc) (void);
|
||||||
|
|
||||||
|
void MyTimer_ActiveIT (TIM_TypeDef * Timer , char prio, void (*IT_function)(void)){
|
||||||
|
Timer->DIER |= TIM_DIER_UIE;
|
||||||
|
IRQn_Type IRQn;
|
||||||
|
if (Timer == TIM2) IRQn = TIM2_IRQn;
|
||||||
|
else if (Timer == TIM3) IRQn = TIM3_IRQn;
|
||||||
|
else IRQn = TIM4_IRQn;
|
||||||
|
NVIC_EnableIRQ(IRQn);
|
||||||
|
NVIC_SetPriority(IRQn, prio);
|
||||||
|
|
||||||
|
pFnc = IT_function;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
void TIM2_IRQHandler(void){
|
||||||
|
if (pFnc != 0){
|
||||||
|
(*pFnc) (); /* appel indirect de la fonction */
|
||||||
|
}
|
||||||
|
TIM2->SR &= ~TIM_SR_UIF;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
void TIM3_IRQHandler(void){
|
||||||
|
TIM3->SR &= ~TIM_SR_UIF;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
void TIM4_IRQHandler(void){
|
||||||
|
TIM4->SR &= ~TIM_SR_UIF;
|
||||||
|
|
||||||
|
};
|
||||||
Loading…
Reference in a new issue