專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> STM32 >> 瀏覽文章

STM8單片機(jī)ADC、Timer、USART實(shí)用例程

作者:佚名   來(lái)源:來(lái)自唐宗之氣   點(diǎn)擊數(shù):  更新時(shí)間:2014年09月17日   【字體:

       這是一個(gè)我花了較長(zhǎng)時(shí)間摸索出來(lái)的STM8L-051的例程,它控制LED燈,Timer2定時(shí)100us進(jìn)入中斷,軟件啟動(dòng)ADC,采樣10 次后取平均,將結(jié)果通過(guò)UASART發(fā)送至PC機(jī),在超級(jí)終端上顯示的實(shí)用程序,因其內(nèi)存極小,不能用printf等函數(shù),因此對(duì)于想用這款資源極少的MCU的開(kāi)發(fā)者來(lái)說(shuō),讀這篇文章會(huì)大大節(jié)約你的研發(fā)時(shí)間。有不會(huì)的問(wèn)題請(qǐng)發(fā)郵件

 
 
 
#include
 
#include "stm8l15x.h"
 
#include "iostm8l051f3.h"
 
 
 
#define LED_GPIO_PORT  GPIOA
 
#define LED_GPIO_PINS  GPIO_Pin_2 | GPIO_Pin_3
 
 
 
#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)
 
#define SampleADC              ((uint8_t) 0x0A)   
 
uint8_t Buffer[4]  = {0, 0, 0, 0};
 
uint16_t ADCdata = 0;
 
uint16_t ADCvalue = 0;
 
unsigned char LED =1;
 
unsigned char c = 8;
 
uint16_t   acode = 1234; //43 "+" 0x2B;
 
 
 
void Delay(__IO uint16_t nCount)
 
{
 
 
 
  while (nCount != 0)
 
  {
 
    nCount--;
 
  }
 
}
 
 
 
//int putchar(int c) 
 
//{ 
 
//  while ((USART1_SR&0x80)==0x00);
 
//  UART2_sendchar((u8)c);
 
//  return (c); 
 
//}
 
 
 
static void CLK_Config(void)
 
{
 
 
 
  CLK_SYSCLKSourceSwitchCmd(ENABLE);
 
  CLK_SYSCLKSourceConfig(CLK_SYSCLKSource_HSI);
 
 
 
 
 
  CLK_SYSCLKDivConfig(CLK_SYSCLKDiv_1);
 
 
 
  while (CLK_GetSYSCLKSource() != CLK_SYSCLKSource_HSI)
 
  {}
 
 
 
 
 
  CLK_PeripheralClockConfig(CLK_Peripheral_ADC1, ENABLE);
 
 
 
 
 
 // CLK_PeripheralClockConfig(CLK_Peripheral_DMA1, ENABLE);
 
 
 
 
 
  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 = 0x27; //risign edge, trigger 3, sampling time 384
 
  ADC1_CR3 = 0x10; //16channel
 
  //  ADC_ChannelCmd(ADC1, ADC_Channel_17, ENABLE);
 
}
 
 
 
void TIM2_Config(void)
 
{
 
  TIM2_PSCR = 0x07;  // 應(yīng)是16,但只能置三位,所以是111  fCK_PSC / 2(PSC[2:0]).
 
  // TIM2_PSCRL = 0x3F;  // PSCR=0x1F3F,f=8M/(0x1F3F+1)=1000Hz,每個(gè)計(jì)數(shù)周期1ms
 
  TIM2_ARRH = 0x00;  // 自動(dòng)重載寄存器ARR=0x01F4=500
 
  TIM2_ARRL = 0x18;  // 24X4us=96us   每記數(shù)500次產(chǎn)生一次中斷,即500ms
 
  TIM2_IER = 0x01;   // 允許更新中斷
 
  TIM2_CR1 = 0x05;   // 計(jì)數(shù)器使能,開(kāi)始計(jì)數(shù),只允許更新中斷請(qǐng)求
 
}
 
 
 
void Delay (uint16_t nCount);
 
 
 
//#pragma   vector = ADC1_EOC_vector
 
//__interrupt  void  ADC1_EOC(void)
 
//{
 
//     ADCdata = ADC_GetConversionValue(ADC1);
 
// }
 
 
 
#pragma vector =TIM2_OVR_UIF_vector
 
__interrupt void TIM2_OVR_UIF(void)
 
{
 
    asm("sim");
 
    static uint8_t measurements = SampleADC;
 
    static uint32_t accumulator = 0;
 
    uint32_t average = 0;
 
    uint16_t factor10 = 1000;
 
    int8_t i ;
 
    ADCdata = 0;
 
    TIM2_SR1 = 0x00; //Clear UIF
 
    ADC1_SR = 0x00;  //Clear EOC
 
    ADC1_CR1 = 0x03; // EOC interrupt unable, software set start, ADC enable
 
  //  while (!(ADC1_SR & 0x01));
 
 
 
 
 
    Delay(0x000F);
 
    ADCdata = (uint16_t)(ADC1_DRH);
 
    ADCdata = (uint16_t)((uint16_t)((uint16_t)ADCdata << 8) | ADC1_DRL);
 
    accumulator += ADCdata;
 
    if(measurements == 0)
 
    {
 
        LED= !LED;
 
        measurements = SampleADC;
 
        average = accumulator/SampleADC;
 
        ADCvalue = (uint16_t)((uint32_t)((uint32_t)average * (uint32_t)ADC_RATIO) / (uint32_t)1000);
 
        accumulator = 0;
 
        while(!USART1_SR_TXE);
 
        for (i = 3; i >= 0; i--)
 
        {
 
           Buffer[i] = (ADCvalue/factor10) % 10 + 48; //提取十進(jìn)制每一位,并轉(zhuǎn)換成ASCII碼
 
           factor10 = factor10 / 10;
 
           while(!USART1_SR_TXE);
 
           USART1_DR = Buffer[i];  //發(fā)送每一位,先發(fā)高位
 
         }
 
        while(!USART1_SR_TXE);
 
        USART1_DR = 32;  //發(fā)送空格
 
     }
 
    measurements--;
 
    asm("rim");
 
}
 
 
 
void main(void)
 
{
 
   asm("sim");
 
   
 
   GPIO_Config();
 
 
 
   GPIO_Init(LED_GPIO_PORT, LED_GPIO_PINS, GPIO_Mode_Out_PP_Low_Fast);
 
 
 
   CLK_Config();
 
 
 
   ADC_Config();
 
 
 
   TIM2_Config();
 
 
 
   USART1_Config();
 
   
 
   //DMA_Config();
 
 
 
   asm("rim");
 
 
 
   while (1) {  
 
     PA_ODR_ODR2 = LED;
 
     PA_ODR_ODR3 = LED; }
 
 
 
}
關(guān)閉窗口

相關(guān)文章