重学STM32---(四)之定时器

知识点

1、定时器的初始化(定时器3为例)

       今天把定时器看了一遍,觉得很有必要把记下来时常看一看。定时器3初始化,很简单,开时钟,装载ARR,PSC寄存器就行了,想要开什么中断在DIER寄存器设置就行了(不过当时我花了很长时间,用寄存器真的不熟)

void Timer3_init(u16 arr,u16 psc)
{
    RCC->APB1ENR |= 1<<0;

    //自动预装载,向下计数
    TIM3->CR1 |= (1<<7)|(1<<4); 

    //预分频寄存器     72000000/psc     定时器工作频率
    TIM3->PSC = psc;   
    TIM3->ARR = arr;    //装载值    
    TIM3->DIER |= 1<<0;
    MY_NVIC_Init (3,3,TIM3_IRQn,2);
    //定时器使能
    TIM3->CR1 |= (1<<0); 
}

//中断函数
void TIM3_IRQHandler()
{
    while(TIM3->SR & (1<<0)) {
        TIM3->SR &= ~(1<<0);
        LED1 = !LED1;
    }
}

 

2、后来又用定时器的PWM利用led编了呼吸灯的程序:(花了很长时间,,,)

       先开启时钟(定时器的,特别一个辅助时钟,不开不能正常工作),再设置CHx所在的IO口为复用推挽输出,需要重映射的使用AFIO->MAPR寄存器,然后再配置TIM3->CCER,TIM3->CCMR1 寄存器,向上向下计数,高低电平有效,pwm1还是pwm2,自己选择就好了,看情况决定

void Timer3_pwm_Init(u16 arr,u16 psc)
{
    RCC->APB1ENR |= 1<<1; //使能TIM3

    //开启辅助时钟         
    //必须要开定时间1时钟,说是什么辅助时钟,到现在还不知道怎么回事,
    RCC->APB2ENR|=1<<0; 
    RCC->APB2ENR|=1<<3; //使能PORTB时钟

    MYGPIOB ->CRL &= ~0x00F00000; //设置PB5为推挽复用输出
    MYGPIOB ->CRL |= 0x00B00000;

    AFIO->MAPR&=0XFFFFF3FF; //清除MAPR的[11:10]
    AFIO->MAPR|=1<<11; //部分重映像,TIM3_CH2->PB5

    TIM3->ARR = arr;
    TIM3->PSC = psc;

    TIM3->CCER |= 1<<4; //通道2输出使能
    TIM3->CR1 |= (1<<7); //自动预装载,向下计数  这两个可以默认,自己知道就行了
    TIM3->CCER |= (1<<5); //输出低电平有效

    TIM3->CCMR1 |= 1<<11; //CH2使能输出
    TIM3->CCMR1 &= ~(7<<12); //清零bit4-6
    TIM3->CCMR1 |= (6<<12); //设置110,为pwm1模式
    TIM3->CR1 |= (1<<0); //使能定时器
}

主函数:(这个自己看着写就行了)

int main()
{
    u8 dir = 0;
    short crr_count = 0;

    Stm32_Clock_Init (9);
    LED_Init ();
    delay_init(72);
    Timer3_Init(899,0);

    while(1) {
        delay_ms(10);

        if (dir == 0)
            crr_count ++;
        else
            crr_count --;

        if (crr_count > 899)
            dir = 1;
        if (crr_count < 0)
            dir = 0;

        TIM3->CCR2 = crr_count ;
    }
}

 

 

 

 

关注公众号"小败日记",搬砖过程遇到的问题,大家一起探讨,资源共享

 
小败日记公众号

​​​扫描二维码,关注我的公众号

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值