定时50 ms 中断
所用的芯片为STM8S103F3P6,编译器为IAR ,程序代码如下:
#include "iostm8s103F3.h" // Very importtant
void DelayMS(unsigned int ms)
{
unsigned char i;
while(ms != 0)
{
for(i=0;i<250;i++)
{
}
for(i=0;i<75;i++)
{
}
ms--;
}
}
GPIO口初始化
void GPIO_init(void)
{
PA_DDR = 0x08; // 配置PD端口的方向寄存器PD0输出
PA_CR1 = 0x08; // 设置PD0为推挽输出
PA_CR2 = 0x00;
PC_DDR = 0x18; // 配置PD端口的方向寄存器PD0输出
PC_CR1 = 0x18; // 设置PD0为推挽输出
PC_CR2 = 0x00;
}
void ADC_init(void)
{
CLK_PCKENR2 =0x08; // Enable the f(MASTER) Clock to ADC;
ADC_CR1 = 0x40; // ADC Clock: SPSEL[2:0]=100; fADC = f(MASTER)/8=1M; Single conversion mode ; ADON=0;
ADC_CR2 = 0x20; // Data Left alignment ;Scan mode disabled
ADC_CSR = 0x03; // Select Channel AIN3; EOC interrupt disabled ; (ECO:End of conversion)
ADC_TDRL = 0x03; // Channel AIN3 Schmitt trigger disabled
}
void TIM2_init(void)
{
CLK_PCKENR1=0x20; // Enable the f(MASTER) Clock to Time2;
TIM2_PSCR =0x03; // Time2 Clock Frequency:1M ; prescaler :8; Fck_psc/ 2^(PSC[3:0]); 0011; //Fck_psc=f(MASTER)=8M;
TIM2_EGR = 0x01; // Re-initializes the counter and generates an update of the registers
TIM2_CNTRH = 0x0; // Counter Starting Value;
TIM2_CNTRL = 0x0;
TIM2_ARRH = 0xC3; // TIM2_ARRH Must be Loaded Value First ,then to TIM2_ARRL; Auto-reload// register high (TIMx_ARRH);
TIM2_ARRL = 0x50; // 0xC350 = 50000 ;Time = 1us x 50000 = 50 ms;
TIM2_IER =0x01; // Time2 Update interrupt Enabled;
TIM2_CR1 =0x01; // Counter enable;
}
void CLK_init(void)
{CLK_SWR = 0xE1; // 0xE1: HSI selected as master clock source ; f(HSI)RC =16M ;
CLK_CKDIVR = 0x09; // f(HSI)RC =16M ; f(HSI)=[f(HSI)RC]/2 = 8M = f(MASTER) ; f(CPU)=f(MASTER)/2= 4M ;
}
int i=0;
unsigned int ADdata;
unsigned int ADlow;
main()
{
GPIO_init();
CLK_init();
TIM2_init();
ADC_init();
asm("rim"); //Enable Global interrupt;
while(1)
{
PC_ODR = 0x00;
// PA_ODR = 0x00;
PA_ODR = 0x08;
// DelayMS(100);
if(i%20==0)
{
//PC_ODR = 0x00;
//PA_ODR = 0x08;
//DelayMS(200);
PA_ODR = 0x00;
DelayMS(50);
// i=0;
//PC_ODR = 0x08;
// DelayMS(100);
// PC_ODR = 0x10;
// DelayMS(100);
}
if(i==40)
{
// ADC_CR1 |=0x01; //启动转换
//while((ADC_CSR&0x80) == 0); // 等待ADC结束
//PC_ODR = 0x00;
PA_ODR = 0x00;
DelayMS(300);
// PA_ODR = 0x08;
//DelayMS(100);
i=0;
PC_ODR = 0x08;
DelayMS(30);
// PC_ODR = 0x10;
// DelayMS(30);
}
//for(i=0;i<10;i++)
//{
//PC_ODR = 0x08;
// DelayMS(30);
/// PC_ODR = 0x10;
// DelayMS(30);
//}
}
}
#pragma vector=TIM2_OVR_UIF_vector
__interrupt void TIM2_OVR_UIF(void){
TIM2_SR1 = 0x00; // Clear UIF: Update interrupt flag
i++;
if(i>200) i=0;
}
上述代码为仍在调试的代码,定时器可以正常工作了,AD还在调试。现对定时器调试关键点说明如下:
1。头文件.// #include "iostm8s105c6.h" 要改为 #include "iostm8s103F3.h" // Very importtant
2。STM8S .h 文件中的#define STM8S105 注释掉,将#define STM8S103 定义,去掉注释。