本人使用的是正点原子的ministm32
整体思路
我们的stm32拥有很多定时器,它的作用就跟它的名字一样,可以设定中断发生的时间。本次实验的显现就是通过定时器让LED1闪烁,LED0则作为对照
代码部分
main函数
#include "sys.h"
#include "usart.h"
#include "delay.h"
#include "led.h"
#include "timer.h"
int main(){
Stm32_Clock_Init(9);
uart_init(72,9600);
delay_init(72);
LED_Init();
TIM3_Int_Init(5000,7199);//10Khz的计数频率。计数5K次为500ms
while(1){
LED0=!LED0;
delay_ms(200);
}
}
timer.c
#include "timer.h"
#include "led.h"
//定时器3中断服务程序
void TIM3_IRQHandler(void){
if(TIM3->SR &0X0001){//SR=1,更新中断等待响应
LED1=!LED1;
}
TIM3->SR &=~(1<<0);//通过软件置0,清除中断标志位
}
void TIM3_Int_Init(u16 arr,u16 psc){
RCC->APB1ENR|=1<<1; //TIM3时钟使能
TIM3->PSC=psc;//预分频器
TIM3->ARR=arr;//设定计时器自动重装载值
//中断时间=((arr+1)*(psc+1))/Tclk;
//Tclk:TIM的输入时钟频率(Mhz)
//tout:中断时间(us)
TIM3->DIER |=1<<0;//允许更新中断
TIM3->CR1 |=0x01;//使能定时器3
MY_NVIC_Init(1,3,TIM3_IRQn,2);
}
timer.h
#ifndef _TIMER_H
#define _TIMER_H
#include "sys.h"
void TIM3_Int_Init(u16 arr,u16 psc);
#endif