⑴ STM8 ADC_CR1;ADC_CR2;這個是什麼意思呢
ADC_CR1= 0x02; //這里設置分頻系數為2 連續轉換模式 先禁止ADC轉換
ADC_CR2=0x08; //設置數據右對齊 禁止掃描模式
STM8模擬/數字轉換器(ADC)簡介
ADC1和ADC2是10位的逐次比較型模擬數字轉換器。提供多達16個多功能的輸入通道(實際准確的通道數量在數據手冊的引腳描述說明)。A/D轉換的各個通道可以執行單次和連續的轉換模式。
相對於ADC2,ADC1具有一些擴展功能,包括掃描模式,帶緩存的連續模式以及模擬看門狗。
請參考STM8數據手冊來了解不同產品型號的ADC1和ADC2的功能信息。
主要特點
ADC1和ADC2的功能如下:
10位的解析度
單次和連續的轉換模式
可編程的(轉換頻率的)預分頻:fMASTER可以被分頻2到18
可以選擇ADC專用外部中斷(ADC_ETR)或者定時器觸發信號(TRGO)來作為外部觸發信號
模擬放大(對於具有VREF引腳的型號)
轉換結束時可產生中斷
靈活的數據對齊方式
ADC輸入電壓范圍:VSSA≤VIN≤VDDA
擴展(增強)功能
ADC1具有以下擴展功能:
帶緩沖的連續轉換模式(1)
單次和連續轉換的掃描模式
具有上限和下限門檻的模擬看門狗
模擬看門狗事件發生可產生中斷
⑵ stm8配置位元組一般怎麼設置好
如果FLASH空間允許,可以在程序里加入對配置位元組進行IAP編程的部分,這樣就只需要燒寫FLASH,然後程序自己對配置位元組進行配置。
⑶ 有誰精通stm8, 我有一個編程的問題要請教,能否留下QQ指導下 謝謝
最近用STM8S,請問什麼問題。
⑷ 本人正在學習stm8,使用IAR編程,求代碼把蜂鳴器弄響
你用的是「 ST MCU 三合一體驗套件 」 裡面的那套STM8S的開發板嚒·?
如果是的話可以參考以下常式:是在微雪電子那采購的官方套件光碟中的示常式序,不知道能不能幫到你! 有分的話給點分用用,嘿嘿!
/*============================================================================*/
/* PROJECT: DRIVING BUZZER THROUGH STM8 TIMER2 PWM DEMO SYSTEM */
/* MODULE: main.c */
/* COMPILER: STM8 Cosmic C Compiler */
/* DATE: Feb 2009 */
/*----------------------------------------------------------------------------*/
/* DESCRIPTION: Demonstration firmware for STM8 Mini Kit */
/* playing a tune through its buzzer. */
/*============================================================================*/
/******************************************************************************
*
* THE PRESENT FIRMWARE 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 FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
*
* COPYRIGHT 2008 STMicroelectronics
******************************************************************************
*/
/* Includes ------------------------------------------------------------------*/
#include "STM8S105C_S.h" /* Registers and memory mapping file. */
/******************************************************************************/
/* Macro definitions
/******************************************************************************/
/* Music instruction and note coding. */
#define _END_ 0xFF /* Music END. */
#define _PAUSE_ 0xFE /* Pause between different tunes. */
/* Note tone definition...... */
#define _FA0 0x00 /* FA- */
#define _SOL0 0x01 /* SOL- */
#define _LA0 0x02 /* LA- */
#define _SI0 0x03 /* SI- */
#define _DO 0x04 /* DO */
#define _RE 0x05 /* RE */
#define _MI 0x06 /* MI */
#define _FA 0x07 /* FA */
#define _SOL 0x08 /* SOL */
#define _LA 0x09 /* LA */
#define _SI 0x0A /* SI */
#define _DO2 0x0B /* DO+ */
#define _M 0x0C /* MUTE */
#define _RE2 0x0D /* RE+ */
#define _SOL2 0x0E /* SOL+ */
#define _FAd 0x0F /* FA# */
/* Note length definition...... */
#define sq 0x10 /* Semiquaver notes. */
#define q 0x20 /* Quaver notes. */
#define qp 0x30 /* 1.5 quaver notes. */
#define c 0x40 /* Crotchet notes. */
#define cn 0x60 /* 1.5 crotchet notes.*/
#define m 0x80 /* Minim notes. */
/*a note is defined here by a combination of a tone and a length, both parts
being easily retrievable with the AND binary operator: note = tone+length,
and tone&length=0*/
/******************************************************************************/
/* RAM SEGMENT variables */
/******************************************************************************/
/* Global variable used to store the ADC result. */
unsigned int AD_Value;
/* Global variable used to store the Key pressed for changing octave. */
unsigned char Flag_Octave_Chg;
/* Global variable used as index for the array of notes: position in the tune.*/
unsigned int current_note = 0;
/* Global variable used as index for the array of notes. */
unsigned char c1,c1_buf;
/* Music note coding ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
/* FA0 SOL0 LA0 SI0 DO RE MI FA SOL LA SI DO2 MUTE RE2 SOL2 FA# */
/* TIM2 CCR1 High byte. */
const unsigned char Low_Note_h[] /* Lower octave */
={0x2C,0x27,0x23,0x1F,0x1D,0x1A,0x17,0x16,0x13,0x11,0x0F,0x0E,0x00, 0x0D, 0x09, 0x15 };
const unsigned char Hi_Note_h[] /* Higher octave */
={0x16,0x13,0x11,0x0F,0x0E,0x0D,0x0B,0x0B,0x09,0x08,0x07,0x07,0x00, 0x06, 0x04, 0x0A };
/* TIM2 CCR1 Low byte. */
const unsigned char Low_Note_l[] /* Lower octave */
={0xA4,0xDC,0x82,0xA1,0xEE,0xA9,0xAC,0x62,0xEE,0xC1,0xD0,0xF0,0x00, 0x4F, 0xF7, 0x2C };
const unsigned char Hi_Note_l[] /* Higher octave */
={0x52,0xEE,0xC1,0xD0,0xF7,0x54,0xD6,0x31,0xF7,0xE0,0xE8,0x78,0x00, 0xA7, 0xFB, 0x96 };
/* The actual tune sequence: an array of notes. */
const unsigned char tune[] =
{
_M+sq, _M+sq, /* Two "buffer" mutes needed to manage smoothly the */
/* current_note/current_note_init comparison. */
/*------------------ DO RE MI FA SOL LA SI DO2 --------------------------*/
/*------------------ DO2 SI LA SOL FA MI RE DO --------------------------*/
_DO+c,_RE+c,_MI+c,_FA+c,_SOL+c,_LA+c,_SI+c,_DO2+c,_M+m, _PAUSE_,
_DO2+c,_SI+c,_LA+c,_SOL+c,_FA+c,_MI+c,_RE+c,_DO+c,_M+m, _PAUSE_,
/*---------------------------- 新年好 ------------------------------------*/
_DO+c,_DO+c,_DO+c,_M+sq,_DO+m,_SOL0+m,_MI+c,_MI+c,_M+sq,_MI+m,_DO+m,_DO+c,
_MI+c,_M+sq,_SOL+m,_SOL+m,_FA+c,_MI+c,_M+sq,_RE+m,_RE+m,_M+sq,_RE+c,_MI+c,
_FA+m,_M+sq,_FA+m,_MI+c,_RE+c,_MI+m,_DO+m,_M+sq,_DO+c,_MI+c,_RE+m,_SOL0+m,
_SI0+c,_RE+c,_DO+m,_DO+m,_PAUSE_,
/*--------------------------- 兩只老虎 -----------------------------------*/
_DO+c,_RE+c,_MI+c,_DO+c,_DO+c,_RE+c,_MI+c,_DO+c,_MI+c,_FA+c,_SOL+m,_MI+c,
_FA+c,_SOL+m,_SOL+qp,_LA+sq,_SOL+qp,_FA+sq,_MI+c,_DO+c,_SOL+qp,_LA+sq,
_SOL+qp,_FA+sq,_MI+c,_DO+c,_M+sq,_DO+c,_SOL0+c,_DO+m,_M+sq,_DO+c,_SOL0+c,
_DO+m,_M+sq,_PAUSE_,
/*---------------------------- 甜蜜蜜 ------------------------------------*/
_MI+m,_SOL+c,_LA+c,_MI+m,_MI+c,_DO+c,_RE+cn,_DO+q,_RE+c,_MI+q,_SOL+q,_MI+m,
_MI+m,_RE+c,_RE+c,_RE+c,_RE+q,_MI+q,_RE+q,_DO+cn,_LA0+q,_SOL0+cn,_DO+m,
_DO+c,_RE+c,_MI+cn,_RE+q,_MI+q,_RE+q,_MI+q,_SOL+q,_RE+m,_RE+m,_RE+m,_RE+m,
_MI+m,_SOL+c,_LA+c,_MI+m,_MI+c,_DO+c,_RE+cn,_DO+q,_RE+c,_MI+q,_SOL+q,_MI+m,
_MI+m,_RE+c,_RE+c,_RE+c,_RE+q,_MI+q,_RE+q,_DO+cn,_LA0+q,_SOL0+cn,_DO+m,
_DO+c,_MI+c,_RE+q,_DO+q,_DO+c,_LA0+q,_SOL0+cn,_DO+m,_DO+m,_DO+m,_DO+m,_MI+m,
_MI+m,_SOL0+m,_LA0+q,_DO+q,_SOL0+q,_LA0+q,_DO+m,_DO+m,_DO+m,_DO+m,_LA0+c,
_SI0+c,_LA0+c,_SI0+c,_LA0+c,_LA0+q,_DO+q,_LA0+q,_SOL0+q,_SOL0+c,_MI+m,_MI+m,
_MI+m,_MI+m,_LA0+c,_SI0+c,_LA0+c,_SI0+c,_LA0+c,_LA0+q,_DO+q,_LA0+q,_SOL0+q,
_SOL0+c,_MI+m,_MI+m,_MI+m,_M+c,_SOL+q,_LA+q,_SOL+m,_M+c,_SOL+q,_LA+q,_SOL+m,
_M+c,_SOL+q,_LA+q,_SOL+c,_SOL+q,_LA+q,_SOL+c,_SOL+q,_LA+q,_SOL+m,_SOL+m,
_MI+m,_SOL+c,_LA+c,_MI+m,_MI+c,_DO+c,_RE+cn,_DO+q,_RE+c,_RE+q,_SOL+q,_MI+m,
_MI+m,_RE+c,_RE+c,_RE+c,_RE+q,_MI+q,_RE+q,_DO+cn,_LA0+q,
_SOL0+cn,_DO+m,_DO+c,_MI+c,_RE+q,_DO+q,_DO+c,_LA0+q,_SOL0+cn,_DO+m,_DO+m,
_DO+m,_DO+m,_MI+m,_MI+m,_SOL0+m,_LA0+q,_DO+q,_SOL0+q,_LA0+q,_DO+m,_DO+m,
_DO+m,_DO+m,_PAUSE_,
/*------------------ _END_ marks to end of the tune ----------------------*/
_END_
};
/******************************************************************************/
/* Function definitions */
/******************************************************************************/
/* -------------------------------------------------------------------------- */
/* ROUTINE NAME: Buzz_Init */
/* INPUT/OUTPUT: None. */
/* DESCRIPTION: Initialize the TIM2 as PWM mode for BUZZ control. */
/* -------------------------------------------------------------------------- */
void Buzz_Init ( void )
{
PD_DDR |= 0x10; /* Configure PD4 as output (for the PWM). */
PD_CR1 |= 0x10; /* PD4 Push pull output. */
TIM2_CCMR1 |= 0x70; /* Output mode PWM2. */
TIM2_CCER1 |= 0x03; /* CC polarity low,enable PWM output */
TIM2_ARR = 0; /* Freq control register: ARR */
TIM2_CCR1 = 0; /* Dutycycle control register: CCR */
TIM2_PSCR |= 0x00; /* fCK_CNT is equal to fCK_PSC. */
TIM2_CR1 |= 0x01; /* Enable TIM2. */
current_note = 1;
}
/* -------------------------------------------------------------------------- */
/* ROUTINE NAME: Buzz_Wait */
/* INPUT/OUTPUT: Note ration (4bit MSB information) / None. */
/* DESCRIPTION: 1) Sample AIN voltage and store in AD_Value. */
/* 2) Polling wait routine for note ration(based on 4ms delay).*/
/* ration: Quaver (2), crotchet (4) or minim (8) selection. */
/* ---------------------------------------------------------------------------*/
void Buzz_Wait(unsigned char ration)
{
int i = 0;
unsigned char uc = 0;
unsigned long Temp;
/* Sample AIN voltage in ADC single mode. */
ADC_CR1 |= 0x01; /* First set ADON to power on the ADC mole. */
i = 6; /* Wait >7us to ensure the ADC power on finished.*/
while(i--);
ADC_CR1 |= 0x01; /* Set ADON again to start AD convert. */
while(!(ADC_CSR & 0x80));/* Waiting for AD convert finished (EOP=1). */
/* Store ADC value to AD_Value */
AD_Value = ((((unsigned int)ADC_DRH)<<2)+ADC_DRL)>>2;
if (AD_Value < 0x01)
{ AD_Value = 0x01; }
if (AD_Value > 0xC0)
{ AD_Value = 0xC0; }
if (Flag_Octave_Chg==1)
{
Temp = ((((unsigned int) Low_Note_h [c1_buf])<<8)+Low_Note_l [c1_buf]);
}
else
{
Temp = ((((unsigned int) Hi_Note_h [c1_buf])<<8)+Hi_Note_l [c1_buf]);
}
Temp = (Temp*AD_Value)>>9;
/* The new ty cycle value is written in CCR */
TIM2_CCR1H=(unsigned char)(((unsigned int)Temp & 0xff00)>>8);
TIM2_CCR1L=(unsigned char)((unsigned int)Temp & 0x00ff);
/* Delay time = ration * Y */
while ( uc < ration ) /* The following loop is run "ration" times. */
{
while ( i < 1200 ) /* This loop "Y" waits approximately 4.3ms. */
{
i++;
}
i = 0;
uc++;
}
}
/* -------------------------------------------------------------------------- */
/* ROUTINE NAME: Buzz_PlayTune */
/* INPUT/OUTPUT: None. */
/* DESCRIPTION: Plays a music score (one tune at a time). */
/* -------------------------------------------------------------------------- */
void Buzz_PlayTune ( void )
{
unsigned ui;
unsigned long temp_DCR;
unsigned char temp;
while(1)
{
if(tune[current_note] == _END_)
{
/* End of the music, reset to beginning. 1 is a mute at the */
/* beginning of the array of notes; differs from 0. */
current_note = 1;
break;
}
else if(tune[current_note] == _PAUSE_)
{
/* End of a tune, save the position in the music, stop playing. */
current_note++;
break;
}
else
{
c1 = tune[current_note];
/* Loads a note (or mute) on the relevant registers */
/* The note information is carried only by the 4 lowest bits. */
c1_buf= c1 & 0x0f;
if (Flag_Octave_Chg==1)
{
temp_DCR = ((((unsigned int)Low_Note_h [c1_buf])<<8)+Low_Note_l[c1_buf]);
TIM2_ARRH = Low_Note_h [c1_buf];
TIM2_ARRL = Low_Note_l [c1_buf];
}
else
{
temp_DCR = ((((unsigned int) Hi_Note_h [c1_buf])<<8)+Hi_Note_l [c1_buf]);
TIM2_ARRH = Hi_Note_h [c1_buf];
TIM2_ARRL = Hi_Note_l [c1_buf];
}
temp_DCR = (temp_DCR*AD_Value)>>9;
/* The new ty cycle value is written in DCR0. */
temp=((unsigned int)temp_DCR & 0xff00)>>8;
TIM2_CCR1H=(unsigned char)temp;
temp=((unsigned int)temp_DCR & 0x00ff);
TIM2_CCR1L=(unsigned char)temp;
/* Waits for the ration of the note. */
/* The ration info is carried by the 4 highest bits. */
Buzz_Wait(c1&0xF0);
/* Progressing in the array of notes: the tune. */
current_note++;
}
}
}
/* -------------------------------------------------------------------------- */
/* ROUTINE NAME: GPIO_Init */
/* INPUT/OUTPUT: None. */
/* DESCRIPTION: Initialize the GPIO for LED,TLI. */
/* -------------------------------------------------------------------------- */
void GPIO_Init(void)
{
/* LED IO Configuration */
/* LD3: PD3 */
/* LD2: PD1 */
/* LD1: PD0 */
PD_DDR |= 0x0D; /* Output. */
PD_CR1 |= 0x0D; /* PushPull. */
PD_CR2 = 0x00; /* Output speed up to 2MHz. */
/* PD7 external interrupt */
EXTI_CR1 = 0x00; /* External interrupt (TLI) sensitivity. */
EXTI_CR2 = 0x00;
PD_DDR &=~0x80; /* PD7: Input */
PD_CR2 |= 0x80; /* Enable TLI interrupt. */
}
/* -------------------------------------------------------------------------- */
/* ROUTINE NAME: CLK_Init */
/* INPUT/OUTPUT: None. */
/* DESCRIPTION: Initialize the clock source */
/* -------------------------------------------------------------------------- */
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. */
}
/* -------------------------------------------------------------------------- */
/* ROUTINE NAME: ADC_Init */
/* INPUT/OUTPUT: None. */
/* DESCRIPTION: Initialize the AD converter. */
/* -------------------------------------------------------------------------- */
void ADC_Init(void)
{
ADC_CR2 = 0x00;
ADC_CR1 = 0x00;
ADC_CSR = 0x03;
ADC_TDRL = 0x20;
}
/* -------------------------------------------------------------------------- */
/* ROUTINE NAME: TIM_Init */
/* INPUT/OUTPUT: None. */
/* DESCRIPTION: Initialize the TIM4 as LED timebase. */
/* -------------------------------------------------------------------------- */
void TIM_Init(void)
{
/* TIM4 Peripheral Configuration */
/* Time Base configuration */
TIM4_PSCR = 0x04; /* Configure TIM4 prescaler. */
TIM4_ARR = 0xFF; /* Configure TIM4 period. */
/*TIM4 counter enable */
TIM4_CR1 |= 0x01; /* Enable TIM4. */
TIM4_IER |= 0x01; /* Enable TIM4 OVR interrupt. */
}
/* -------------------------------------------------------------------------- */
/* ROUTINE: main */
/* main entry */
/* -------------------------------------------------------------------------- */
void main ( void )
{
unsigned int j;
_asm("sim"); /* Disable interrupts. */
Flag_Octave_Chg=0;
CLK_Init();
GPIO_Init();
TIM_Init();
ADC_Init();
_asm("rim"); /* Enable interrupts. */
Buzz_Init (); /* Init TIMER peripheral. */
while ( 1 )
{
/* Play the current score. */
Buzz_PlayTune();
Buzz_Wait(0x80); /* Wait around one second. */
}
}
/* --------------------------- End of file -----------------------------------*/
⑸ 求STM8S家族的微控制晶元的 中文的 編程手冊(pm0044)
同問,希望朋友們提供[email protected]
⑹ STM8當中的GPIO各模式如何用
TM8的通用輸入/輸出口用於晶元和外部進行數據傳輸。一個IO埠可以包括多達8個引腳,每個引腳可以被獨立編程作為數字輸入或者數字輸出口。另外部分口還可能會有如模擬輸入,外部中斷,片上外設的輸入/輸出等復用功能。但是在同一時刻僅有一個復用功能可以映射到引腳上。
復用功能的映射是通過選項位元組控制的。請參考數據手冊關於選項位元組的描述。
每個埠都分配有一個輸出數據寄存器,一個輸入引腳寄存器,一個數據方向寄存器,一個選擇寄存器,和一個配置寄存器。一個I/O口工作在輸入還是輸出是取決於該口的數據方向寄存器的狀態。
GPIO主要功能
可選擇的輸入模式:浮動輸入和帶上拉輸入
可選擇的輸出模式:推挽式輸出和開漏輸出
數據輸入和輸出採用獨立的寄存器
外部中斷可以單獨使能和關閉
輸出擺率控制用以減少EMC雜訊
片上外設的I/O功能復用
當作為模擬輸入時可以關閉輸入施密特觸發器來降低功耗
在數據輸出鎖存時支持讀-修改-寫
輸入兼容5V電壓
I/O口工作電壓范圍為1.6 V到VDDIOmax
I/O的配置和使用
每一個埠都有一個輸出數據寄存器(ODR),一個引腳輸入寄存器(IDR)和一個數據方向寄存器(DDR)總是同相關的。
控制寄存器1(CR1)和控制寄存器2(CR2)用於對輸入/輸出進行配置。任何一個I/O引腳可以通過對DDR,ODR,CR1和CR2寄存器的相應位進行編程來配置。
寄存器中的位n對應於口的引腳n。各種不同配置總結如表18。
(表18:IO口配置表)
注意:連接VDD的二極體在實際開漏極狀態引腳是無效的,在引腳和VOL之間的局部保護設備重要性是有效的。
沒有使用的I/O引腳必須連接到一個固定的電平值。或者是上拉或者是下拉。
輸入模式
將DDRx位清零就選擇了輸入模式。在該模式下讀IDR寄存器的位將返回對應I/O引腳上的電平值。
如表18所示,理論上STM8可以通過軟體配置得到四種不同的輸入模式:懸浮不帶中斷輸入,懸浮帶中斷輸入,上拉不帶中斷輸入和上拉帶中斷輸入。但是在實際情況下不是所有的口都具有外部中斷能力和上拉,用戶應參考數據手冊中關於每個引腳的實際硬體性能描述來了解更多細節。
輸出模式
將DDRx位置1就選擇了輸出模式。在該模式下向ODR寄存器的位寫入數據將會通過鎖存器輸出對應數字值到I/O口。讀IDR的位將會返回相應的I/O引腳電平值。通過軟體配置CR1,CR2寄存器可以得到不同的輸出模式:上拉輸出,開漏輸出。
低功耗模式
表19低功耗模式對STM8S的GPIO口的影響
模式 描述
等待(Wait) 對I/O口無影響。外部中斷可以使MCU退出等待(Wait)模式
停機(Halt) 對I/O口無影響。外部中斷可以使MCU從停機(Halt)模式喚醒
注意:如果PA1/PA2被用來連接外部諧振器,為了確保在HALT模式下有最低功耗必須配置PA1和PA2為帶上拉輸入。
⑺ STM8的C語言延時及外部中斷編程
研究了下,你描述的邏輯好像有矛盾,
我疑問如下:
控制過程如下:
pin17(PC7)收到低電平脈沖信號(脈沖長度多少?),
計時器啟動(計數時間5秒?),
pin19(PD2)輸出高電平(在計數計數結束後輸出低電平?);
當m為奇數時,pin13(PC3)輸出高電平(PIN14輸出低電平?);
當m為偶數時,pin14(PC4)輸出高電平(PIN13輸出低電平?)。
最終計數結束後輸出狀態如何?
pin10(PA3)有高電平脈沖信號輸入時(脈沖長度多少?),
pin19(PD2)停止輸出(輸出低電平還是高電平?);
如果在一個計時周期內(5秒嗎?),
pin10(PA3)沒有高電平信號輸入(一直維持低電平嗎?),
則pin18(PD1)輸出高電平(有高電平脈沖信號時輸出低電平?)。
pin15(PC5)有高電平脈沖信號輸入時(脈沖長度多少?),
pin13(PC3)停止輸出(輸出低電平還是高電平?);
如果在一個計時周期內(5秒嗎?),
pin15(PC5)沒有高電平信號輸入(一直維持低電平嗎?),
且計數器值m為奇數,則pin18(PD1)輸出高電平(m是偶數時怎麼處理?)。
。。。。。。。。。。。
主要程序到底是觸發後輸出一個序列電平還是測量輸入脈沖?
⑻ 什麼是單片機STM8
ST的8位微控制器平台基於高性能8位內核,配有先進的成套外設。 該平台採用ST的130 nm嵌入式非易性存儲器專有技術。 STM8通過增強型堆棧指針運算、先進的定址模式和新指令實現快速、安全的開發。 STM8平台支持三種主要產品線:
STM8S,通用微控制器
STM8L,超低功耗EnergyLite™微控制器
STM8A,汽車級微控制器
以上是ST公司官方給出的介紹。對於選型來講STM8的主要特點是最高工作頻率24MHz,性能可以達到20MIPS。定時器等外設資源的架構和現在炙手可熱的STM32系列ARM基本相同,可以用類似的方式控制,官方提供了軟體架構庫FWLib,可以簡化開發過程。中斷的處理方式與AVR不大相同,幾種中斷源可能對應一個中斷向量,據說類似51,但是我沒用過51,所以沒有考證。價格上與AVR的定位類似,感覺性價比稍微高於AVR一些。模擬器為ST-Link,可以在淘寶上買到,只需要100多就可以,所以上手成本也比較低。
不知道這些信息是否能夠滿足您的需求。
⑼ stm8編程用iar編譯器哪個版本好
stm8編程用iar編譯器用22版本好。stm8編程iar編譯器22版是最新版本,功能最全。
⑽ 如何實現STM8的程序加密可以使用其RC校驗碼嗎
stm8具有唯一id,可以利用這個id做程序加密
例如
#define ID_ENCRYPT_EOR_RESULT_ADDRESS (0x9ff0)
#define ID_ENCRYPT_ADD_RESULT_ADDRESS (0x9ff4)
void Stm8s103EncryptDemo(void)
{
uint32 *u16IdAddress;
uint16 u32EorRslt, u16AddRslt;
//千萬別顯式的讀取ID,即要把0x4865運算成隱式的,例如此例中0x4865 = (0x1194 * 4) + 0x215;
//這樣,別人就算破解出了你的程序,也查找不到0x4865,這樣就不能輕易的軟解密,這樣處理後如果要軟解密,
//一定要反匯編出來進行復雜逆向分析,難度極大,代價極高,很難搞定軟加密了,達到保護產品的目的。
gU16IdAdressVar = 0x1194;
gU16IdAdressVar <<= 2;
u16IdAddress = (uint16*)(gU16IdAdressVar + 0x215);//0x4865
//讀取單片機的ID,並進行運算,具體演算法可以自己定,這里只用到簡單的異或及和運算
u16EorRslt = (*u16IdAddress) ^ (*(u16IdAddress + 1)) ^ (*(u16IdAddress + 2));
u16AddRslt = (*u16IdAddress) + (*(u16IdAddress + 1)) + (*(u16IdAddress + 2));
//進行對比,如果運算結果與FLASH保存的結果不一樣,說明非法,運行錯誤代碼
if(u16EorRslt != *((uint16*)ID_ENCRYPT_EOR_RESULT_ADDRESS))
{
while(1);//異或演算法結果不正確,進行錯誤分支
}
if(u16AddRslt != *((uint32*)ID_ENCRYPT_ADD_RESULT_ADDRESS))
{
while(1);//和演算法結果不正確,進行錯誤分支
}
}
1,如果板子上有外部存儲器,可以先編寫一個程序,利用演算法把id計算得到一些值存入外部存儲器,然後再燒寫真正的程序,真正的程序去校驗外部存儲器的數據是否合法即可
2,利用板子上按鍵組合,或是上電按住某些鍵,程序在這個時候利用演算法把id計算得到一些值存入程序區(stm8為EE區),程序運行時去驗證程序區數據是否正確
3,軒微編程器有軟體加密的功能,編程器會讀晶元id,根據演算法直接改寫緩沖區,達到軟體加密的作用
4,讀出的id通過一定演算法,例如異或加上一個數,得到的數據存入flash(只運行一次,運行後標志位也存入flash),下次讀到這個標志位,就不運行這個程序