Небольшая шпаргалка для stm8.


Косяков тут может быть много, так что осторожнее.

Биты в регистрах могут быть установлены следующим способом.

#define bit 0x5 // 0b101
int main()
{
PD_DDR |= 0xFF;
while(1)
    {
    PD_ODR  = (bit<<5) | (1<<2)|(1<<1)| (1<<0);/*bit << 5 - сдвинули 0b101 за крайний правый бит, тоесть левый бит (1) окажется битом №7.*/
    }
}


init_clk.h
#include "STM8/STM8S105C6.h"

/*CLK_ICKR - настройка внутренних генераторов*/
#define HSIEN (1<<0) /*отвечает за включение высокочастотного генератора. По умолчанию он равен единице и генератор включен.*/
#define HSIRDY (1<<1)/*определяет состояние генератора HSI. Если он установлен, то генератор готов к работе.*/
#define FHW   (1<<2)/*Установка бита FHWU разрешает быстрый выход из спящих режимов.*/
#define LSIEN (1<<3)/*отвечает за включение низкочастогоного генератора. По умолчанию он равен единице.*/
#define LSIDRY (1<<4)/*определяет состояние генератора LSI. Если он установлен, то генератор готов к работе.*/
#define REGAH (1<<5)/*Спящий режим*/ 

/*CLK_ECKR - настройка внешнего генератора*/
#define HSEEN (1<<0) /*включает внегний генератора 1 - вк, 0 - выкл*/
#define HSERDY (1<<1) /*укаывает на готовность внешнего генератора 1 - готов, 0 - не готов*/

/*CLK_CMSR - только для чтения, устанавливает и сбрасывается аппаратно.*
* Указывает на выбранный источник тактирования.												 */
#define CMSR_HSI 0xE1/*внутренний высокоскоростной RC-генератор 16 МГц */
#define CMSR_LSI 0xD2/*внутренний низкоскоростной RC-генератор 128 КГц*/
#define CMSR_HSE 0xB4/*внешний кварцевый резонатор с частотой 1-24МГц */

/*CLK_SWR - регистр для выбора источника тактовой частоты*/
#define SWR_HSI 0xE1 /*внутренний высокоскоростной RC-генератор 16 МГц */
#define SWR_LSI 0xD2/*внутренний низкоскоростной RC-генератор 128 КГц*/
#define SWR_HSE 0xB4/*внешний кварцевый резонатор с частотой 1-24МГц */

// CLK_SWCR
#define SWBSY			(1<<0)/*устанавливается аппаратно в момент процесса переключения источника тактовой частоты.*/
#define SWEN 			(1<<1)/*1-разрешает переключение источника тактовой частоты.*/
#define SWIEN			(1<<2)/*разрешает прерывание по переключению источника тактовой частоты.*/
#define SWIF    	(1<<3)/*Флаг SWIF устанавливается после переключения источника. В процедуре обработчика прерывания его необходимо очищать..*/

/*CLK_CKDIVR - регистр делителя частоты*/
#define CPUDIV_0 		0x0//Определяет делитель для ЦПУ
#define CPUDIV_2 		0x1//Определяет делитель 2 для ЦПУ
#define CPUDIV_4 		0x2//Определяет делитель 4 для ЦПУ
#define CPUDIV_8 		0x3//Определяет делитель 8 для ЦПУ
#define CPUDIV_16		0x4//Определяет делитель 16 для ЦПУ
#define CPUDIV_32 	0x5//Определяет делитель 32 для ЦПУ
#define CPUDIV_64 	0x6//Определяет делитель 64 для ЦПУ
#define CPUDIV_128	0x7//Определяет делитель 128 для ЦПУ
#define HSIDIV_0		0x0//Определяет делитель для внутреннего генератора
#define HSIDIV_2		0x8//Определяет делитель 2 для внутреннего генератора
#define HSIDIV_4    0x10//Определяет делитель 4 для внутреннего генератора
#define HSIDIV_8		0x18//Определяет делитель 8 для внутреннего генератора

/*CLK_PCKENR1 - включение тактирование. 1 - вкл, 0- выкл В S - серии тактирование по умолчанию включено, в L - серии отключено */ 
#define PCKEN1_TIM1 			(1<<7)// TIM1
#define PCKEN1_TIM3 			(1<<6)//TIM3
#define PCKEN1_TIM2_TIM5	(1<<5)//TIM2/TIM5 (product dependent)
#define PCKEN1_TIM4_TIM6  (1<<4)//TIM4/ TIM6 (product dependent)
#define PCKEN1_UART2			(1<<3)/* product dependent, see datasheet for bit assignment table*/
#define PCKEN1_UART1			(1<<2)/* product dependent, see datasheet for bit assignment table*/
#define PCKEN1_SPI				(1<<1)//SPI
#define PCKEN1_I2C				(1<<0)//I2C

/*CLK_PCKENR2 - включение тактирование. 1 - вкл, 0- выкл*/ 
#define PCKEN2_CAN (1<<7)//CAN (product dependent, see datasheet
#define PCKEN2_ADC (1<<3)//ADC
#define PCKEN2_AWU (1<<2)//AWU
 
/*CLK_CSSR - Регистр управления системой обеспечения безопасности тактирования.*/
#define CSSEN (1<<0); //1 -вкл, 0 - выкл, управления системой обеспечения безопасности тактирования
#define AUX   (1<<1)/* 1 - Вспомогательный генератор включён и выбран в качестве тактового генератора, 0 - вспомогательный генератор выключен*/
#define CSSDIE (1<<2) /* разрешает вызов прерывания по срабатыванию системы обеспечения безопасности тактирования*/
#define CSSD  (1<<3) /*выставляется при срабатыванию модуля CSS. В процедуре обработчика прерывания его необходимо очищать.*/

/*CLK_CCOR - настройка  "частоты выхода";*/
#define CCOEN					(1<<0) // 1 - вкл. выходную частоту
/*CCOSEL  - выбор источника частоты достоты доступных для вывода CLK_CCO*/
#define CCOSEL_HSIDIV 0x0
#define CCOSEL_LSI		0x1
#define CCOSEL_HSE		0x2
#define CCOSEL_CPU		0x3
#define CCOSEL_CPU_2	0x4
#define CCOSEL_CPU_4  0x6
#define CCOSEL_CPU_16 0x7
#define CCOSEL_CPU_32 0x9
#define CCOSEL_CPU_64 0xA
#define CCOSEL_HSI		0xB
#define CCOSEL_MASTER	0xC
//#define CCOSEL_CPU		0xD
//#define CCOSEL_CPU		0xE
//#define CCOSEL_CPU		0xF
#define CCORDY				(1<<5)/* Показывает готовность CCO тактирование. 1 - тактирвание CCO доступно,0 - тактирвание CCO не доступно*/
#define CCOBSY				(1<<7)/*Покаывает занятость (включён, стабилизирован) CCO. 
1 - CCO - занят. 0 - CCO свободен*/

/*CLK_HSITRIMR - калибровочный регистр*/

/*CLK_SWIMCCR*/
#define SWIMCLK (1<<0) /* 0 - делить частоты SWIM на 2. 1 - без делителься на 2*/

		
void init_clk();


init_clk.c
#include "init_clk.h"

void init_clk()
{
	CLK_ECKR |= HSEEN;
	CLK_SWCR |=SWEN;
while(!(CLK_ECKR|=HSERDY)){}
	CLK_SWR =SWR_HSE;
	CLK_CKDIVR = CPUDIV_0;
while(!(CLK_SWCR |=SWIF)) {}
	
}


uart.h

#include "STM8/STM8S105C6.h"

/*UART_SR -* регистр статуса*/
#define PE               (1<<0)/*Этот бит устанавливается аппаратно, когда происходит ошибка четности в режиме приемника. 1 - Ошибка чётностт, 0 - ошибок нет*/
#define FE               (1<<1)/*Указывает на рассинхронизацию или ошибоку. Бит очищается програмно. 1 - ошибка 0 - нет ошибок*/
#define NF               (1<<2)/*Указывает на наличие шумов* 1 - шум обнаржен, 0 - нет шума.*/
#define OR_LHE                   (1<<3)/* OR - Ошибка переполения.  Указывает на то что в настоящий момент принимается слово в регистр сдвига и готов для передачи в  регистр RDR. 1 - Ошибка переполнение, 0 - нет ошибки переполнения.*
 LHE 1 - Ошибка в LIN заголовке, 0 - нет ошибкаи в LIN заголовке*/
#define IDLE                     (1<<4)/*1 - Простой линии. */ 
#define RXNE                     (1<<5)/*1 - Полученны данные, читать в регистре UART_DR, 0 - данные не получены.  */
#define TC               (1<<6)/*1 - Передача завершена, 0 - передача не завершенна*/
#define TXE              (1<<7)/*1 - Данные передаются в регистр свдига. 0 - Данные не передаются в регистр сдвига*/

/*UART_DR - регистр данных*/

/*UART_BRR1 - регистр для выбора скорористи передачи данных*/
#define UART_DIV_11_4  /**/
/*UART_BRR2 - регистр для выбора скорористи передачи данных*/
#define UART_DIV_15_12  /* Биты опеределяются MSB делителя UART_DIV*/
#define UART_DIV_3_0  /* Биты опеределяются LSB делителя UART_DIV*/
/*Скорость работы порта настравивается с помощью 2-х регистров, UART_BRR1 и UART_BRR2.*/
/*скорость порта = F(cpu)/ UART_DIV*/
/*Например: дано F(cpu) = 16 мГц, скорость порта 9600*/
/*Например: UART_DIV = 16 000 000/9600*/
/*Например: UART_DIV = 1666 = 0x0682*/
/*Например:  Значит ( в регистре UART_BRR1)UART_DIV_11_4 = 0x06*/ 
/*Например:  Значит ( в регистре UART_BRR2)UART_DIV_15_12 = 0x8*/
/*Например:  Значит ( в регистре UART_BRR2)UART_DIV_3_0 = 0x2*/

/*UART_CR1 - регистр настройки*/
#define PIEN    (1<<0)/*Прерывание чётности. 1 - Генерирует перывание когда биты PE = 1 в регистре UART_SR, 0 - Прерывание бокируется. */
#define PS              (1<<1) /*Выбор чётности. 1 - чётные, 0 - не чётные*/
#define PCEN    (1<<2) /*Включение контроля чётности в UART режиме 1 - контроль чётности вкл. 0 - контроль чётности выкл. 
В LIN режиме 1 - идентификатор проверки чётености вкл. 0 - индикатор проверки чёнтости выкл.*/
#define WAKE    (1<<3)/*Выбирает метот пробуждения 1 - Adress Maek(хрен знает чё такое) 0 - при свободной линии. */
#define M               (1<<4) /*Длина слова (байта?) 0 - 1 стар бит, 8 - бит данных,n - стоп бит. 1 - 1 старт бит, 9 бит данных, 1 стоп бит*/
#define UARTD   (1<<5) /*Отключить UART 1 - UART отключён. 0 - UART включён*/
#define T8              (1<<6) /*Используется для сохранения 9 бита в передатчике когда бит М = 1*/
#define R8              (1<<7) /*Используется для сохранения 9 бита в приёмнике когда бит М = 1*/

/*UART_CR2 - регистр настройки*/
#define SBK     (1<<0)
#define RWU     (1<<1)/*1 - UART в "приглушённом" режиме, 0 - UART в активном режиме*/
#define REN     (1<<2)/*1 - Приёмник включён, 0 - приёмник выключен*/
#define TEN     (1<<3)/*1 - Передатчик вкл, 0 - передатчик выкл.*/
#define ILIEN   (1<<4)/*1 - Генерирует перывание когда бит IDLE=1 в регистре UART_SR, 0 - Прерывание бокируется. */
#define RIEN    (1<<5)/*1 - Генерирует перывание когда биты OR=1 и RXNE=1 в регистре UART_SR, 0 - Прерывание бокируется. */
#define TCIEN   (1<<6)/*1 - Генерирует перывание когда биты TC=1 в регистре UART_SR, 0 - Прерывание бокируется.*/
#define TIEN    (1<<7)/*1 - Генерирует перывание когда биты TXE = 1 в регистре UART_SR, 0 - Прерывание бокируется. */

/*UART_CR3 - регистр настройки*/
#define LBCL 			(1<<0) /*Бит не доступен для UART3. 
1 - тактовый импульс последнего бита данных выводится на вывод SCLK
0 - тактовый импульс последнего бита данных НЕ выводится на вывод SCLK */
#define	CPHA 			(1<<1)
#define CPOL 			(1<<1)
#define CLKEN			(1<<3) /*Этот бит позволяет пользователю включить вывод SCLK.
0 - SLK вывод отключён
1 - SLK вывод включен*/
/*Биты номер 5,4 - для настройки стоп-битов.*/
#define STOP_BIT_1 		0x0 
#define STOP_BIT_2 		0x2/*10*/
#define STOP_BIT_1.5	0x3/*11*/
#define LINWN	 		(1<<6) /*0: LIN режим отключен 1: LIN режим включен*/

/*UART_CR4 - регистр настройки*/
#define ADD_3_0
#define LBDF	(1<<4)
#defien LBDL	(1<<5)
#define LBDIEN	(1<<6)

/*UART_CR5 - регистр настройки*/
#define IREN	(1<<1)
#define IRLP	(1<<2)
#define HDSEL	(1<<3)
#define NACK	(1<<4)
#define SCEN	(1<<5)

/*UART_CR6 - регистр настройки*/
#define LSF		(1<<0)
#define LHDF	(1<<1)
#define LHDIEN	(1<<2)
#define LASE	(1<<4)
#define LSLV	(1<<5)
#define LDUM	(1<<7)


beep.h

#include "STM8/STM8S105C6.h"

/*BEEP_CSR - Настройка пищалки.*/
/*BEEPDIV[4:0] - выбор предделителя. Предделитель 0x1F = состояние сброса??*/
#define BEEP_DIV_2 0x00/**/
#define BEEP_DIV_3 0x01/**/
#define BEEP_DIV_4 0x04/**/
#define BEEP_DIV_5 0x05/**/
#define BEEP_DIV_6 0x06/**/
#define BEEP_DIV_7 0x07/**/
#define BEEP_DIV_8 0x08/**/
#define BEEP_DIV_9 0x09/**/
#define BEEP_DIV_10 0x0A/**/
#define BEEP_DIV_11 0x0B/**/
#define BEEP_DIV_12 0x0C/**/
#define BEEP_DIV_13 0x0D/**/
#define BEEP_DIV_14 0x0E/**/
#define BEEP_DIV_15 0x0F/**/
#define BEEP_DIV_16 0x10/**/
#define BEEP_DIV_17 0x11/**/
#define BEEP_DIV_18 0x12/**/
#define BEEP_DIV_19 0x13/**/
#define BEEP_DIV_20 0x14/**/
#define BEEP_DIV_21 0x15/**/
#define BEEP_DIV_22 0x16/**/
#define BEEP_DIV_23 0x17/**/
#define BEEP_DIV_24 0x18/**/
#define BEEP_DIV_25 0x19/**/
#define BEEP_DIV_26 0x1A/**/
#define BEEP_DIV_27 0x1B/**/
#define BEEP_DIV_28 0x1C/**/
#define BEEP_DIV_29 0x1D/**/
#define BEEP_DIV_30 0x1E/**/
#define BEEP_DIV_31 0x1F/*Предделитель 0x1F = состояние сброса??*/
#define BEEP_DIV_32 0x20/**/
#define BEEPEN (1<<5)  /*1 - Вкл. пищалку 0 - Выкл пищалку*/
#define BEEPSEL_1 0x00 /* f LS /(8 x BEEP DIV ) kHz output*/
#define BEEPSEL_2 0x01 /*f LS /(4 x BEEP DIV ) kHz output*/
#define BEEPSEL_3 0x10 /* f LS /(2 x BEEP DIV ) kHz output*/
/*LS вроде как 128 кГц судя по схеме*/


tim1.h

#include "STM8/STM8S105C6.h"

/*TIM1_CR1 - регистр управления 1*/
#define CEN		(1<<0)/*1- запуска таймеры*/
#define UDIS	(1<<1)/*1 - запрещает прерывания таймера*/
#define URS		(1<<2)/*1 - прерывание возникает только при переполнение счётчика, 0 - прерывание может вызываться модулемвнешнего тактирования или программно, установка UG бита в регистре TIM1_EGR*/
#define OPM		(1<<3)/*1 - puls mode.Считает до переполнения и останавливается, для продолжения работы требуется перезапуск.*/
#define DIR		(1<<4)/*1 - счёт вниз, от 0xFFFF до 0. 0 - счёт вверх, от 0 до 0xFFFF/*/
#define CMS_1   (0<<6)|(0<<5) /*направление счёта зависит от бита DIR*/
#define CMS_2   (0<<6)|(1<<5) /*таймер считает вверх, потом вниз. Флаг совпадения с регистром сравнения выставляется при счете вниз*/
#define CMS_3   (1<<6)|(0<<5)/*таймер считает вверх, потом вниз. Флаг совпадения с регистром сравнения выставляется при счете вверх*/
#define CMS_4	(1<<6)|(1<<5)/*таймер считает вверх, потом вниз. Флаг совпадения с регистром сравнения выставляется как при счете вверх так и при счете вниз*/
#define ARPE	(1<<7)/*Наличие автоперезагрузки*/


/*TIM1_CR2 -  Регистр управления 2.Этот регистр отвечает за настройку модуля захвата-сравнения.*/
#define CCPC (1<<0)/*1: CCiE, CCiNE, CCiP,  C C iNP and OCiM bits are prelo ade d, after having been written, they are  updated only when COMG bit is set in the TIM1_EGR register. 
0: The CCiE, CCiNE, CCiP, and CCiNP bits in  the TIM1_CCERi registers and the OCiM bit in the  TIM1_CCMRi registers are not preloaded*/
#define COMS (1<<2)/*1: When capture/compare control bits are preloaded (CCPC = 1), they are updated by setting the  COMG bit or when an rising edge occurs on TRGI. 
0: When capture/compare control bits are preloaded (CCPC = 1), they are updated by setting the  COMG bit.*/
/*MMS - занимает биты 6,5,4*/
#define MMS_RESET		0x0/*Reset - The UG bit from the TIM1_EGR register is used  as trigger output (TRGO).*/
#define MMS_ENABLE		0x1/*Enable - The counter enable signal is used as trigger output (TRGO).*/
#define MMS_UPDATE		0x2/*Update - The update event is selected as trigger output (TRGO)*/
#define MMS_COMP_PULSE	0x3/* Compa re pulse (MATCH1) - The trigger output sends a positive pulse when the CC1IF flag is to  be set (even if it was already high), a s soon as a capture or a compare match occurs (TRGO).*/
#define MMS_COMP_OC1REF 0x4/*Compare - OC1REF signal is used as trigger output (TRGO)*/
#define MMS_COMP_OC2REF 0x5/*Compare - OC2REF signal is used as trigger output (TRGO)*/
#define MMS_COMP_OC3REF 0x6/*Compare - OC3REF signal is used as trigger output (TRGO)*/
#define MMS_COMP_OC4REF 0x7/*Compare - OC4REF signal is used as trigger output (TRGO)*/

/*TIM1_SMCR - Slave  mode  control register*/
/* SMS занимает бит 2,1,0 */
#define SMS_CLOCK_TRIGGER_DISABLED 	0x0 
#define SMS_ENCODER_MODE_1			0x1
#define SMS_ENCODER_MODE_2			0x2
#define SMS_ENCODER_MODE_3			0x3
#define SMS_RESET_MODE				0x4
#define SMS_TRIGGER_GATED_MODE		0x5
#define SMS_TRIGGER_STANDART_MOE	0x6
#define SMS_EXTERNAL_CLOCK_MODE_1	0x7
/*TS занимает биты 6,5,4 (значение<<4)*/
#define TS_ITR0_TIM6_TRGO 0x0 /*Internal trigger ITR0 connected to TIM6 TRGO*/
#define TS_ITR2_TIM5_TRGO 0x2 /* Internal trigger ITR2 connected to TIM5 TRGO*/
#define TS_TI1_ED		  0x4 /*TI1 edge detector (TI1F_ED)*/	
#define TS_FILTERED_T_IN1 0x5 /*Filtered timer input 1 (TI1FP1)*/
#define TS_FILTERED_T_IN2 0x6 /*Filtered timer input 2 (TI1FP2)*/
#define TS_EXT_TRIGGER_IN 0x7 /*External trigger input (ETRF)*/
#define MSM	(1<<7)/*1: The effect of an event on the tr ig ger input (TRGI) is delayed to a llow a perfect synchronization  between TIM1 and another timer (through TRGO).*/

/*TIM1_ETR - External  trigger register*/

/*Регистр TIM1_IER — Interrupt enable register. Регистр разрешения прерываний.*/
#define UIE		/*разрешает прерывание по переполнению*/
/*CCхIE разрешают прерывания по захвату-сравнению на соответствующем канале.*/
#define CC1IE	/**/
#define CC2IE	/**/
#define CC3IE	/**/
#define CC4IE	/**/
#define COMIE	/*1: Commutation interrupt enabled 0: Commutation interrupt disabled*/
#define TIE		/*1: Tr igger interr upt enabled 0: Tr igger interr upt disabled*/
#define BIE		/*разрешает прерывание по входу останова*/

/*TIM1_SR1 -  Регистр статуса 1. Основной регистр статуса, в нем выставляются флаги прерываний, которые необходимо анализировать при обработке прерываний. Рассмотрим его подробней:*/
#define UIF		(1<<0)/*становится равным единице, когда возникает переполнение счетчика и соответствующее прерывание разрешено.*/
/*Флаги ССxIF выставляются при совпадении значения счетчика таймера со значением, записанным в регистре TIM1_CCRx, если таймер работает в режиме сравнения. В режиме захвата эти флаги выставляются при появлении импульса на ножке ICх, при этом текущее значение счетчика таймера записывается в регистр TIM1_CCRx.*/
#define CC1IF	(1<<1)/**/
#define CC2IF	(1<<2)/**/
#define CC2IF	(1<<3)/**/
#define CC4IF	(1<<4)/**/
#define COMIF	(1<<5)/**/
#define TIF		(1<<6)/*1: Tr igger interr upt pending  0: No tr igger event has occurred */
#define BIF		(1<<7)/*выставляется при появлении высокого уровня на входе останова Таймера1*/


/*TIM1_EGR — Event generation register. Регистр генерации событий.
Установка в нем флагов приводит к вызову вручную прерываний, которые вызываются автоматически, в результате работы таймера. */
#define UG		/**/
#define CC1G	/**/
#define CC2G	/**/
#define CC3G	/**/
#define CC4G	/**/
#define COMG	/**/
#define TG		/**/
#define BG		/*установка вызовет прерывание по входу останова.*/

Комментарии (6)

RSS свернуть / развернуть
Неплохо бы в названии поста уточнить, шпаргалка по чему.
0
  • avatar
  • Vga
  • 19 февраля 2012, 14:17
Выглядит аппетитно)
Может есть такие вкусности и для микроконтроллеров LPC11xx, LPC13xx?
Спасибо.
0
Ну, на сколько я заметил, автор писал эту шпаргалку сам. Потому думаю, что вооружившись даташитом Вы и по LPC сваяете нечто похожее за вечерок. Выглядит действительно удобно.
0
Не знаю как у LPC, а у STM32 большинство похожих определений битов зарисовано в CMSIS. Разве что искать там более муторно.
0
опечаток тут много, как нибудь исправлю.
0
или тупо в ворд загнать
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.