main.c
#include "config.h"
#include "led.h"
#include "timer.h"
int main(void)
{
/* LED 端口初始化 */
LED_GPIO_Config();
//定时器初始化
time6_init(10000,7200);
while (1);
}
timer.c
#include "timer.h"
/* TIM6中断优先级配置函数 */
void NVIC_TIM6Enable(void)
{
NVIC_InitTypeDef NVIC_initstructure;
NVIC_initstructure.NVIC_IRQChannel = TIM6_IRQn; //选择TIM6中断通道
NVIC_initstructure.NVIC_IRQChannelCmd = ENABLE; //使能中断通道
NVIC_initstructure.NVIC_IRQChannelPreemptionPriority = 0; //设定抢占优先级为0
NVIC_initstructure.NVIC_IRQChannelSubPriority = 0; //设定响应优先级为0
NVIC_Init(&NVIC_initstructure);
}
/* 定时器6初始化函数,period-计数周期,Prescaler-预分频值 */
void time6_init(u16 per,u16 pre)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE); //使能TIM6时钟
TIM_TimeBaseStructure.TIM_Period = per-1; //设定自动重装载计数值
TIM_TimeBaseStructure.TIM_Prescaler = pre-1; //设定预分频系数
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //基本定时器没有时钟分频功能,此项会被忽略
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //设置向上计数模式
TIM_TimeBaseInit(TIM6, &TIM_TimeBaseStructure); //初始化TIM6
NVIC_TIM6Enable(); //初始化TIM6中断优先级
TIM_ClearITPendingBit(TIM6, TIM_IT_Update); //清除中断标志位,否则启动中断会先进中断服务函数
TIM_ITConfig(TIM6, TIM_IT_Update, ENABLE ); //使能TIM6中断
TIM_Cmd(TIM6, ENABLE); //使能TIM6定时器
}
timer.h
#ifndef _TIMER_H
#define _TIMER_H
#include "config.h"
void time6_init(u16 per,u16 pre);
#endif
定时器中断函数放stm32f10x_it.c这个文件里,代码如下
void TIM6_IRQHandler(void)
{
static int flag = 0; //定义LED状态标志位,初始状态为0
if (TIM_GetITStatus(TIM6, TIM_FLAG_Update) == SET) //检测是否为定时器溢出中断
{
TIM_ClearITPendingBit(TIM6, TIM_FLAG_Update); //清除中断标志位
flag = !flag;
if (flag == 0)
{
LED1_OFF;
}
else
{
LED1_ON;
}
}
}
config.c
#include"config.h"
void delay_us(u16 us)
{
u8 i;
while (us--)
{
for(i=8;i>0;i--);
}
}
void delay_ms(u16 nms)
{
while (nms--)
{
delay_us(960);
}
}
void Delay(u32 nCount) //简单的延时函数
{
for(; nCount != 0; nCount--);
}
/* 1/4微秒延时函数(含函数调用及返回时间共计耗时约1/4微妙@72MHz主频) */
void delay_qus(void)
{
__ASM ("nop");
__ASM ("nop");
__ASM ("nop");
__ASM ("nop");
__ASM ("nop");
__ASM ("nop");
__ASM ("nop");
__ASM ("nop");
}
config.h
#ifndef _CONFIG_H
#define _CONFIG_H
#include "stm32f10x.h"
/**************************************????*********************************************/
//?????
#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2))
#define MEM_ADDR(addr) *((volatile unsigned long *)(addr))
#define BIT_ADDR(addr, bitnum) MEM_ADDR(BITBAND(addr, bitnum))
#define GPIOA_ODR_Addr (GPIOA_BASE+12)
#define GPIOB_ODR_Addr (GPIOB_BASE+12)
#define GPIOC_ODR_Addr (GPIOC_BASE+12)
#define GPIOD_ODR_Addr (GPIOD_BASE+12)
#define GPIOE_ODR_Addr (GPIOE_BASE+12)
#define GPIOF_ODR_Addr (GPIOF_BASE+12)
#define GPIOG_ODR_Addr (GPIOG_BASE+12)
#define GPIOA_IDR_Addr (GPIOA_BASE+8)
#define GPIOB_IDR_Addr (GPIOB_BASE+8)
#define GPIOC_IDR_Addr (GPIOC_BASE+8)
#define GPIOD_IDR_Addr (GPIOD_BASE+8)
#define GPIOE_IDR_Addr (GPIOE_BASE+8)
#define GPIOF_IDR_Addr (GPIOF_BASE+8)
#define GPIOG_IDR_Addr (GPIOG_BASE+8)
#define PAout(n) BIT_ADDR(GPIOA_ODR_Addr,n)
#define PAin(n) BIT_ADDR(GPIOA_IDR_Addr,n)
#define PBout(n) BIT_ADDR(GPIOB_ODR_Addr,n)
#define PBin(n) BIT_ADDR(GPIOB_IDR_Addr,n)
#define PCout(n) BIT_ADDR(GPIOC_ODR_Addr,n)
#define PCin(n) BIT_ADDR(GPIOC_IDR_Addr,n)
#define PDout(n) BIT_ADDR(GPIOD_ODR_Addr,n)
#define PDin(n) BIT_ADDR(GPIOD_IDR_Addr,n)
#define PEout(n) BIT_ADDR(GPIOE_ODR_Addr,n)
#define PEin(n) BIT_ADDR(GPIOE_IDR_Addr,n)
#define PFout(n) BIT_ADDR(GPIOF_ODR_Addr,n)
#define PFin(n) BIT_ADDR(GPIOF_IDR_Addr,n)
#define PGout(n) BIT_ADDR(GPIOG_ODR_Addr,n)
#define PGin(n) BIT_ADDR(GPIOG_IDR_Addr,n)
void delay_us(uint16_t us);
void delay_ms(uint16_t nms);
void Delay(u32 nCount);
void delay_qus(void);
#endif