|
楼主 |
发表于 2009-3-31 21:24:58
|
显示全部楼层
相关代码
#include "stm8s.h"
#include "stm8s207r.h"
#include "lcd_19264.h"
#include "key.h"
void LCD_Clear(void);
void TIM1_Init(void);
void ADC_Init(void);
void LCD_DrawInterface(void);
#define ADC_BUFFER_SIZE 128
#define FMASTER (16000000UL)
#define TIM1_200K_ARR (FMASTER/200000UL - 1)
volatile u8 flag_2ms_ok, flag_10ms_ok;
volatile u8 flag_adcbuf_full;
volatile u8 TriggerVoltage = 128;
u8 ADC_Buffer[ADC_BUFFER_SIZE];
volatile u8 ADC_Index;
void main(void)
{
u8 j = 0, i;
u8 keycode;
int timer5s_counter = 0;
CLK_Init();
TIM4_DeInit();
/* Time base configuration */
TIM4_TimeBaseInit(TIM4_PRESCALER_128, 250);
TIM4_ITConfig(TIM4_IT_UPDATE, ENABLE);
GPIO_Init( GPIOD, GPIO_PIN_3, GPIO_MODE_OUT_PP_LOW_FAST);
LCD_Init();
TIM1_Init();
ADC_Init();
enableInterrupts();
TIM4_Cmd(ENABLE);
/* Infinite loop */
while (1)
{
if(flag_10ms_ok)
{
flag_10ms_ok = 0;
keycode = KEY_Scan();
// Parse keycode
}
if( flag_adcbuf_full == 1)
{
LCD_DrawInterface();
for( i = 0 ; i < 128; i++ )
LCD_BufferDrawLine(i, ADC_Buffer>>2, i+1, ADC_Buffer[i+1]>>2, LCD_SET);
flag_adcbuf_full = 0;
LCD_BufferToLCD();
}
}
}
void CLK_Init(void)
{
/* Configure HSI prescaler*/
CLK_CKDIVR &= ~0x10; /* 01: fHSI= fHSI RC output/2. */
/* Configure CPU clock prescaler */
// CLK_CKDIVR |= 0x01; /* 001: fCPU=fMASTER/2. */
CLK_CKDIVR = 0;
}
void TIM1_Init(void)
{
TIM1_DeInit();
/* Time base configuration */
/*
TIM1_Period = TIM1_200K_ARR
TIM1_Prescaler = 0
TIM1_RepetitionCounter=0
*/
TIM1_TimeBaseInit(0, TIM1_COUNTERMODE_UP, TIM1_200K_ARR, 0);
/* Configure the TIM1 Master/Slave mode */
TIM1_SelectMasterSlaveMode(ENABLE);
/* Trigger the conversion */
TIM1_SelectOutputTrigger(TIM1_TRGOSOURCE_UPDATE);
TIM1_Cmd(ENABLE);
}
void ADC_Init(void)
{
/* Init GPIO for ADC2 */
GPIO_Init(GPIOE, GPIO_PIN_6, GPIO_MODE_IN_FL_NO_IT);
ADC2_DeInit();
ADC2_Init( ADC2_CONVERSIONMODE_SINGLE,
ADC2_CHANNEL_9,
ADC2_PRESSEL_FCPU_D6,
ADC2_EXTTRIG_TIM,
ENABLE,
ADC2_ALIGN_LEFT,
ADC2_SCHMITTTRIG_CHANNEL9,
DISABLE /* SchmittTrigger Disable */
);
/* Enable the ADC2 peripheral */
ADC2_Cmd(ENABLE);
/* Enable EOC interrupt */
ADC2_ITConfig(ENABLE);
/*Configure the ADC2 external trigger */
ADC2_ExternalTriggerConfig(ADC2_EXTTRIG_TIM, ENABLE);
}
void LCD_DrawInterface(void)
{
u8 i;
LCD_Clear();
for(i = 0; i < 64; i+=16)
LCD_BufferDrawXDotLine(0, i, 128, LCD_SET);
for(i = 0; i <129; i+=16)
LCD_BufferDrawYDotLine(i, 0, 63, LCD_SET);
LCD_PutString5x8(22, 0, "STM8 DSO");
LCD_PutString5x8(22, 1, "2000Hz");
}
ADC采样中断
extern u8 flag_adcbuf_full;
extern u8 ADC_Buffer[];
extern u8 ADC_Index;
extern u8 TriggerVoltage;
#define ADC_BUFFER_SIZE 128
@far @interrupt void ADC2_IRQHandler (void)
{
static u8 begin_soft_trigger = 1;
static u8 PreValue = 0;
u8 Conversion_Value = ADC2->DRH; // 只读取高8位结果
if( begin_soft_trigger )
{
if( PreValue <= TriggerVoltage && Conversion_Value > TriggerVoltage )
{
// 满足幅度为TriggerVolatage,且为上升沿
begin_soft_trigger = 0;
}
else
PreValue = Conversion_Value;
}
if( !flag_adcbuf_full )
{
ADC_Buffer[ADC_Index++] = Conversion_Value;
if(ADC_Index >= ADC_BUFFER_SIZE)
{
flag_adcbuf_full = TRUE;
ADC_Index = 0;
begin_soft_trigger = 1;
}
}
ADC2_ClearITPendingBit();
} |
|