Использую TIM1. Требуется выводить меандр в режиме TIM1_OCMODE_TOGGLE. Сам таймер дышит, значения счётчика меняются, компаратор срабатывает, а сигнала на выходе нет. Что-то ничего не нашёл как эти OCi привязываются к конкретным ножкам МК. Может, здесь у меня затык.
TIM1_DeInit();
TIM1_TimeBaseInit(TIM1_PRESCALER, TIM1_COUNTERMODE_UP, TIM1_PERIOD, 0);
TIM1_OC1Init(TIM1_OCMODE_TOGGLE, TIM1_OUTPUTSTATE_ENABLE, TIM1_OUTPUTNSTATE_DISABLE,
0, TIM1_OCPOLARITY_HIGH, TIM1_OCNPOLARITY_HIGH, TIM1_OCIDLESTATE_SET,
TIM1_OCNIDLESTATE_RESET);
TIM1_OC2Init(TIM1_OCMODE_TOGGLE, TIM1_OUTPUTSTATE_ENABLE, TIM1_OUTPUTNSTATE_DISABLE,
GradazSdvig, TIM1_OCPOLARITY_HIGH, TIM1_OCNPOLARITY_HIGH, TIM1_OCIDLESTATE_SET,
TIM1_OCNIDLESTATE_RESET);
CLK_PeripheralClockConfig(CLK_PERIPHERAL_TIMER1, ENABLE);
TIM1_CCxCmd(TIM1_CHANNEL_1, ENABLE);
TIM1_Cmd(ENABLE);
Вроде фиксировано, что-то из серии:
- CH1 - PC6
- CH2 - PC7
Надо еще настройку пинов добавить и, возможно, TIM1_CtrlPWMOutputs(ENABLE); перед TIM1_Cmd(ENABLE);
Вроде фиксировано, что-то из серии:
- CH1 - PC6
- CH2 - PC7
Возможно, но упоминании об этом нигде не нашёл.
Надо еще настройку пинов добавить и, возможно, TIM1_CtrlPWMOutputs(ENABLE); перед TIM1_Cmd(ENABLE);
Настройка пинов есть. TIM1_CtrlPWMOutputs(ENABLE); не помогло.
Выяснилось, что для STM8S103F нет выходов для первого и второго каналов TIM1 (порт С, к которому привязаны выходы TIM1, начинается с выходов PC3), хотя STM8CubeMX предлагает другие выходы (не порта С), что меня и сбило с толку. Этот этап проехал перейдя на третий и четвёртый каналы. Но на новый уровень этой игры, касающийся прерываний по окончанию преобразования ADC, мне пока перейти не удаётся. Настроить запуск АЦП от события переполнения таймера 1 мне, как я считаю, удалось. Этот вывод делаю из того, что если в бесконечном цикле делаю такую проверку
if( ADC1_GetFlagStatus( ADC1_FLAG_EOC))
{
resultat_ADC1 = ADC1_GetConversionValue(); //Читаем результат преобразования.
GPIO_WriteReverse(GPIOD, GPIO_PIN_4);
ADC1_ClearFlag( ADC1_FLAG_EOC);
}
, то вижу реальные результаты преобразования. При этом инициализация глобального прерывания enableInterrupts(); закоментирована. Если её раскоментирую, то значения с АЦП больше не меняются, и в обработчик прерываний программа не попадает. Наверное, что-то ещё надо настраивать для обеспечения правильного прерывания.
main()
{
TIM1_PERIOD = GradazSdvig - 1; // Период счета TIM1
TIM1_PRECALER = (uint16_t)(CLK_HSI_RC / (4.0*f_Sig*(float)GradazSdvig)) - 1; // Предделитель TIM1
GPIO_Init(GPIOD, GPIO_PIN_2, GPIO_MODE_IN_FL_NO_IT);
GPIO_Init(GPIOD, GPIO_PIN_4, GPIO_MODE_OUT_PP_HIGH_FAST);
clk_Config();
//enableInterrupts();
TIM1_Config();
ADC1_Config();
while (1)
{
//result_ADC1 = ADC1_GetConversionValue();
//ADC1_ClearFlag( ADC1_FLAG_EOC);
if( ADC1_GetFlagStatus( ADC1_FLAG_EOC))
{
resultat_ADC1 = ADC1_GetConversionValue(); //Читаем результат преобразования.
GPIO_WriteReverse(GPIOD, GPIO_PIN_4);
ADC1_ClearFlag( ADC1_FLAG_EOC);
}
}
}
static void TIM1_Config(void)
{
TIM1_DeInit();
TIM1_TimeBaseInit(TIM1_PRECALER, TIM1_COUNTERMODE_UP, TIM1_PERIOD, 0);
/*TIM1_Pulse = CCR3_Val*/
TIM1_OC3Init(
TIM1_OCMODE_PWM1,
TIM1_OUTPUTSTATE_ENABLE,
TIM1_OUTPUTNSTATE_DISABLE,
4, // ШИМ 4/8, отладка
TIM1_OCPOLARITY_HIGH,
TIM1_OCNPOLARITY_HIGH,
TIM1_OCIDLESTATE_SET,
TIM1_OCNIDLESTATE_RESET);
/*TIM1_Pulse = CCR4_Val*/
TIM1_OC4Init(
TIM1_OCMODE_PWM1,
TIM1_OUTPUTSTATE_ENABLE,
Sdvig,
TIM1_OCPOLARITY_LOW,
TIM1_OCIDLESTATE_SET);
//TIM1_UpdateDisableConfig (ENABLE); // Enables or Disables the TIM1 Update event.
TIM1_SelectOutputTrigger(TIM1_TRGOSOURCE_UPDATE); // Настройка выходного триггера таймера
//TIM1_UpdateDisableConfig (ENABLE); // Enables or Disables the TIM1 Update event.
TIM1_CtrlPWMOutputs(ENABLE); // TIM1 Main Output Enable
TIM1_Cmd(ENABLE); // TIM1 counter enable
}
static void ADC1_Config(void)
{
ADC1_DeInit();
ADC1_Init(
ADC1_CONVERSIONMODE_SINGLE, // Непрерывное преобразование
ADC1_CHANNEL_3, // Канал 3, PD2
ADC1_PRESSEL_FCPU_D8, //Prescaler selection fADC1 = fcpu/8, 2 мГц
ADC1_EXTTRIG_TIM, // Conversion from Internal TIM1 TRGO event.
ENABLE, // Разрешение внешнего тактирования.
//DISABLE, // Разрешение внешнего тактирования.
ADC1_ALIGN_RIGHT, // Правое выравнивание
ADC1_SCHMITTTRIG_CHANNEL3, //параметр выбирает вывод для включения или отключения SchmittTrigger, внутрисхемное отключения вывода от лишних узлов для предотвращения искажения конвертируемого сигнала.
DISABLE); // Преобразование без триггера Шмидта. Относится к предыдущему параметрру
//ADC1_Cmd(ENABLE);
ADC1_ClearFlag( ADC1_FLAG_EOC);
ADC1_ITConfig( ADC1_IT_EOCIE, ENABLE); //Включаем прерывание от окончания преобразования.
//enableInterrupts(); // Разрешениие прерывания
//ADC1_StartConversion();
//ADC1->CR1 = 1;
//ADC1->CR1 = 1;
//ADC1_ClearFlag( ADC1_FLAG_EOC);
ADC1_Cmd(ENABLE);
}
INTERRUPT_HANDLER(ADC1_IRQHandler, 22)
{
if( ADC1_GetFlagStatus( ADC1_FLAG_EOC))
{
resultat_ADC1 = ADC1_GetConversionValue(); //Читаем результат преобразования.
ADC1_ClearFlag( ADC1_FLAG_EOC);
}
}
т