@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, но совершенно не понимаю как это реализовать.
  • Вопрос задан
  • 4087 просмотров
Решения вопроса 1
@Eddy_Em
Как пример могу посоветовать мою управлялку шаговыми двигателями. Тактовые импульсы задаются тремя независимыми генераторами.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы