初级会员

- 积分
- 151
- 金钱
- 151
- 注册时间
- 2011-10-15
- 在线时间
- 31 小时
|

楼主 |
发表于 2011-10-17 17:21:24
|
显示全部楼层
主函数程序
#include <stm32f10x_lib.h>
#include "sys.h"
#include "usart.h"
#include "delay.h"
#include "led.h"
//#include "key.h"
//#include "exti.h"
//#include "wdg.h"
#include "timer.h"
//Mini STM32开发板范例代码7
//定时器中断 实验
//正点原子@ALIENTEK
//技术论坛:www.openedv.com
u8 c=100;//计数脉冲个数
u8 k=0;//初始化装载标志位
u8 puls_pcs=0;//发送每个脉冲的标志
int main(void)
{
Stm32_Clock_Init(9); //系统时钟设置
delay_init(72); //延时初始化
uart_init(72,9600); //串口初始化
LED_Init(); //初始化与LED连接的硬件接口
Timerx_Init(500,1439);//
while(1)
{
//LED0=!LED0;
// delay_ms(200);
}
}
定时器3中断函数
#include "timer.h"
#include "led.h"
#include "delay.h"
//////////////////////////////////////////////////////////////////////////////////
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//Mini STM32开发板
//通用定时器 驱动代码
//正点原子@ALIENTEK
//技术论坛:www.openedv.com
//修改日期:2010/12/03
//版本:V1.0
//版权所有,盗版必究。
//Copyright(C) 正点原子 2009-2019
//All rights reserved
//////////////////////////////////////////////////////////////////////////////////
extern u8 c;//计数脉冲个数
extern u8 k;
extern u8 puls_pcs;//
//定时器3中断服务程序
void TIM3_IRQHandler(void)
{
k=1;//第一次进入中断的标志
if((k==1)&&(TIM3->SR&0X0001))//溢出中断
{
if(c>=1)
{
puls_pcs++;
if(puls_pcs==1)
{
GPIOD->BSRR |=0X00000004;//置位PD.2;
}
else if(puls_pcs==2)
{
GPIOD->BRR |=0X0004;//复位PD.2;
puls_pcs=0;
c=c-1;
}
}
}
TIM3->SR &=0x0000;//清除中断标志位
}
//通用定时器中断初始化
//这里时钟选择为APB1的2倍,而APB1为36M
//arr:自动重装值。
//psc:时钟预分频数
//这里使用的是定时器3!
void Timerx_Init(u16 arr,u16 psc)
{
RCC->APB1ENR|=1<<1;//TIM3时钟使能
TIM3->ARR=arr; //设定计数器自动重装值//刚好1ms
TIM3-> SC=psc; //预分频器7200,得到10Khz的计数时钟
//这两个东东要同时设置才可以使用中断
TIM3->DIER|=1<<0; //允许更新中断
TIM3->DIER|=1<<6; //允许触发中断
TIM3->CR1 =0X0090;//向下计数
TIM3->EGR |=0X0001;//产生更新时间 初始化计数器,硬件自动复位;
TIM3->CNT =500;//写500至TIM3的计数器中
// delay_ms(1);
// TIM3->EGR &=0Xfffe;//产生更新时间 初始化计数器;
TIM3->CR1|=0x0001; //使能定时器3
MY_NVIC_Init(1,1,TIM3_IRQChannel,2);//抢占1,子优先级3,组2
}
|
|