此为在不牵扯PWM 与 DMA下像C51那样计数点灯。
当然你要配置一些IO口作为点灯用这里就不详细说了。
就如
#defineLED2_ON GPIO_ResetBits(GPIOD,GPIO_Pin_7)
#define LED2_OFF GPIO_SetBits(GPIOD,GPIO_Pin_7)
这样的。
然后启用通用定时器2设置它的中断等3.0的库;
//Timer2中断*//
void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;//TIM2全局中断3.0的
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority= 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority =0;
NVIC_InitStructure.NVIC_IRQChannelCmd =ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
//TIM2 clock enable
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_TimeBaseStructure.TIM_Period =8000; //计数值
TIM_TimeBaseStructure.TIM_Prescaler =7200-1; //预分频,此值+1为分频的除数
TIM_TimeBaseStructure.TIM_ClockDivision =0x0; //设置时钟分割
TIM_TimeBaseStructure.TIM_CounterMode =TIM_CounterMode_Up; //向上计数
**********************************************************************************************
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);
TIM_ClockDivision,设置时钟分割
它就是RCC控制寄存器1(TIMx_CR1)的位9:8(CKD),具体含义如下:
CKD[1:0]: 时钟分频因子
定义在定时器时钟(CK_INT)频率与数字滤波器(ETR,TIx)使用的采样频率之间的分频比例。
0x00:tDTS = 1 x tCK_INT
0x01:tDTS = 2 xtCK_INT
0x10:tDTS = 4 xtCK_INT
TIM_TimeBaseStructure中应该还有一个更新报告 uint8_t TIM_RepetitionCounter;不管他也行。
72M/7200=10K分频后的结果就是,定时器速度为10K.计数器为向上计数,8000 溢出,所以溢出时间就是
8000/10K=0.8秒.而捕获的比较值则为:
u16 CCR1_Val = 4000;
u16 CCR2_Val = 2000;
u16 CCR3_Val = 1000;
u16 CCR4_Val = 500;
也就是说,在定时器开始计数后,第一通道的中断发生在4000/10k=0.4秒,第二通道是0.2,第三
通道是0.1,第四是0.05*/
************************************************************************************************
//比较设置*/
TIM_OCInitStructure.TIM_OCMode =TIM_OCMode_Inactive; //输出比较非主动模式
TIM_OCInitStructure.TIM_OCPolarity =TIM_OCPolarity_High; //极性为正
//比较通道1*/
TIM_OCInitStructure.TIM_Pulse =CCR1_Val; //就是4000装入捕获比较寄存器的脉冲值
TIM_OC1Init(TIM2,&TIM_OCInitStructure); //写入配置
TIM_OC1PreloadConfig(TIM2,TIM_OCPreload_Disable); //禁止OC1重装载,其实可以省掉这句,因为默是
//4路都不重装的.
********************************************************************************************
typedef struct
{
uint16_t TIM_OCMode; //选择定时器模式比较多有的功能也比较相似
uint16_t TIM_OutputState; //使能通道 为了和2.0兼容吧我不管他
uint16_tTIM_OutputNState; //失能??
uint16_tTIM_Pulse; //待装入捕获比较寄存器的脉冲值
uint16_t TIM_OCPolarity; //输出极性
uint16_t TIM_OCNPolarity; //???
uint16_tTIM_OCIdleState; //???
uint16_t TIM_OCNIdleState; //???不懂得不管用默认就好
} TIM_OCInitTypeDef;
********************************************************************************************
//比较通道2 /
TIM_OCInitStructure.TIM_Pulse =CCR2_Val;
TIM_OC2Init(TIM2,&TIM_OCInitStructure);
TIM_OC2PreloadConfig(TIM2,TIM_OCPreload_Disable);
//比较通道3 /
TIM_OCInitStructure.TIM_Pulse =CCR3_Val;
TIM_OC3Init(TIM2,&TIM_OCInitStructure);
TIM_OC3PreloadConfig(TIM2,TIM_OCPreload_Disable);
//比较通道4 /
TIM_OCInitStructure.TIM_Pulse =CCR4_Val;
TIM_OC4Init(TIM2,&TIM_OCInitStructure);
TIM_OC4PreloadConfig(TIM2,TIM_OCPreload_Disable);
//使能预装载/
TIM_ARRPreloadConfig(TIM2,ENABLE); //这个历程中没有软件修改寄存器所以没他也行
//预先清除所有中断位防止一启用就有中断从九九那抄的/
TIM_ClearITPendingBit(TIM2, TIM_IT_CC1 |TIM_IT_CC2 | TIM_IT_CC3 | TIM_IT_CC4|TIM_IT_Update);
//4个通道和溢出都配置中断/
TIM_ITConfig(TIM2, TIM_IT_CC1 | TIM_IT_CC2 |TIM_IT_CC3 | TIM_IT_CC4|TIM_IT_Update, ENABLE);
//允许TIM2开始计数 /
TIM_Cmd(TIM2, ENABLE);
服务中断函数比较简单直接抄来
void TIM2_IRQHandler(void)
{
if (TIM_GetITStatus(TIM2, TIM_IT_CC1) !=RESET)
{
//必须清空标志位/*/
TIM_ClearITPendingBit(TIM2,TIM_IT_CC1);
//点亮LED5 一定要是中文的 不然中间的 内容就不见了 本想大家移植到自己的作品中方便 看来SINA不可这样用
上一篇:AD7714+STM32使用注意事项
下一篇:MDK4.0使用J-Link方法
推荐阅读最新更新时间:2024-03-16 15:01