Bit-banging
pensée Bitwise, B9 obtient la valeur précédente de B8 et B8 obtient l'inverse de B9, ou l'inverse lorsque le compte à rebours. Vous permutez les deux bits, et exclusif ou avec 0x100
ou 0x200
selon la direction.
inline void incB89(int down) {
uint32_t temp;
/* read the current output state */
temp = GPIOB->ODR;
/* modifying the significant bit-pair
don't care about overflow */
temp = (((temp & 0x100) << 1) | ((temp & 0x200) >> 1))^(0x100 << down);
/* Setting the reset bits BR8 and BR9. This has the effect that
bits 8 and 9 will be copied into the ODR, and the rest will
be left alone */
temp |= ((1 << 24) | (1 << 25));
GPIOB->BSRR = temp;
}
l'aide d'une minuterie (ou deux)
Sur la plupart des contrôleurs de la série STM32, TIM4
canaux 3 et 4 sorties peuvent être mis en correspondance avec PB8 et PB9. Si vous en possédez une, cette minuterie peut contrôler les sorties de manière autonome, sans être affectée par le code, la mémoire ou la latence d'interruption.
- Définissez le mode GPIO et les registres de fonction alternatifs conformément au manuel de référence de votre automate.
- Configurez les modes 3 et 4 en mode basculement, définissez les bits
OC1M
et OC2M
en TIM4->CCMR1
à 0b011
.
- Définissez l'horloge d'entrée, le précalcul
PSC
et rechargez ARR
pour obtenir deux fois la fréquence souhaitée, car chaque sortie sera basculée une fois dans chaque cycle de minuterie.
- Définir
TIM4->CCR3=0
et TIM4->CCR4=(TIM4->ARR+1)/2
pour le comptage dans une direction. Remplacez-les (lorsque le compteur est arrêté) pour inverser la direction. Activer les sorties dans TIM4->CCER
.
- Vous pouvez démarrer et arrêter le comptage en définissant ou en réinitialisant le bit
CEN
de TIM4->CR1
.
- Pour compter les cycles, vous pouvez configurer une interruption pour basculer ou mettre à jour les événements dans
TIM4->DIER
ou utiliser une autre horloge comme esclave pour TIM4.
Pour utiliser par ex. TIM3
pour compter:
- Définir les
MMS
bits dans TIM4->CR2
-0b010
pour délivrer en sortie une impulsion de déclenchement sur chaque débordement.
- Configurez
TIM3->SMCR
en mode horloge externe 1 et sélectionnez le déclencheur interne de TIM4.
- Définissez
TIM3->ARR
sur le nombre requis de demi-cycles - 1.
- Configurez une interruption lors de la mise à jour.
- Démarrez le compteur.
Il y a quelques trucs plus possibles avec des minuteries, comme l'utilisation de rafales DMA déclenchées par l'esclave de mettre à jour les registres ARR
et CCR
de la minuterie maître d'une table de valeurs « wawelength ».
Incrément/décrément (modulo 4)? – wildplasser
qui ne produira pas la séquence 0,1,3,2 requise – berendi