定时器(2)


9/24 今天大概只会学习个半天 然后就下午看论文去了

说说 定时中断的编码逻辑

  1. RCC 开启时钟使能
  2. 选择时基单元的时钟源
  3. 配置时基单元(结构体)
    1. 预分频器
    2. 自动重装器
    3. 计数模式
  4. 配置输出中断控制
  5. 配置NVIC 打开定时中断的通道 并分配优先级
    1. nvic 优先级分组
    2. nvic结构体设置
    3. 启动定时器

大概的代码

这个代码是外部时钟源 来驱动电路

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include "stm32f10x.h"                  // Device header


void Timer_Init(void)
{
// 这里启动TIM2 时基单元来计数
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitTypeDef gpioA_initStruct;
gpioA_initStruct.GPIO_Mode = GPIO_Mode_IPU;
gpioA_initStruct.GPIO_Pin = GPIO_Pin_0;
gpioA_initStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &gpioA_initStruct);
// 外部时钟模式2 启动
TIM_ETRClockMode2Config(TIM2, TIM_ExtTRGPSC_OFF, TIM_ExtTRGPolarity_NonInverted, 0x00);
// 选择时基单元的时钟
TIM_TimeBaseInitTypeDef TIM_InitStruct;
// 时钟分频
// 第一行 不分频
// 向上计数
TIM_InitStruct.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_InitStruct.TIM_CounterMode = TIM_CounterMode_Up;
// ARR 自动重装器
TIM_InitStruct.TIM_Period = 10 - 1 ;
// PSC 预分频器
TIM_InitStruct.TIM_Prescaler = 1 - 1;
// 初始化CNT的值 计数器的值 高级计数器才有 这里不需要使用
TIM_InitStruct.TIM_RepetitionCounter = 0x0000;
TIM_TimeBaseInit(TIM2, &TIM_InitStruct);

// 由于timinit初始化 会触发一次更新事件
//
// 在这里需要重新清理一下 更新的标志位
TIM_ClearFlag(TIM2, TIM_FLAG_Update);
// 定时器使能中断 中断输出控制
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
// nvic控制
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitTypeDef nvic_InitStruct;
nvic_InitStruct.NVIC_IRQChannel = TIM2_IRQn;
nvic_InitStruct.NVIC_IRQChannelCmd = ENABLE;
// 抢占优先级 响应优先级
nvic_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;
nvic_InitStruct.NVIC_IRQChannelSubPriority = 1;
NVIC_Init(&nvic_InitStruct);
// 启动定时器
TIM_Cmd(TIM2,ENABLE);

}