重学STM32---(四)

  今天把定时器看了一遍,觉得很有必要把记下来时常看一看

定时器3初始化,很简单,开时钟,装载ARR,PSC寄存器就行了,想要开什么中断在DIER寄存器设置就行了(不过当时我花了很长时间,用寄存器真的不熟)

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

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

TIM3->PSC = psc;   //预分频寄存器     72000000/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;
}
}

后来又用定时器的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
RCC->APB2ENR|=1<<0; //开启辅助时钟          //必须要开定时间1时钟,说是什么辅助时钟,到现在还不知道怎么回事,
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 ;
}
}

上一篇:Thinkphp 带查询条件数据分页


下一篇:Linux命令2——b