打印
[STM8]

STM8S003F3P6

[复制链接]
2378|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
billbillqaz|  楼主 | 2016-4-28 15:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
谁用过这个STM8S003F3P6单片机,求例子啊!
沙发
598330983| | 2016-4-28 19:54 | 只看该作者
这跟其他的STM8没有什么两样的。

使用特权

评论回复
板凳
598330983| | 2016-4-28 19:58 | 只看该作者
/**
  ******************************************************************************
  * @file main.c
  * @brief Displaying variable voltage on a bar of LEDs Application example.
  * @author STMicroelectronics - MCD Application Team
  * @version 2.0.0
  * @date 15-MAR-2011
  ******************************************************************************
  *
  * THE PRESENT SOFTWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
  * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
  * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
  * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
  * FROM THE CONTENT OF SUCH SOFTWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
  * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
  *
  * <h2><center>&copy; COPYRIGHT 2009 STMicroelectronics</center></h2>
  * @image html **.bmp
  ******************************************************************************
  */

/* Includes ------------------------------------------------------------------*/
#include "stm8s.h"                // file needed only for registers mask
#include "parameter.h"
/**
  * @addtogroup ADC1_Example1
  * @{
  */

/* Private typedef -----------------------------------------------------------*/

/* Private define ------------------------------------------------------------*/

#define ALL_LEDs ((u8)0x0F)                                // LEDs mask

/* Private macro -------------------------------------------------------------*/

#define switch_all_LEDs_on                { GPIOB->ODR|= ALL_LEDs; }        //LEDs control : all on
#define switch_all_LEDs_off          { GPIOB->ODR&=~ALL_LEDs; }    //LEDs control : all off

/* Private variables ---------------------------------------------------------*/
        u8  temp_AD_H;                                           // temporary registers for reading ADC result (MSB)
        u8  temp_AD_L;             // temporary registers for reading ADC result (LSB)
        u8        ADInit;                                                     // flag for ADC initialized
        u8        ADSampRdy;                                     // flag for filed of samples ready
        u8  AD_samp;                                                   // counter of stored samples
        u16 AD_sample[NUMB_SAMP];         // store samples field
        u16 AD_avg_value;                                   // average of ADC result
       
        u8 peak_memo;                                             // variables for peak level detector
        u8 peak_filt;                                             // variables for peak level detector*/

/* Private function prototypes -----------------------------------------------*/
/**
  * @brief Count average of samples stored in the u16 field
  * @par Parameters:
  *  *p: pointer to the begin of the field
  * smp: number of samples in the field
  * @retval Average u16 value
  */
u16 u16_average(u16 *p, u8 smp) {
        u8 i;
        u16 sum;
       
        for(i=0, sum= 0; i < smp; ++i)
                sum+= *p++;               
        return sum / smp;
}
/* -------------------------------------------------------------------------- */
/**
  * @brief Prepare data for four LED bar of signal and peak indicator
  * @par Parameters:
  * val: Level of the mesured signal [0-4]
  * @retval 4 bits (low nibble) of the composite bar graph information
  */
u8 signal_and_peak_level(u8 val) {
        u8 signal;
        u8 peak;
       
        switch(val) {
                case 0: peak= 0; signal=  0; break;        //set peak and signal levels
                case 1: peak= 1; signal=  1; break;
                case 2: peak= 2; signal=  3; break;
                case 3: peak= 4; signal=  7; break;
                case 4: peak= 8; signal= 15; break;
                default: peak= signal= 15;
        };
        if(peak_filt == 0) {                                                                        // slow fall of peak level indicator
                if(peak_memo) {
                        peak_memo>>= 1;
                        peak_filt= PEAK_FILTER;
                };
        }
        else
                --peak_filt;
        if(peak >= peak_memo) {                                       // check the highest level value
                peak_memo= peak;                                                 // and copy it to peak indicator
                peak_filt= PEAK_FILTER;                               // with fall speed refresh
        };
        return (signal | peak_memo);                     // return bar graph information
}

/* Public functions ----------------------------------------------------------*/
/**
  * @brief Validation firmware main entry point.
  * @par Parameters:
  * None
  * @retval void None
  */  
void main(void) {
        u8 leds;
//                                                                 *** GPIO INIT ***
        GPIOB->ODR&=~ALL_LEDs;                                 // LEDs - as push-pull outputs, all off
        GPIOB->DDR|= ALL_LEDs;                                //
        GPIOB->CR1|= ALL_LEDs;
       
        GPIOC->DDR|= 0x02;                                                // PC.1 as push-pull outputs
        GPIOC->CR1|= 0x02;
               
        GPIOE->CR1&=~0x40;                                          // PE.6 as a floating input
        GPIOE->DDR&=~0x40;
       
//                                                                 *** ADC INITIALIZATION ***
        TIM1->ARRH= (u8)(AUTORELOAD >> 8);                          // set autoreload register for trigger period
        TIM1->ARRL= (u8)(AUTORELOAD);                                            //
        TIM1->CCR1H= (u8)((AUTORELOAD-AD_STAB) >> 8);   // set compare register for trigger period
        TIM1->CCR1L= (u8)(AUTORELOAD-AD_STAB);
        TIM1->CR1|= TIM1_CR1_ARPE;                                                    // auto reload register is buferred
       
        TIM1->CR2= (4<<4) & TIM1_CR2_MMS;                            // CC1REF is used as TRGO
        TIM1->CCMR1= (6<<4) & TIM1_CCMR_OCM;                  // CC1REF in PWM 1 mode
        TIM1->IER|= TIM1_IER_CC1IE;                                              // CC1 interrupt enable
        TIM1->CCER1|= TIM1_CCER1_CC1P;                                    // CC1 negative polarity
        TIM1->CCER1|= TIM1_CCER1_CC1E;                                    // CC1 output enable
        TIM1->BKR|= TIM1_BKR_MOE;                                                                                               
       
        TIM1->SMCR|=  TIM1_SMCR_MSM;                                            // synchronization of TRGO with ADC
       
        TIM1->CR1|= TIM1_CR1_CEN;                                                      // timer 1 enable
               
        ADC1->CSR= ADC1_CSR_EOCIE | (9 & ADC1_CSR_CH);  // ADC EOC interrupt enable, channel 9
        ADC1->CR1= 4<<4 & ADC1_CR1_SPSEL;                                  // master clock/8, single conversion
        ADC1->CR2= ADC1_CR2_EXTTRIG;                                                  // external trigger on timer 1 TRGO, left alignment
        ADC1->TDRH= 2;                                                                                        // disable Schmitt trigger on AD input 9
        ADC1->TDRL= 0;                                  //

  // init ADC variables
        AD_samp= 0;                                                                          // number of stored samples 0
        ADInit= TRUE;                                   // ADC initialized
        ADSampRdy= FALSE;                               // No sample
       
        ADC1->CR1|= ADC1_CR1_ADON;                                                    // ADC on

        enableInterrupts();                                                                        // enable all interrupts
       
//                                                                 *** MAIN LOOP ***       
        while (1) {
                if (ADSampRdy == TRUE) {                                                     // field of ADC samples is ready?
                        AD_avg_value= u16_average(&AD_sample[0], AD_samp); // average of samples
                       
                        AD_samp= 0;                                                                                         // reinitalize ADC variables
                        ADSampRdy= FALSE;
                                               
                        leds= signal_and_peak_level((u8)((AD_avg_value + 128) / 256)); // setting LED status
                       
                        GPIOB->ODR&= leds | (~ALL_LEDs);        // LEDs settings in according to LED status
                        GPIOB->ODR|= leds;
                };
        };
}
/**
  * @}
  */

/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/


使用特权

评论回复
地板
598330983| | 2016-4-28 20:00 | 只看该作者
stsw-stm8022.zip (1.87 MB)

这有一些例子。

使用特权

评论回复
5
598330983| | 2016-4-28 20:00 | 只看该作者
/**
  ******************************************************************************
  * @file ADC2_example1\main.c
  * @brief This file contains the main function for ADC2 example 1.
  * @author STMicroelectronics, MCD Application Team
  * @version 1.02
  * @date 1-JUN-2009
  ******************************************************************************
  *
  * THE PRESENT SOFTWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
  * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
  * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
  * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
  * FROM THE CONTENT OF SUCH SOFTWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
  * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
  *
  * <h2><center>&copy; COPYRIGHT 2009 STMicroelectronics</center></h2>
  * @image html **.bmp
  ******************************************************************************
  */

/* Includes ------------------------------------------------------------------*/
#include "stm8s.h"

/**
  * @addtogroup ADC2_Example1
  * @{
  */

/* Private typedef -----------------------------------------------------------*/

/* Private define ------------------------------------------------------------*/

#define ALL_LEDs ((u8)0x0F)                                // LEDs mask (EVAL board)

#define AUTORELOAD        0x8000                                //        sampling period definition
#define NUMB_SAMP                8                                                //        number of samples for SW filtering
#define PEAK_FILTER        8                                                // floating spot fall speed filter
#define AD_STAB                20                                                // AD stabilization [TIM1 increments] (~10us)

/* Private macro -------------------------------------------------------------*/

#define switch_all_LEDs_on                { GPIOH->ODR|= ALL_LEDs; }        //LEDs control
#define switch_all_LEDs_off        { GPIOH->ODR&=~ALL_LEDs; }

/* Private variables ---------------------------------------------------------*/

        u8 temp_AD_H;                                        // temporary registers for reading ADC result
        u8 temp_AD_L;
        u8        ADInit;                                                // flag for the first conversion
        u8        ADSampRdy;                                        // flag for filed of samples ready
        u8 AD_samp;                                                // counter of raugh samples
        u16 AD_sample[NUMB_SAMP];        // store field of raugh samples
        u16 AD_avg_value;                                // filtered ADC result
       
        u8 peak_memo;                                        // variables for peak level detector
        u8 peak_filt;                                        // variables for peak level detector

/* Private function prototypes -----------------------------------------------*/
/**
  * @brief Count average of samples stored in the u16 field
  * @par Parameters:
  *  *p: pointer to the begin of the field
  * smp: number of samples in the field
  * @retval Average u16 value
  */
u16 u16_average(u16 *p, u8 smp) {
        u8 i;
        u16 sum;
       
        for(i=0, sum= 0; i < smp; ++i)
                sum+= *p++;               
        return sum / smp;
}
/* -------------------------------------------------------------------------- */
/**
  * @brief Prepare data for four LED bar of signal and peak indicator
  * @par Parameters:
  * val: Level of the mesured signal [0-4]
  * @retval 4 bits (low nibble) of the composite bar graph information
  */
u8 signal_and_peak_level(u8 val) {
        u8 signal;
        u8 peak;
       
        switch(val) {
                case 0: peak= 0; signal=  0; break;        //set peak and signal levels
                case 1: peak= 1; signal=  1; break;
                case 2: peak= 2; signal=  3; break;
                case 3: peak= 4; signal=  7; break;
                case 4: peak= 8; signal= 15; break;
                default: peak= signal= 15;
        };
        if(peak_filt == 0) {                                        // slow fall of peak level indicator
                if(peak_memo) {
                        peak_memo>>= 1;
                        peak_filt= PEAK_FILTER;
                };
        }
        else
                --peak_filt;
        if(peak >= peak_memo) {                                // check the highest level value
                peak_memo= peak;                                        // and copy it to peak indicator
                peak_filt= PEAK_FILTER;                        //    with fall speed refresh
        };
        return (signal | peak_memo);                // composite bar graph information
}
/* -------------------------------------------------------------------------- */
/**
  * @brief ADC interrupt service
  * @par Parameters:
  * None
  * @retval None
  */
#ifdef _COSMIC_
@far @interrupt void ADC2_Interrupt (void) {
#else
void ADC2_Interrupt (void) interrupt 22 {
#endif
        if(ADInit == FALSE  &&  ADSampRdy == FALSE) {
                temp_AD_H= ADC2->DRH;                        // read conversion result (MSB first!)
                temp_AD_L= ADC2->DRL;                        //   an store it to AD samples field
                AD_sample[AD_samp]= ((u16)(temp_AD_H) << 2) | (temp_AD_L & 3);
                if(++AD_samp >= NUMB_SAMP)        // AD_smaple field is full?
                        ADSampRdy= TRUE;                                // YES - set field ready flag for main loop
        }
        else
                ADInit= FALSE;                                        // ignore sample, wait for next one
               
        ADC2->CSR&=~ADC2_CSR_EOC;                        // clear end of conversion flag
        return;
}
/* -------------------------------------------------------------------------- */
/**
  * @brief TIM1 compare 1 interrupt service
  * @par Parameters:
  * None
  * @retval None
  */
#ifdef _COSMIC_
@far @interrupt void TIM1CapCompInterrupt (void) {
#else
void TIM1CapCompInterrupt (void) interrupt 12 {
#endif
        ADC2->CR1|= ADC2_CR1_ADON;                // start waiting for the next conversion trigger
        TIM1->SR1&=~TIM1_SR1_CC1IF;        // clear compare flag
        return;
}
/* Public functions ----------------------------------------------------------*/
/**
  * @brief Validation firmware main entry point.
  * @par Parameters:
  * None
  * @retval void None
  */  
void main(void) {
        u8 leds;
//                                                                 *** GIO INIT ***
        GPIOH->ODR&=~ALL_LEDs;                                 // LEDs - as push-pull outputs, all off
        GPIOH->DDR|= ALL_LEDs;                                //
        GPIOH->CR1|= ALL_LEDs;
               
        GPIOE->CR1&=~0x40;                                        // PE.6 as a floating input
        GPIOE->DDR&=~0x40;
       
//                                                                 *** ADC INITIALIZATION ***
        TIM1->ARRH= (u8)(AUTORELOAD >> 8);                // init sampling period and pulse wide
        TIM1->ARRL= (u8)(AUTORELOAD);                                //                auto reload register
        TIM1->CCR1H= (u8)((AUTORELOAD-AD_STAB) >> 8);// compare register
        TIM1->CCR1L= (u8)(AUTORELOAD-AD_STAB);
        TIM1->CR1|= TIM1_CR1_ARPE;                                        // auto reload register is buferred
       
        TIM1->CR2= (4<<4) & TIM1_CR2_MMS;                // CC1REF is used as TRGO
        TIM1->CCMR1= (6<<4) & TIM1_CCMR_OCM;        // CC1REF in PWM 1 mode
        TIM1->IER|= TIM1_IER_CC1IE;                                // CC1 interrupt enable
        TIM1->CCER1|= TIM1_CCER1_CC1P;                        // OC1 negative polarity
        TIM1->CCER1|= TIM1_CCER1_CC1E;                        // OC1 output enable
        TIM1->BKR|= TIM1_BKR_MOE;
       
        TIM1->SMCR|=  TIM1_SMCR_MSM;                                // synchronization of TRGO with ADC
       
        TIM1->CR1|= TIM1_CR1_CEN;                                        // timer 1 enable
               
        ADC2->CSR= ADC2_CSR_EOCIE | (9 & ADC2_CSR_CH); // ADC EOC interrupt enable, channel 9
        ADC2->CR1= 4<<4 & ADC2_CR1_SPSEL;                        // master clock/8, single conversion
        ADC2->CR2= ADC2_CR2_EXTTRIG;                                        // external trigger on timer 1 TRGO, left alignment
        ADC2->TDRH= 2;                                                                        // disable Schmitt trigger on AD input 9
        ADC2->TDRL= 0;

        AD_samp= 0;                                                                                // init ADC variables
        ADInit= TRUE;
        ADSampRdy= FALSE;
       
        ADC2->CR1|= ADC2_CR1_ADON;                                        // ADC on

        enableInterrupts();                                                        // all interrupts enable
       
//                                                                 *** MAIN LOOP ***       
        while (1) {
                if (ADSampRdy == TRUE) {                                // field of ADC samples is ready?
                        AD_avg_value= u16_average(&AD_sample[0], AD_samp); // average of samples
                       
                        AD_samp= 0;                                                                // start new ADC reading cycle
                        ADSampRdy= FALSE;
                                               
                        leds= signal_and_peak_level((u8)((AD_avg_value + 128) / 256));
                       
                        GPIOH->ODR&= leds | (~ALL_LEDs);        // LEDs settings in according with signal level
                        GPIOH->ODR|= leds;
                };
        };
}
/**
  * @}
  */

/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/


使用特权

评论回复
6
598330983| | 2016-4-28 20:01 | 只看该作者
/**
  ******************************************************************************
  * @file ADC2_example2\main.c
  * @brief This file contains the main function for ADC2 example 2.
  * @author STMicroelectronics, MCD Application Team
  * @version 1.02
  * @date 1-JUN-2009
  ******************************************************************************
  *
  * THE PRESENT SOFTWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
  * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
  * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
  * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
  * FROM THE CONTENT OF SUCH SOFTWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
  * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
  *
  * <h2><center>© COPYRIGHT 2008 STMicroelectronics</center></h2>
  * @image html **.bmp
  ******************************************************************************
  */

/* Includes ------------------------------------------------------------------*/
#include "stm8s.h"

/**
  * @addtogroup ADC2_Example2
  * @{
  */

/* Private typedef -----------------------------------------------------------*/

/* Private define ------------------------------------------------------------*/

#define ALL_LEDs ((u8)0x0F)        // LEDs mask (EVAL board)

#define PEAK_FILTER        1500                // floating spot fall speed filter

/* Private macro -------------------------------------------------------------*/

#define switch_all_LEDs_on                { GPIOH->ODR|= ALL_LEDs; }
#define switch_all_LEDs_off        { GPIOH->ODR&=~ALL_LEDs; }

/* Private variables ---------------------------------------------------------*/

        u8 temp_AD_L;                                        // temporary registers for reading ADC result
        u8        ADSampRdy;                                        // flag for filed of samples ready
        u8 AD_sample;                                        // stored sample
       
        u8 peak_memo;                                        // variables for peak level detector
        u16 peak_filt;                                        // variables for peak level detector

/* Private function prototypes -----------------------------------------------*/
/**
  * @brief Prepare data for four LED bar of signal and peak indicator
  * @par Parameters:
  * val: Level of the mesured signal [0-4]
  * @retval 4 bits (low nibble) of the composite bar graph information
  */
u8 signal_and_peak_level(u8 val) {        // set 4-level signal and peak indicator
        u8 signal;
        u8 peak;
       
        switch(val) {
                case 0: peak= 0; signal=  0; break;        //set peak and signal levels
                case 1: peak= 1; signal=  1; break;
                case 2: peak= 2; signal=  3; break;
                case 3: peak= 4; signal=  7; break;
                case 4: peak= 8; signal= 15; break;
                default: peak= signal= 15;
        };
        if(peak_filt == 0) {                                        // slow fall of peak level indicator
                if(peak_memo) {
                        peak_memo>>= 1;
                        peak_filt= PEAK_FILTER;
                };
        }
        else
                --peak_filt;
        if(peak >= peak_memo) {                                // check the highest level value
                peak_memo= peak;                                        // and copy it to peak indicator
                peak_filt= PEAK_FILTER;                        //    with fall speed refresh
        };
        return (signal | peak_memo);                // composite bar graph information
}
/* -------------------------------------------------------------------------- */
/**
  * @brief Programable loop delay
  * @par Parameters:
  * wt: number of waiting loops
  * @retval None
  */
void delay_loop(u8 wt) {
        while(wt--);
}
/* -------------------------------------------------------------------------- */
/**
  * @brief ADC interrupt service
  * @par Parameters:
  * None
  * @retval None
  */
#ifdef _COSMIC_
@far @interrupt void ADC2_Interrupt (void) {
#else
void ADC2_Interrupt (void) interrupt 22 {
#endif
        AD_sample= ADC2->DRH;                                // read conversion result (MSB first!)
        temp_AD_L= ADC2->DRL;                                //   an store it to AD_sample variable
        ADC2->CSR&=~ADC2_CSR_EOC;                        // clear end of conversion flag
        ADSampRdy= TRUE;                                        // set sample ready flag for main loop
        return;
}
/* Public functions ----------------------------------------------------------*/
/**
  * @brief Validation firmware main entry point.
  * @par Parameters:
  * None
  * @retval None
   */
  
void main(void) {
        u8 leds;
//                                                                 *** GIO INIT ***
        GPIOH->ODR&=~ALL_LEDs;                                 // LEDs - as push-pull outputs, all off
        GPIOH->DDR|= ALL_LEDs;                                //
        GPIOH->CR1|= ALL_LEDs;
               
        GPIOF->CR1&=~4;                                                // PF.3 as a floating input
        GPIOF->DDR&=~4;
       
//                                                                 *** ADC INITIALIZATION ***               
        ADC2->CSR= ADC2_CSR_EOCIE | (11 & ADC2_CSR_CH); // AD interrupt enable, channel 11       
        ADC2->CR1|= ADC2_CR1_CONT | ((7<<4) & ADC2_CR1_SPSEL); // continuous conversion mode, fmaster/18
        ADC2->TDRH= 8;                                                                        // disable Schmitt trigger on AD input 11
        ADC2->TDRL= 0;
       
        ADC2->CR1|= ADC2_CR1_ADON;                                        // ADC on
        delay_loop(20);                                                                // wait for stabilization (min 7 us)
        ADC2->CR1|= ADC2_CR1_ADON;

        ADSampRdy= FALSE;                                                                // init ADC variables
       
        enableInterrupts();                                                        // all interrupts enable
       
//                                                                 *** MAIN LOOP ***       
        while (1) {
                if (ADSampRdy == TRUE) {                                // Is ADC sample ready?               
                        leds= signal_and_peak_level((u8)(((u16)AD_sample + 15) >> 6));
                        GPIOH->ODR&= leds;                                // LEDs settings in according with signal level
                        GPIOH->ODR|= leds;
                        ADSampRdy= FALSE;
                };
        };
}
/**
  * @}
  */

/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/


使用特权

评论回复
7
598330983| | 2016-4-28 20:05 | 只看该作者
/**
  ******************************************************************************
  * @file UART3_example1\main.c
  * @brief This file contains the main function for UART3 example 1.
  * @author STMicroelectronics, MCD Application Team
  * @version 1.02
  * @date 1-JUN-2009
  ******************************************************************************
  *
  * THE PRESENT SOFTWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
  * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
  * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
  * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
  * FROM THE CONTENT OF SUCH SOFTWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
  * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
  *
  * <h2><center>© COPYRIGHT 2009 STMicroelectronics</center></h2>
  * @image html **.bmp
  ******************************************************************************
  */

/* Includes ------------------------------------------------------------------*/
#include "stm8s.h"

/**
  * @addtogroup UART3_Example1
  * @{
  */

/* Private typedef -----------------------------------------------------------*/

/* Private define ------------------------------------------------------------*/

#define ALL_LEDs ((u8)0x0F)                                // LEDs mask  (EVAL board)

/* Private macro -------------------------------------------------------------*/

#define switch_all_LEDs_on                { GPIOH->ODR|= ALL_LEDs; }
#define switch_all_LEDs_off        { GPIOH->ODR&=~ALL_LEDs; }

#define        data_not_correctly_received         (((sts & 0x0F) != 0)  ||  tx_byte != rx_byte)
#define        no_data_received                                         ((sts & UART3_SR_RXNE) == 0)

/* Private variables ---------------------------------------------------------*/

        u8 sts;                                // status register copy
        u8 tx_byte;                        // transmited data byte
        u8 rx_byte;                        // received data byte
       
/* Private function prototypes -----------------------------------------------*/
/**
  * @brief Programable loop delay
  * @par Parameters:
  * wt: number of loops
  * @retval None
  */
void delay_loop(u16 wt) {
        while(wt--);
}
/* Public functions ----------------------------------------------------------*/
/**
  * @brief Validation firmware main entry point.
  * @par Parameters:
  * None
  * @retval void None
  */
  
void main(void) {
//                                                                 *** GIO INIT ***
        GPIOH->ODR&=~ALL_LEDs;                                                 // LEDs - as push-pull outputs, all off
        GPIOH->DDR|= ALL_LEDs;
        GPIOH->CR1|= ALL_LEDs;

//                                                                 *** UART3 INITIALIZATION ***
        UART3->CR1&=~UART3_CR1_M;                                        // 8 data bits
        UART3->CR3|= (0<<4) & UART3_CR3_STOP;        // 1 stop bit
        UART3->BRR2= 3 & UART3_BRR2_DIVF;                //57600 Bd
        UART3->BRR1= 2;
        UART3->CR2|= UART3_CR2_TEN | UART3_CR2_REN; // transmit & receive enable

        tx_byte= 0;                                                                                // init the data byte
       
//                                                                 *** MAIN LOOP ***       
        while (1) {                                                                                                // test loop
                switch_all_LEDs_on;                                                                        // LEDs on
                UART3->DR= tx_byte;                                                                        // send a byte
                while((UART3->SR & UART3_SR_TC) == 0);                        // wait for its transmition complete
                delay_loop(0);                                                                                        // dummy loop
                sts= UART3->SR;                                                                                // read status register
                rx_byte= UART3->DR;                                                                        // read data register
                if(no_data_received  ||  data_not_correctly_received) // check content of the status & data registers
                        switch_all_LEDs_off                                                                // LEDs off if the data byte isn't correctly received
                delay_loop(10000);                                                                        // let the LEDs indication be observed
                ++tx_byte;                                                                                                // data byte change
        };
}
/**
  * @}
  */

/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/


使用特权

评论回复
8
598330983| | 2016-4-28 20:06 | 只看该作者
STM8S优化的示例包
stsw-stm8026.zip (314.37 KB)



使用特权

评论回复
9
robter| | 2016-4-29 10:58 | 只看该作者
598330983 发表于 2016-4-28 19:58
/**
  ******************************************************************************
  * @file main. ...

很好很好,学习了

使用特权

评论回复
10
cnb12345| | 2016-4-29 15:44 | 只看该作者

使用特权

评论回复
11
wahahaheihei| | 2016-4-29 19:42 | 只看该作者
void delay_loop(u16 wt) {
        while(wt--);
}
原来官方定义的这个延时函数用的是while。

使用特权

评论回复
12
billbillqaz|  楼主 | 2016-5-16 14:05 | 只看该作者
598330983 发表于 2016-4-28 19:54
这跟其他的STM8没有什么两样的。

STM8可以用KEIL 来写吗?

使用特权

评论回复
13
billbillqaz|  楼主 | 2016-5-16 14:05 | 只看该作者

谢谢啊!

使用特权

评论回复
14
billbillqaz|  楼主 | 2016-5-16 14:06 | 只看该作者
598330983 发表于 2016-4-28 19:58
/**
  ******************************************************************************
  * @file main. ...

谢谢啊,辛苦你了!

使用特权

评论回复
15
billbillqaz|  楼主 | 2016-5-16 14:07 | 只看该作者
598330983 发表于 2016-4-28 20:06
STM8S优化的示例包

STM8可以用KEIL来编写吗?

使用特权

评论回复
16
desertsailor| | 2016-5-17 21:02 | 只看该作者
billbillqaz 发表于 2016-5-16 14:07
STM8可以用KEIL来编写吗?

keil不支持,要用IAR或STVD

使用特权

评论回复
17
billbillqaz|  楼主 | 2016-5-18 15:06 | 只看该作者
desertsailor 发表于 2016-5-17 21:02
keil不支持,要用IAR或STVD

哎,不想用IAR啊

使用特权

评论回复
18
billbillqaz|  楼主 | 2016-8-5 10:30 | 只看该作者
desertsailor 发表于 2016-5-17 21:02
keil不支持,要用IAR或STVD

你有IAR for arm  吗?

使用特权

评论回复
19
desertsailor| | 2016-8-5 23:44 | 只看该作者
billbillqaz 发表于 2016-8-5 10:30
你有IAR for arm  吗?

网上大把的

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

112

主题

191

帖子

2

粉丝