Как использовать таймер 6 или таймер 7 в stm32f100RB?

Учусь пользоваться микроконтроллером STM32f100RB, который основан на коре арм м3. Чтобы проверить таймер 6, я написал несколько кодов, как показано ниже. Он должен заставить светодиод мигать. Но это не работает. Кто-нибудь может помочь мне, сказав, в чем проблема? Правильно ли инициализирован таймер? Спасибо

#include "stm32f10x.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_tim.h"

void delay_millisec(register unsigned short n);

int main(void)
{
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB1Periph_TIM6, ENABLE);

    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_StructInit(&GPIO_InitStructure);
    GPIO_InitStructure.GPIO_Speed  =     GPIO_Speed_2MHz;
    GPIO_InitStructure.GPIO_Pin    =     GPIO_Pin_8;     //enable the pin 8 and pin 9
    GPIO_InitStructure.GPIO_Mode   =     GPIO_Mode_Out_PP;
    GPIO_Init(GPIOC, &GPIO_InitStructure);

    while(1)
    {
        GPIO_WriteBit(GPIOC, GPIO_Pin_8, Bit_RESET);
        delay_millisec(1000);

        GPIO_WriteBit(GPIOC, GPIO_Pin_8, Bit_SET);
        delay_millisec(1000);
    }
    return 0;
}

void delay_millisec(register unsigned short n) 
{
   if (n > 1) n--;
   TIM6->PSC = 23999;   // Set prescaler to 24,000 (PSC + 1)
   TIM6->ARR = n;       // n = 1 gives 2msec delay rest are ok
   TIM6->CNT = 0;
   TIM6->EGR = TIM_EGR_UG;  // copy values into actual registers!
                            // Enable timer in one pulse mode
   TIM6->CR1 |= (TIM_CR1_OPM | TIM_CR1_CEN);
   while (TIM6->CR1 & TIM_CR1_CEN); // wait for it to switch off
}

person Yue Wang    schedule 29.04.2013    source источник
comment
Почему вы используете библиотечные функции для доступа к GPIO, но взламываете регистры таймера напрямую? Не делайте этого, STM32 достаточно сложен, чтобы хотя бы начать с использования библиотеки для всего.   -  person unwind    schedule 29.04.2013
comment
Это немного смущает. Правда в том, что я понятия не имею, как использовать таймеры. Часть инициализации таймеров была скопирована из заметки моего лектора. Есть ли другой способ справиться с этим? @размотать   -  person Yue Wang    schedule 29.04.2013
comment
Видите этот заголовок stm32f10x_tim.h, который вы включаете? Он определяет API для работы с таймерами STM32, просмотрите объявленные там функции.   -  person unwind    schedule 29.04.2013


Ответы (1)


Насколько я вижу, вы не включаете часы периферийного таймера.

Обратите внимание, что ваш код делает это:

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB1Periph_TIM6, ENABLE);
       ^                      ^                      ^
       |                      |                      |
      APB2                   APB2                   APB1?!!

но это не может быть правильным; вы используете константы для периферийных часов 1 и 2 в одном и том же вызове для часов 2. Это не сработает.

Тебе нужно иметь:

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);

Вы действительно должны использовать стандартную периферийную библиотеку для инициализации таймера, нет смысла напрямую копаться в регистрах.

person unwind    schedule 29.04.2013
comment
!!!Вот почему это не работает.Какой же я глупый..^^|| Спасибо~@расслабься. И спасибо за вашу идею, я прочитаю заголовочный файл. - person Yue Wang; 29.04.2013
comment
Проблема такого рода обычно возникает из-за того, что код, написанный для использования одного пронумерованного экземпляра периферийного устройства, и его пересмотр для использования другого пронумерованного экземпляра, который имеет другие детали, например, находится на другом APB... - person Chris Stratton; 29.04.2013