Re: Программирование STM8
Добавлено: Сб сен 02, 2023 14:46:38
Всё верно, можно даже не переводить в 16-ти ричный формат.
Код: Выделить всё
#define AWU_vector 3 /* IRQ No. in STM8 manual: 1 */
#define CLK_CSS_vector 4 /* IRQ No. in STM8 manual: 2 */
#define CLK_SWITCH_vector 4 /* IRQ No. in STM8 manual: 2 */
#define EXTI0_vector 5 /* IRQ No. in STM8 manual: 3 */
#define EXTI1_vector 6 /* IRQ No. in STM8 manual: 4 */
#define EXTI2_vector 7 /* IRQ No. in STM8 manual: 5 */
#define EXTI3_vector 8 /* IRQ No. in STM8 manual: 6 */
#define EXTI4_vector 9 /* IRQ No. in STM8 manual: 7 */
#define SPI_CRCERR_vector 12 /* IRQ No. in STM8 manual: 10 */
#define SPI_MODF_vector 12 /* IRQ No. in STM8 manual: 10 */
#define SPI_OVR_vector 12 /* IRQ No. in STM8 manual: 10 */
#define SPI_RXNE_vector 12 /* IRQ No. in STM8 manual: 10 */
#define SPI_TXE_vector 12 /* IRQ No. in STM8 manual: 10 */
#define SPI_WKUP_vector 12 /* IRQ No. in STM8 manual: 10 */
#define TIM1_CAPCOM_BIF_vector 13 /* IRQ No. in STM8 manual: 11 */
#define TIM1_CAPCOM_TIF_vector 13 /* IRQ No. in STM8 manual: 11 */
#define TIM1_OVR_UIF_vector 13 /* IRQ No. in STM8 manual: 11 */
#define TIM1_CAPCOM_CC1IF_vector 14 /* IRQ No. in STM8 manual: 12 */
#define TIM1_CAPCOM_CC2IF_vector 14 /* IRQ No. in STM8 manual: 12 */
#define TIM1_CAPCOM_CC3IF_vector 14 /* IRQ No. in STM8 manual: 12 */
#define TIM1_CAPCOM_CC4IF_vector 14 /* IRQ No. in STM8 manual: 12 */
#define TIM1_CAPCOM_COMIF_vector 14 /* IRQ No. in STM8 manual: 12 */
#define TIM2_OVR_UIF_vector 15 /* IRQ No. in STM8 manual: 13 */
#define TIM2_CAPCOM_CC1IF_vector 16 /* IRQ No. in STM8 manual: 14 */
#define TIM2_CAPCOM_CC2IF_vector 16 /* IRQ No. in STM8 manual: 14 */
#define TIM2_CAPCOM_CC3IF_vector 16 /* IRQ No. in STM8 manual: 14 */
#define TIM2_CAPCOM_TIF_vector 16 /* IRQ No. in STM8 manual: 14 */
#define UART1_T_TC_vector 19 /* IRQ No. in STM8 manual: 17 */
#define UART1_T_TXE_vector 19 /* IRQ No. in STM8 manual: 17 */
#define UART1_R_IDLE_vector 20 /* IRQ No. in STM8 manual: 18 */
#define UART1_R_LBDF_vector 20 /* IRQ No. in STM8 manual: 18 */
#define UART1_R_OR_vector 20 /* IRQ No. in STM8 manual: 18 */
#define UART1_R_PE_vector 20 /* IRQ No. in STM8 manual: 18 */
#define UART1_R_RXNE_vector 20 /* IRQ No. in STM8 manual: 18 */
#define I2C_ADD10_vector 21 /* IRQ No. in STM8 manual: 19 */
#define I2C_ADDR_vector 21 /* IRQ No. in STM8 manual: 19 */
#define I2C_AF_vector 21 /* IRQ No. in STM8 manual: 19 */
#define I2C_ARLO_vector 21 /* IRQ No. in STM8 manual: 19 */
#define I2C_BERR_vector 21 /* IRQ No. in STM8 manual: 19 */
#define I2C_BTF_vector 21 /* IRQ No. in STM8 manual: 19 */
#define I2C_OVR_vector 21 /* IRQ No. in STM8 manual: 19 */
#define I2C_RXNE_vector 21 /* IRQ No. in STM8 manual: 19 */
#define I2C_SB_vector 21 /* IRQ No. in STM8 manual: 19 */
#define I2C_STOPF_vector 21 /* IRQ No. in STM8 manual: 19 */
#define I2C_TXE_vector 21 /* IRQ No. in STM8 manual: 19 */
#define I2C_WUFH_vector 21 /* IRQ No. in STM8 manual: 19 */
#define ADC1_AWDG_vector 24 /* IRQ No. in STM8 manual: 22 */
#define ADC1_AWS0_vector 24 /* IRQ No. in STM8 manual: 22 */
#define ADC1_AWS1_vector 24 /* IRQ No. in STM8 manual: 22 */
#define ADC1_AWS2_vector 24 /* IRQ No. in STM8 manual: 22 */
#define ADC1_AWS3_vector 24 /* IRQ No. in STM8 manual: 22 */
#define ADC1_AWS4_vector 24 /* IRQ No. in STM8 manual: 22 */
#define ADC1_AWS5_vector 24 /* IRQ No. in STM8 manual: 22 */
#define ADC1_AWS6_vector 24 /* IRQ No. in STM8 manual: 22 */
#define ADC1_AWS7_vector 24 /* IRQ No. in STM8 manual: 22 */
#define ADC1_AWS8_vector 24 /* IRQ No. in STM8 manual: 22 */
#define ADC1_AWS9_vector 24 /* IRQ No. in STM8 manual: 22 */
#define ADC1_EOC_vector 24 /* IRQ No. in STM8 manual: 22 */
#define TIM4_OVR_UIF_vector 25 /* IRQ No. in STM8 manual: 23 */
#define FLASH_EOP_vector 26 /* IRQ No. in STM8 manual: 24 */
#define FLASH_WR_PG_DIS_vector 26 /* IRQ No. in STM8 manual: 24 */
Код: Выделить всё
void interrupt_init(void);
#pragma vector=TIM1_OVR_UIF_vector
__interrupt void Pin6_interrupt(void)
{
k++;
if (k == 9)
{
k = 1;
}
x=6;
TIM1_SR1_bit.UIF = 0; //Cброс флага прерывания
}
if (x >= 5 && x < 10)
{
PB_ODR_bit.ODR5 = !PB_ODR_bit.ODR5;
}
Код: Выделить всё
#include "IOSTM8S103F3.h"
int x=0,k=1;
char i=1,j=0;
int interrupt_init(void);
#pragma vector=TIM1_OVR_UIF_vector
__interrupt void Pin6_interrupt(void)
{
k++;
if (k == 9)
{
k = 1;
}
x=6;
TIM1_SR1_bit.UIF = 0; //Cброс флага прерывания
}
Код: Выделить всё
#include "IOSTM8S103F3.h"
int x=0,k=1;
char i=1,j=0;
int interrupt_init(void);
#pragma vector=TIM1_OVR_UIF_vector
__interrupt void Pin6_interrupt(void)
{
k++;
if (k == 9)
{
k = 1;
}
x++;
if (x == 10000)
{
x = 0;
}
TIM1_SR1_bit.UIF = 0; //Cброс флага прерывания
}
int main (void)
{
PB_DDR_bit.DDR5 = 1; // Настройка 5-го бита порта B на вывод.
PB_ODR_bit.ODR5 = 1; // Гашение светодиода.
PB_CR1_bit.C15 = 1; // Переключение порта в режим push-pull.
PB_CR2_bit.C25 = 0; // Cкорость переключения до 2 МГц
//Частота переполнений = 2000000Гц / 4 / 500 = 1000 Гц(1 мс)
TIM1_PSCRH = 0x00;//записываем 2 старших байта числа 3(4-1) в hex формате в регистр предделителя
TIM1_PSCRL = 0x03;//записываем 2 младших байта числа 3(4-1)в hex формате в регистр предделителя
TIM1_ARRH = 0x01; //записываем 2 старших байта числа 500 в hex формате в регистр автоперезагруски
TIM1_ARRL = 0xF4; //записываем 2 младших байта числа 500 в hex формате в регистр автоперезагруски
TIM1_CR1_bit.DIR = 0; // Cчет вверх
TIM1_CR1_bit.URS = 1; //Прерывание только по переполнению счетчика
TIM1_EGR_bit.UG = 1; //Вызываем Update Event для загрузки предделителя
TIM1_IER_bit.UIE = 1; //Разрешаем прерывание
TIM1_CR1_bit.CEN = 1; //Запускаем таймер
asm("rim");
while(1)
{
if (x < 1000)
{
PB_ODR_bit.ODR5 = 0;
}
if ((x >= 1000) && (x < 2000))
{
PB_ODR_bit.ODR5 = 1;
}
if ((x >= 2000) && (x < 3000))
{
PB_ODR_bit.ODR5 = 0;
}
if ((x >= 3000) && (x < 4000))
{
PB_ODR_bit.ODR5 = 1;
}
if ((x >= 4000) && (x < 5000))
{
PB_ODR_bit.ODR5 = 0;
}
if ((x >= 5000) && (x < 6000))
{
PB_ODR_bit.ODR5 = 1;
}
if ((x >= 6000) && (x < 7000))
{
PB_ODR_bit.ODR5 = 0;
}
if ((x >= 7000) && (x < 8000))
{
PB_ODR_bit.ODR5 = 1;
}
if ((x >= 8000) && (x < 9000))
{
PB_ODR_bit.ODR5 = 0;
}
if ((x >= 9000) && (x < 10000))
{
PB_ODR_bit.ODR5 = 1;
}
}
}
Код: Выделить всё
#include "iostm8s103f3.h"
void interrupt_init(void);
#pragma vector=TIM1_OVR_UIF_vector
__interrupt void Pin6_interrupt(void)
{
PB_ODR_bit.ODR5 ^= 1; //Инвертировать значение 5 бита порта PB
TIM1_SR1_bit.UIF = 0; //Сброс флага прерывания
}
int main( void )
{
PB_DDR_bit.DDR5 = 1;
PB_CR1_bit.C15 = 0;
//Частота переполнений = 2000000Гц / 400 / 1000 = 5 Гц
TIM1_PSCRH = 0x01;//записываем 2 старших байта числа 399(4-1) в hex формате в регистр предделителя
TIM1_PSCRL = 0x8F;//записываем 2 младших байта числа 399(4-1)в hex формате в регистр предделителя
TIM1_ARRH = 0x03; //записываем 2 старших байта числа 1000 в hex формате в регистр автоперезагруски
TIM1_ARRL = 0xE8; //записываем 2 младших байта числа 1000 в hex формате в регистр автоперезагруски
TIM1_CR1_bit.DIR = 0; // Счет верх
TIM1_CR1_bit.URS = 1; //Прерывание только по переполнению счетчика
TIM1_EGR_bit.UG = 1; //Вызываем Update Event для загрузки предделителя
TIM1_IER_bit.UIE = 1; //Разрешаем прерывание
TIM1_CR1_bit.CEN = 1; //Запускаем таймер
asm("rim");
while(1);
}
Код: Выделить всё
#include "IOSTM8S103F3.h"
int x=0,k=1;
char i=1,j=0;
int interrupt_init(void);
#pragma vector=TIM1_OVR_UIF_vector
__interrupt void Pin6_interrupt(void)
{
k++;
if (k == 9)
{
k = 1;
}
x++;
if (x == 10000)
{
x = 0;
}
TIM1_SR1_bit.UIF = 0; //Cброс флага прерывания
}
int main (void)
{
PB_DDR_bit.DDR5 = 1; // Настройка 5-го бита порта B на вывод.
PB_ODR_bit.ODR5 = 1; // Гашение светодиода.
PB_CR1_bit.C15 = 1; // Переключение порта в режим push-pull.
PB_CR2_bit.C25 = 0; // Cкорость переключения до 2 МГц
//Частота переполнений = 2000000Гц / 4 / 500 = 1000 Гц(1 мс)
TIM1_PSCRH = 0x00;//записываем 2 старших байта числа 3(4-1) в hex формате в регистр предделителя
TIM1_PSCRL = 0x03;//записываем 2 младших байта числа 3(4-1)в hex формате в регистр предделителя
TIM1_ARRH = 0x01; //записываем 2 старших байта числа 500 в hex формате в регистр автоперезагруски
TIM1_ARRL = 0xF4; //записываем 2 младших байта числа 500 в hex формате в регистр автоперезагруски
TIM1_CR1_bit.DIR = 0; // Cчет вверх
TIM1_CR1_bit.URS = 1; //Прерывание только по переполнению счетчика
TIM1_EGR_bit.UG = 1; //Вызываем Update Event для загрузки предделителя
///////////////////////////////////////////////////////////////////
TIM1_SR1_bit.UIF = 0; // Выделил добавленную строку
//////////////////////////////////////////////////////////////////
TIM1_IER_bit.UIE = 1; //Разрешаем прерывание
TIM1_CR1_bit.CEN = 1; //Запускаем таймер
asm("rim");
while(1)
{
if (x < 1000)
{
PB_ODR_bit.ODR5 = 0;
}
...............Пропустил часть кода..................
if ((x >= 9000) && (x < 10000))
{
PB_ODR_bit.ODR5 = 1;
}
}
}
Код: Выделить всё
volatile int x=0,k=1;