0.STM32F103上测试
1.
0)时钟分配图
1)定时器的时钟不是直接来自于APB1或APB2,而来自其上面的倍频器
2)APB1不但要为TIM2~7提供时钟,而且还要为其它外设提供时钟。设置这个倍频器可以在保证其它外设使用较低时钟频率时
3.代码:使PG14,每隔一秒闪烁1次
#include <stm32f10x.h> void GPIO_Config(void); void NVIC_Config(void); void TIMER_Config(void); int main(void) { GPIO_Config(); NVIC_Config(); TIMER_Config(); while(1); } void GPIO_Config(void) { /* 定义GPIO结构体 */ GPIO_InitTypeDef GPIO_InitStructure; /* 总线2使能 */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG, ENABLE); /* 配置GPIO引脚,模式,速度 */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; /* 初始化 */ GPIO_Init(GPIOG, &GPIO_InitStructure); } void NVIC_Config(void) { /* 定义配置中断向量表变量 */ NVIC_InitTypeDef NVIC_InitStructure; /* 选择中断分组1 */ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); /* 选择TIM2的中断通道 */ NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; /* 抢占式中断优先级设置为0 */ NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; /* 响应式中孤单优先级设置为0 */ NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; /* 使能中断 */ NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; /* 初始化 */ NVIC_Init(&NVIC_InitStructure); } /* 定时器的配置 */ void TIMER_Config(void) { /* 定义TIM的变量 */ TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; /* 开启总线1 */ /* TIM2~7 在总线1上 */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); /* 设置TIM2为默认设置 */ TIM_DeInit(TIM2); /* 自动重装载寄存器的值 */ TIM_TimeBaseStructure.TIM_Period = 2000 - 1; /* 时钟预分频数 */ TIM_TimeBaseStructure.TIM_Prescaler = (36000 - 1); /* 采样分频 */ TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; /* 向上计数模式 */ TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; /* 初始化 */ TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); /* 清除溢出中断标志 */ TIM_ClearFlag(TIM2, TIM_FLAG_Update); TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); /* 开启TIM2的中断 */ TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); /* 开启时钟 */ TIM_Cmd(TIM2, ENABLE); } void TIM2_IRQHandler(void) { u8 ReadValue; /* 检测是否发生溢出更新事件 */ if(TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) { /* 清除TIM2的中断待处理位 */ TIM_ClearITPendingBit(TIM2, TIM_FLAG_Update); ReadValue = GPIO_ReadOutputDataBit(GPIOG, GPIO_Pin_14); /* 若该端口当前为低电平 */ if(ReadValue == 0) { GPIO_SetBits(GPIOG, GPIO_Pin_14); } else { GPIO_ResetBits(GPIOG, GPIO_Pin_14); } } }