STM8 单片机ADC、Timer、USART实用例程
        这是一个我花了较长时间摸索出来的STM8L-051的例程,它控制LED灯,Timer2定时100us进入中断,软件启动ADC,采样10 次后取平均,将结果通过UASART发送至PC机,在超级终端上显示的实用程序,因其内存极小,不能用printf等函数,因此对于想用这款资源极少的MCU的开发者来说,读这篇文章会大大节约你的研发时间。有不会的问题请发邮件***************
#include <stdio.h>
#include "stm8l15x.h"
#include "iostm8l051f3.h"
#define LED_GPIO_PORT  GPIOA
#define LED_GPIO_PINS  GPIO_Pin_2 | GPIO_Pin_3
/* Private function prototypes -----------------------------------------------*/
#define ADC1_DR_ADDRESS        ((uint16_t)0x5344)
#define BUFFER_SIZE            ((uint8_t) 0x02)
#define BUFFER_ADDRESS        ((uint16_t)(&Buffer))
#define ASCII_NUM_0            ((uint8_t)  48)
#define ADC_RATIO              ((uint16_t) 806) /*ADC_RATIO = ( 3.3 * 1000 * 1000)/4095*/
#define SampleADC              ((uint8_t) 0x0A)   
/* Private variables ---------------------------------------------------------*/
uint8_t Buffer[4]  = {0, 0, 0, 0};
uint16_t ADCdata = 0;
uint16_t ADCvalue = 0;
unsigned char LED =1;
unsigned char c = 8;
单片机printf函数uint16_t  acode = 1234; //43 "+" 0x2B;
void Delay(__IO uint16_t nCount)
{
  /* Decrement nCount value */
  while (nCount != 0)
  {
    nCount--;
  }
}
//int putchar(int c) 
//{ 
//  while ((USART1_SR&0x80)==0x00);
//  UART2_sendchar((u8)c);
//  return (c); 
//}
static void CLK_Config(void)
{
  /* Select HSI as system clock source */
  CLK_SYSCLKSourceSwitchCmd(ENABLE);
  CLK_SYSCLKSourceConfig(CLK_SYSCLKSource_HSI);
 
  /*High speed external clock prescaler: 1*/
  CLK_SYSCLKDivConfig(CLK_SYSCLKDiv_1);
  while (CLK_GetSYSCLKSource() != CLK_SYSCLKSource_HSI)
  {}
  /* Enable ADC1 clock */
  CLK_PeripheralClockConfig(CLK_Peripheral_ADC1, ENABLE);
  /* Enable DMA1 clock */
// CLK_PeripheralClockConfig(CLK_Peripheral_DMA1, ENABLE);
  /* Enable TIM2 clock */
  CLK_PeripheralClockConfig(CLK_Peripheral_TIM2, ENABLE);
  CLK_PeripheralClockConfig(CLK_Peripheral_USART1, ENABLE);
}
static void GPIO_Config(void)
{
  PC_DDR = 0X20;
  PC_CR1 = 0X20;
  PA_DDR = 0X0C;
  PA_CR1 = 0X0C;
}
static void USART1_Config(void)
{
// ADCvalue = USART1_DR;
  USART1_BRR2 = 0x03;
  USART1_BRR1 = 0x68;  //16M/9600=683
  USART1_CR2 = 0x0C;  //Transmitter & receiver enable
}
static void ADC_Config(void)
{
  ADC1_CR2 = 0x22;  //risign edge, softwae start, sampling time 16 ADC clock
  ADC1_SQR3 = 0x80;  //ADC = 15channel
  ADC1_TRIGR1 = 0x10; //use internal ref,sampling time 16 ADC clock for Ref
  RI_ASCR1 = 0x00;
}
void TIM2_Config(void)
{
  TIM2_PSCR = 0x07;  // 应是16,但只能置三位,所以是111  fCK_PSC / 2(PSC[2:0]).
  // TIM2_PSCRL = 0x3F;  // PSCR=0x1F3F,f=8M/(0x1F3F+1)=1000Hz,每个计数周期1ms