I'm using the STM32F4 HAL library on an emulated [in QEMU] STM32F4 Discovery board, and trying to configure TIM2 (general purpose timer) and read its' count register (without an interrupt). Currently I'm always getting 0 when attempting to read the timer counter with

uint32_t count = __HAL_TIM_GetCounter(&hTim2);

I don't want to move on to using an interrupt just yet, until I get this step working. Taking it step by step.

Here's how I configured the timer so far:


__TIM2_CLK_ENABLE(); // Enable the TIM2 clock
// ...


TIM_HandleTypeDef hTim2;


#include "timer.h"

void Timer_Init(void) {
    hTim2.Instance = TIM2;
    hTim2.Init.Prescaler = 40000;
    hTim2.Init.CounterMode = TIM_COUNTERMODE_UP;
    hTim2.Init.Period = 500;
    hTim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;

    HAL_TIM_Base_Start(&hTim2); // Trying to start the base counter

void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* htim_base) {
    if (htim_base->Instance == TIM2) {

void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* htim_base) {
    if (htim_base->Instance == TIM2) {

then in main.c

int main(int argc, char* argv[]) {
    while (1) {
        uint32_t count = __HAL_TIM_GetCounter(&hTim2);
        trace_printf("%lu\n", count);

I'm always getting 0 in count above, not sure why? Can anyone please offer some advice?


1 Answer 1


I've finally figured out my issue. It was nothing to do with my code, but rather the QEMU simulator I was running my code on.

Once I plugged in the board, and ran the code on it, I started getting timings as expected.

Not using QEMU again!

  • \$\begingroup\$ Exactly. When you have a board like the discovery that costs $15, there's little reason to simulate. \$\endgroup\$ Oct 19, 2015 at 21:44
  • \$\begingroup\$ I had no idea QEMU could simulate STM32F4 (well, badly as it turned out). There are some limitations outlined at gnuarmeclipse.github.io/qemu I didn't go through that list, but if it's not a known one, perhaps worth reporting as a bug. \$\endgroup\$
    – Fizz
    Oct 19, 2015 at 22:20
  • \$\begingroup\$ Agreed, the only reason I simulated was because I was actually coding while in commuting to work/home with the bus. But now that boats' completely blown out the water. \$\endgroup\$ Oct 20, 2015 at 6:09
  • \$\begingroup\$ QEMU is mostly for emulating the Arm core. The vendor peripherals are generally not implemented. The eclipse Qemu plugin supports GPIOs for some micros. Vendors could implement them but they don't seem to. \$\endgroup\$
    – Flip
    Jun 26, 2018 at 7:34

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.