@Glavryba

Как реализовать генератор импульсов на STM8?

Осваиваю потихоньку МК STM8 (STM8S-Discovery), задался идеей реализовать генератор прямоугольных импульсов. Никак не могу разобраться, как вывести результат на штатный светодиод. Задача устройства по нажатию на кнопку начинать выдавать прямоугольные импульсы с определенной задержкой. По фронту импульсов необходимо зажигать светодиод.

Как программа выглядит на данный момент
#define CCR1_Val ((uint16_t)976)
#define CCR2_Val ((uint16_t)488)
#define CCR3_Val  ((uint8_t)244)

void TIM1_Config(void);
void GPIO_Config(void);

//timer up mode, compare toggle mode
__interrupt void Timer_Compare_isr();


u8 edgeNum = 7;
u16 edges[7] = {50,100,50,500,50,100,50};

void main(void)
{
 //Инициализируем CLK
  CLK_ECKR_bit.HSEEN=1;     //Разрешаем работу генератора с внешним кварцем (HSEEN)
  CLK_SWCR_bit.SWEN=1;      //Разрешаем переключение генераторов;
  CLK_SWR=0xB4;             //Выбираем clock от кварцевого генератора (HSE)
  CLK_CKDIVR=0;             //Делители частоты внутреннего и внешнего генератора на 1 - частота ядра максимальная
  while(CLK_CMSR!=0xB4);    //Ждем стабилизации частоты
  CLK_CSSR_bit.CSSEN=1;     //Разрешаем автопереключение источника Clock на внутренний при неисправности генератора
 /* GPIO configuration -----------------------------------------*/
  GPIO_Config();  
//Инициализируем TIM1
  TIM1_DeInit();
 
  TIM1_ClearFlag(TIM1_FLAG_UPDATE);
  TIM1_TimeBaseInit(128,TIM1_COUNTERMODE_UP  
 , 125, 0);
    TIM1_ITConfig(TIM1_IT_UPDATE, ENABLE);
    TIM1_IER_bit.UIE=1;       //Разрешаем генерацию прерывания при переполнеини
    TIM1_CCMR1=1;  

   
  TIM1_CR1_bit.CEN=1;       //Разрешаем счет

  __enable_interrupt();     //Разрешаем прерывания
  u8 key;

  while (1)
   {
 
   key = GPIO_ReadInputPin(GPIOB, GPIO_PIN_6);
   
    if ( !key ){
    TIM1_CR1_bit.CEN=1;
   static u8 idx = 0;
  TIM1_CCR1H += edges[idx++];
 
 if (idx >= edgeNum){
    idx = 0;
    GPIO_WriteHigh(GPIOD, GPIO_PIN_0);
    TIM1_CR1_CEN = 0;
  }
  if (!TIM1_CHANNEL_1) {
    GPIO_WriteHigh(GPIOD, GPIO_PIN_0); }  
 }
} }
static void GPIO_Config(void)
{
 
  GPIO_Init(GPIOD, GPIO_PIN_0, GPIO_MODE_OUT_PP_LOW_FAST);
   GPIO_Init(GPIOB, GPIO_PIN_6, GPIO_MODE_IN_PU_NO_IT );


Я осознаю, что работать надо через TIM1_CHx, но совершенно не понимаю как это реализовать.
  • Вопрос задан
  • 4066 просмотров
Решения вопроса 1
@Eddy_Em
Как пример могу посоветовать мою управлялку шаговыми двигателями. Тактовые импульсы задаются тремя независимыми генераторами.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы