目录
- /******************************************************************************
- 定时器初始化函数
- *******************************************************************************/
- void TIMx_Init(st_u32 RCC_APB1Periph,st_u16 per,st_u16 psc,st_u16 clk_div,st_u16 Count_mode,TIM_TypeDef* TIMx)
- {
- /*uint32_t RCC_APB1Periph = RCC_APB1Periph_TIM2|RCC_APB1Periph_TIM3|RCC_APB1Periph_TIM4
- |RCC_APB1Periph_TIM5|RCC_APB1Periph_TIM6|RCC_APB1Periph_TIM7;*/
- // 定时器结构体
- TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
-
- // 预分配值
- st_u16 PreValue=0;
-
- //使能定时器时钟 TIM5
- RCC_APB1PeriphClockCmd(RCC_APB1Periph, ENABLE);
-
- PreValue =(st_u16)psc;
-
- // 设置自动重装载寄存器周期的值 计数到5000为500ms
- // 计数一次的时间1/(TIMxCLK/(PSC+1))=1/1000
- // 定时器周期,实际就是设定自动重载寄存器的值,在事件生成时更新到影子寄存器。可设置范围为 0 至 65535。
-
- TIM_TimeBaseInitStructure.TIM_Period = per;
-
- // 设置用来作为TIMx时钟频率除数的预分频值 10Khz的计数频率
- // 定时器预分频器设置,时钟源经该预分频器才是定时器时钟,它设定
- // TIMx_PSC 寄存器的值。可设置范围为 0 至 65535,实现 1 至 65536 分频。
- TIM_TimeBaseInitStructure.TIM_Prescaler = 0;
-
- // 时钟分割 设置时钟分割:TDTS = Tck_tim
- // 时钟分频,设置定时器时钟 CK_INT 频率与数字滤波器采样时钟
- // 频率分频比,基本定时器没有此功能,不用设置。
- TIM_TimeBaseInitStructure.TIM_ClockDivision =clk_div;
-
- // 计数模式 TIM向上计数模式
- // 可是在为向上计数(TIM_CounterMode_Up)、向下计数(TIM_CounterMode_Down)以及三种中心对齐模式。TIM_CounterMode_CenterAligned1 TIM_CounterMode_CenterAligned2 TIM_CounterMode_CenterAligne3
- // 基本定时器只能是向上计数,即 TIMx_CNT 只能从 0 开始递增,并且无需初始化。
- TIM_TimeBaseInitStructure.TIM_CounterMode = Count_mode;
-
- // 及时装入PrescalerValue的值
- TIM_PrescalerConfig(TIM2, PreValue, TIM_PSCReloadMode_Immediate);
- // TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
-
- TIM_TimeBaseInit(TIMx, &TIM_TimeBaseInitStructure);
- //TIM_Cmd(TIMx, ENABLE);
- }


- /*******************************************************************************
- * 函 数 名 : NVIC_InitConfig
-
- * 函数功能 : 中断通道初始化函数
- * 输 入 : NVIC_IRQl 中断通道
- NVIC_IRQlPP 抢占式优先级
- NVIC_IRQlSP 子优先级
-
- * 输 出 : 无
- NVIC 是嵌套向量中断控制器,控制着整个芯片中断相关的功能,它跟内核紧密耦合,是内核里面的一个外设。
- 中断优先级寄存器 NVIC_IPRx,用来配置外部中断的优先级,IPR 宽度为 8bit,原则上每个外部中断可配置的优先级为 0~255,数值越小,优先级越高。stm32f103只使用高四位
- @arg NVIC_PriorityGroup_0: 0bit for 抢占优先级
- 4 bits for 子优先级
- @arg NVIC_PriorityGroup_1: 1 bit for 抢占优先级
- 3 bits for 子优先级
- .................................................
- 为了方便管理我们把中断服务函数统一写在 stm32f10x_it.c 这个库文件中。
- *******************************************************************************/
-
- void NVIC_InitConfig(uint8_t NVIC_IRQl,uint8_t NVIC_IRQlPP,uint8_t NVIC_IRQlSP)
- {
-
- NVIC_InitTypeDef NVIC_InitStructure;
- // 中断通道 中断源
- NVIC_InitStructure.NVIC_IRQChannel = NVIC_IRQl;
-
- // 抢占式优先级 具体的值要根据优先级分组来确定
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=NVIC_IRQlPP ;
-
- // 中断通道子优先级
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = NVIC_IRQlSP;
-
- // IRQ通道使能
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
-
- // 根据指定的参数初始化VIC寄存器
- NVIC_Init(&NVIC_InitStructure);
- }
- void APB1Psc_Config(void)
- {
-
- // 如果APB1不分频,则定时器时钟TIMxCLK=HCLK,如果APB1分频>2,则TIMxCLK=2*HCLK
- // 计数器频率CNTCLK=TIMxCLK/(psc+1) =18/6=3M 设分频系数6-1
- // 计数器计数一次的时间 1/CNTCLK=1/3000 ms
- // 1/CK_CLK * ARR=1ms ==> ARR= 3000
- // HCLK/8 = 9 TIMxCLK=18
-
-
- #ifdef DEBUG_APB1
- RCC_PCLK1Config(RCC_HCLK_Div4);
- #else
- RCC_PCLK1Config(RCC_HCLK_Div8);
- #endif
- TIM2_Init();
-
- }
-
- #define DEBUG_1ms
- void TIM2_Init(void)
- {
- // 中断源 抢占式优先级0 响应式优先级3
- NVIC_InitConfig(TIM2_IRQn,1,2);
-
- #ifdef DEBUG_1ms
- // 配置一个1ms中断定时器
- // 定时器配置 1、使能定时器 2、arr 3、psc 4、向上计数模式 5、定时器2
- TIMx_Init(RCC_APB1Periph_TIM2,3000, 6-1,0,TIM_CounterMode_Up,TIM2);
- #endif
- // TIM2中断触发 当计数器的值从0计数到arr是会触发更新中断(TIM_IT_Update)
- TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
- TIM_Cmd(TIM2, ENABLE);
- }