如何在stm32f100RB中使用定时器6或定时器7?

时间:2013-04-29 07:47:26

标签: c embedded arm cortex-m3 stm

我正在学习使用基于arm cortex m3的MCU STM32f100RB。 为了测试定时器6,我写了一些代码,如下所示。它应该使LED闪烁。但它不起作用。任何人都可以帮我告诉我什么是问题?定时器是否正确初始化? 谢谢

#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
}

1 个答案:

答案 0 :(得分:5)

从我能看到的情况来看,你没有启用定时器外设的时钟。

请注意,您的代码执行此操作:

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

但这不可能;

表示你在同一个通话中使用常数作为外设时钟1和2的时钟

你需要:

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

你真的应该使用标准外设库进行定时器初始化,直接戳戳寄存器没有意义。