利用STM32的定时器中断功能编写线阵CCD(ILX554B)的驱动时序
1.利用定时器完成线阵CCDILX554B的驱动时序,采用两个管脚1个用于产生ROG信号,一个用于产生CLK信号
2.使用一个按键,每按一次,CLK的频率变为原来的1/2,ROG的信号长度依次类推
#include "pbdata.h"
void RCC_Configuration(void);
void GPIO_Configuration(void);
void NVIC_Configuration(void);
void TIM3_Configuration(void);
void EXTI_Configuration(void);
//端口等配置省略
u16 T,i,flag;
//主函数
int main(void)
{
i=0;
T=20;
RCC_Configuration(); //系统时钟初始化
GPIO_Configuration();
TIM3_Configuration();
EXTI_Configuration();
NVIC_Configuration();
flag=0;
while(1)
{
if(flag==0)
{
GPIO_SetBits(GPIOB,GPIO_Pin_5); //clk1
delay_ms(10);
GPIO_ResetBits(GPIOD,GPIO_Pin_6); //rog0
delay_ms(20);
GPIO_SetBits(GPIOD,GPIO_Pin_6); //rog1
delay_ms(10);
GPIO_ResetBits(GPIOB,GPIO_Pin_5); //clk0
flag=1;
}
TIM_Cmd(TIM3,ENABLE);
if(i==2*2086)
{
TIM_Cmd(TIM3,DISABLE);
TIM3_Configuration();
i=0;
f=0;
}
}
}
void TIM3_Configuration(void)
{
//定时器初始化
TIM_TimeBaseInitTypeDef TIM_TimeBaseStruct;
TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
TIM_TimeBaseStruct.TIM_Period=T-1; //预分频频率
TIM_TimeBaseStruct.TIM_Prescaler=35999; //预分频系数
TIM_TimeBaseStruct.TIM_ClockDivision=0;
TIM_TimeBaseStruct.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStruct);
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);
TIM_Cmd(TIM3,DISABLE);
}
```c
//中断函数
void TIM3_IRQHandler(void)
{
if(GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_5)==Bit_RESET)
{
GPIO_SetBits(GPIOB,GPIO_Pin_5);
}
else
{
GPIO_ResetBits(GPIOB,GPIO_Pin_5);
}
i++;
TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
}
void EXTI9_5_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line5)==SET)
{
delay_ms(10);
if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_5)==RESET)
{
T*=2;
}
}
EXTI_ClearITPendingBit(EXTI_Line5);
}