Diese Frage hat ihren Ursprung in my other question. Ich habe mich entschieden, eine neue zu erstellen, weil es eine ganz besondere Sache ist, die ich nirgends finden konnte.Erstellen eines Impulses im niedrigen Zustand mit Output Compare, muss standardmäßig hoch sein. + Timer wird bei Bedarf nicht aktiviert.
In einem STM32F415 möchte ich den Output Compare eines Timers standardmäßig hoch und niedrig für die Anzahl der Taktzyklen, die ich ihm erzähle. Mein Ziel ist es, deaktivieren einen Timer mit einem anderen Timer. In der Reference Manual Seite 620 gibt es ein Beispiel für Verwenden eines Timers zum Aktivieren eines anderen Timers.
In meinem Fall möchte ich, dass TIM3 TIM2 und TIM4 steuert, um TIM5 zu steuern. TIM2 und TIM5 lösen DAC-Anfragen an die DMA aus, und sie funktionieren gut. Diese
ist, wie I initialisieren TIM3 (diese Funktion in Haupt vor der Endlosschleife genannt wird):
void TIM3_Config(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitBaseStructure;
TIM_DeInit(TIM3);
// TIM3 Periph clock enable
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
// Time base configuration
TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
TIM_TimeBaseStructure.TIM_Period = 0x46; //ARR = 70 (cycles low will be 0-63)
TIM_TimeBaseStructure.TIM_Prescaler = 0;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
// TIM3 Output Compare configuration
TIM_OCStructInit(&TIM_OCInitBaseStructure);
TIM_OCInitBaseStructure.TIM_OCMode=TIM_OCMode_Active;
TIM_OCInitBaseStructure.TIM_Pulse=0x3C; //CCR
TIM_OCInitBaseStructure.TIM_OutputState=TIM_OutputState_Enable;
TIM_OC1Init(TIM3,&TIM_OCInitBaseStructure);
TIM3->CCMR1 &= 0xFFF7; // OC1PE: Output compare 1 preload disabled
TIM3->CCMR1 &= 0xFFFC; // CC1S[1:0]=00 CC1 channel is configured as output.
TIM3->CR1 |= 0x8;
TIM3->CR2 |= 0x40;
TIM_SelectOutputTrigger(TIM3, TIM_TRGOSource_OC1Ref); // MSM[2:0] = 100 OC1REF as TIM3 TRGO
TIM_Cmd(TIM3, ENABLE);
}
Dann wird in den entsprechenden DMA-IRQ-Handler:
void DMA1_Stream6_IRQHandler(void) /* DAC2 */
{
if (DMA_GetITStatus(DMA1_Stream6,DMA_IT_HTIF6) == SET)
{
DMA_ClearITPendingBit(DMA1_Stream6,DMA_IT_HTIF6);
TIM3->CNT = 0x0; // Reset timer
TIM3->CR1 |= 0x1; // Enable timer
}
/* Some code for the Transfer Complete case */
}
In einer anderen Programmpunkt Ich ändere den CCR entsprechend der Anzahl der Zyklen, die der Slave-Timer (TIM2 oder TIM5) deaktiviert werden soll.
Mein Hauptproblem ist, dass es überhaupt nicht funktioniert, und während des Debugging habe ich festgestellt, dass TIM3 und TIM4 aktivieren Anweisungen nichts zu tun: das Freigabebit (CEN im TIMx CR1 Register) bleibt '0' anstatt auf '1' zu wechseln. Die TIM2- und TIM5-Initialisierung ist ziemlich gleich, ohne den Output Compare und mit der Gated Input-Konfiguration zu dem entsprechenden Timer TRGO, und sie können ohne Probleme aktiviert und deaktiviert werden.
Ich habe keine Bedingung oder Einschränkung gefunden, wie ich einen Timer aktivieren sollte, der mein Programm beeinflussen könnte, also bin ich ein bisschen damit verloren.
Jede Hilfe wäre willkommen, danke!
TL; DR, aber: Verwenden Sie nicht diese Bloatware STlib/"HAL". Es macht Ihren Code nicht mehr portierbar, verlangsamt ihn aber durch unnötigen Overhead. – Olaf