#一、项目所需外设
#二、项目代码
一、项目所需外设
1、通用定时器
1.通用定时器位于ABP1低速总线上
2.16位向下,向上/向下(中心对齐模式)计数模式,自动重装载计数器(TIMx_CNT)
3.16位可编程(可以实现修改)预分频器(TIMx_PSC),计数器时钟频率的分频系为1-65535任意数值
4.四个独立通道(TIMx_CH1~4),通道用来支持
1)输入捕获
2)输入比较
3)PWM生成
4)单脉冲模式输出
5.可使用外部信号(TIM_ETR)控制定时器和定时器互联的同步电路
2、通用定时器中断/事件产生:(六个独立的IRQ/DMA请求生成器)
1.更新:计数器向上/向下溢出,计数器初始化(软件或者外部/内部触发)
2.触发事件:计数器的启动,停止,初始化或者由内部/外部触发计数
3.输入捕获
4.输出比较
STM32通用定时器可以被用于:测量输入信号的脉冲长度(输入捕获),或者产生输入波形(输出比较和PWM)等。
3、通用定时器计数模式:
STM32通用定时器可以向上、向下、向上或者向下双向计数模式
1.向上计数模式:计数值从0计数到自动加载值(TIM_ARR),产生一个计数溢出事件,然后重新从0开始计数
2.向下计数模式:计数器从自动装入的值(TIM_ARR)开始向下计数到0,产生一个计数溢出事件,然后从计数装入值重新开始
3.中央对齐模式:计数器从0开始到(自动装入值-1)产生计数溢出事件,然后向下计数到1,产生定时器溢出事件,然后从0开始计数
4、通用定时器工作模式:
1.时钟部分:(时钟来源)
1)内部时钟APB1倍频器
2)外部引脚(通用定时器2,3,4)
3) 其他定时器
4)外部通道
2.时基单元:
1)预分频(除法)
2)计数器时钟
3)自动重装载值
3.输入部分:
1)输入引脚
2)边沿检测
4.输出部分:
1)输出比较寄存器
2)周期——重装载值
3)占空比——比较值
二、项目代码
main.c
#include "stm32f10x.h"
#include "main.h"
#include "LED.h"
#include "usart.h"
#include "relay.h"
#include "shake.h"
#include "exti.h"
#include "tim.h"
void delay(uint16_t time)//延迟函数
{
uint16_t i=0;
while(time--)
{
i=12000;
while(i--);
}
}
int main()
{
usart_init();//串口初始化
tim_config();//定时器初始化
LED_Init();//LED初始化
while(1)
{
}
}
//配置中断服务函数
void TIM2_IRQHandler(void)
{
static uint16_t temp; //定义静态变量
if(TIM_GetITStatus(TIM2,TIM_IT_Update)!=RESET)//判断是否发生中断
{
if(temp++%2==1)//实现灯的一秒闪烁
{
GPIO_ResetBits(GPIOA,GPIO_Pin_1);//开灯
}
else
{
GPIO_SetBits(GPIOA,GPIO_Pin_1);//关灯
}
}
TIM_ClearITPendingBit(TIM2,TIM_IT_Update);//清除中断标志位
}
tim.c
#include "stm32f10x.h"
#include "tim.h"
void tim_config(void)
{
TIM_TimeBaseInitTypeDef TIMinitstruct;//定时器结构体初始化
NVIC_InitTypeDef nvicinstruct;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);//配置中断优先组为1
//1.使能定时器时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//配置定时器时钟
//2.开启定时器中断,配置中断结构体
TIMinitstruct.TIM_ClockDivision = TIM_CKD_DIV1;//1分频
TIMinitstruct.TIM_CounterMode = TIM_CounterMode_Up;//计数模式为向上计数
TIMinitstruct.TIM_Period = 10000-1;//设定重装载值为9999
TIMinitstruct.TIM_Prescaler = 7200-1;//设定分频系数为7199
TIM_TimeBaseInit(TIM2,&TIMinitstruct);//定时器初始化
TIM_Cmd(TIM2,ENABLE);//使能定时器
TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);//使能定时器中断,允许定时器更新
nvicinstruct.NVIC_IRQChannel = TIM2_IRQn;//配置通道
nvicinstruct.NVIC_IRQChannelCmd = ENABLE;//使能通道
nvicinstruct.NVIC_IRQChannelPreemptionPriority = 1;//抢占优先级为1
nvicinstruct.NVIC_IRQChannelSubPriority = 1;//子优先级为1
NVIC_Init(&nvicinstruct);//初始化中断控制器
}
tim.h
#include "stm32f10x.h"
void tim_config(void);
led.c
#include "LED.h"
#include "stm32f10x.h"
void LED_Init(void)
{
GPIO_InitTypeDef LED_Init;
//1.使能ABP2的时钟GPIOA
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
//2.结构体配置
LED_Init.GPIO_Mode = GPIO_Mode_Out_PP;
LED_Init.GPIO_Pin = GPIO_Pin_1;
LED_Init.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_Init(GPIOA, &LED_Init);
}
led.h
#include "stm32f10x.h"
void LED_Init(void);