2017-05-24 4 views
0

Ich versuche, ein Gerät zu machen, das Signal von externen Sensor (Drucksensor) zu empfangen. Ich benutze HAL Bibliotheken auf STM32F3Discovery und USB - USART Adapter, um mit dem Computer über die serielle Schnittstelle zu kommunizieren. Ich sende und empfange Daten zum/vom Gerät, aber ich brauche eine Möglichkeit, den Timer-Prescaler- und Autoreload-Wert zu ändern (um eine Abtastrate zu ändern) mit einem Knopf auf meiner GUI-Anwendung. Wie kann ich das machen? Ich habe versucht, etwas in der Art:stm32 dynamische Timer-Einstellungen ändern

void HAL_UART_RxCpltCallback(UART_HandleTypeDef* huart) { 
if (Recived == 0) { 

    HAL_GPIO_TogglePin(GPIOE, GPIO_PIN_11); 
    TIM7->PSC = 119; 
    TIM7->ARR = 5999; 

} 

Aber es hat offensichtlich nicht funktioniert: D Hilfe.

EDIT:

Ich denke, im etwas falsch mit Syntax zu tun, führen zunächst initialisieren ich tim7 wie folgt aus:

static void MX_TIM7_Init(void) 
{ 

TIM_MasterConfigTypeDef sMasterConfig; 

    htim7.Instance = TIM7; 
    htim7.Init.Prescaler = 9999; 
    htim7.Init.CounterMode = TIM_COUNTERMODE_UP; 
    htim7.Init.Period = 719; 
    if (HAL_TIM_Base_Init(&htim7) != HAL_OK) 
    { 
    Error_Handler(); 
    } 

    sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; 
    sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; 
    if (HAL_TIMEx_MasterConfigSynchronization(&htim7, &sMasterConfig) != 
HAL_OK) 
    { 
    Error_Handler(); 
    } 
    }  

Und dann Im Versuch tim7 in meinem Haupt-Funktion wie diese

reconfig
void HAL_UART_RxCpltCallback(UART_HandleTypeDef* huart) { 
if (Recived == 0) { 

    HAL_GPIO_TogglePin(GPIOE, GPIO_PIN_11); 
    TIM7->PSC = 119; 
    TIM7->ARR = 5999; 
    TIM7->EGR = TIM_EGR_UG; 

} 
    MX_TIM7_Init(); 
if(Recived == 1){ 

    HAL_GPIO_TogglePin(GPIOE, GPIO_PIN_12); 
    TIM7->PSC = 9999; 
    TIM7->ARR = 719; 
    TIM7->EGR = TIM_EGR_UG; 

} 
} 

Ich bin sicher, dass im Senden von Daten und erhalten es auf uC, wegen der LEDs.

+0

Überprüfen Sie zuerst die Registerbeschreibung. –

Antwort

0

Es funktioniert definitiv. Sie können das Schatten-PSC-Register erneut laden, indem Sie das UG-Ereignis auslösen.

+0

Ich habe auch versucht, Linie zu verwenden: TIM7-> EGR = TIM_EGR_UG; Ich denke, ich mache etwas falsch mit der Syntax. Ich habe meine Frage mit mehr Code bearbeitet, könnten Sie bitte darauf schauen? – Natoll

0

fand ich diese Aussage:

/* Set the Autoreload value */ 
TIMx->ARR = (uint32_t)Structure->Period ; 

/* Set the Prescaler value */ 
TIMx->PSC = (uint32_t)Structure->Prescaler; 

if (IS_TIM_REPETITION_COUNTER_INSTANCE(TIMx)) 
    { 
    /* Set the Repetition Counter value */ 
    TIMx->RCR = Structure->RepetitionCounter; 
} 

/* Generate an update event to reload the Prescaler 
and the repetition counter(only for TIM1 and TIM8) value immediatly */ 
TIMx->EGR = TIM_EGR_UG; 
} 

Ist es möglich, dass ich für TIM1 und TIM8 nur PSC und ARR Wert nachladen?

+0

TIM7 in der F3xx-Familie erzeugt keine PWM-Ausgabe. Es ist ein einfacher Timer, um den DAC zu steuern. –

+0

Natürlich ändern Sie nur eine bestimmte Timer-Register. Mein Ratschlag - lies das Referenzhandbuch, zeige keine "Aussagen" irgendwo im Netz. Versuchen Sie zu verstehen, wie der Timer funktioniert und alles wird offensichtlich und einfach. –