DCVostok / vostok-1-frmwrk-vn-arduino

Arduino core support for Vostok boards based on k1921vk MCUs
13 stars 0 forks source link

Прерывания АЦП #4

Open teneg13 opened 7 months ago

teneg13 commented 7 months ago

Написал программу инверсии порта при заходе в прерывание АЦП по таймеру, код написан по руководству, но почему то не заходит в прерывание.

#include <inttypes.h> // ?
#include <K1921VK035.h>
#include <math.h>
int main() {
//RCU
RCU->OSICFG_bit.EN=1; // включение осциллиратора
RCU->OSICFG_bit.CAL=8; // подстройка частоты внутр осциллиратора на 8МГц
RCU->PLLCFG_bit.REFSRC=1;//Выбор источника тактирования
RCU->PLLCFG_bit.N=2;//коэф N
RCU->PLLCFG_bit.M=50;//коэф M
RCU->PLLCFG_bit.OD=1;//коэф OD
RCU->PLLCFG_bit.OUTEN=1;//Разрешение вывода частоты с PLL
RCU->SYSCLKCFG_bit.SYSSEL= 2; //тактовый сигнал с PLL для системного тактового сигнала
RCU->ADCCFG_bit.CLKSEL= 1; // Выбираем в качестве источника выходную частоту
 RCU->ADCCFG_bit.DIVN = 1; // делитель частоты на 4
RCU->ADCCFG_bit.DIVEN= 1; // разрешение делителя входного сигнала
RCU->ADCCFG_bit.CLKEN= 1; // включение тактирования блока АЦП
RCU->ADCCFG_bit.RSTDIS= 1; // отключение сброса
RCU->PCLKCFG_bit.TMR0EN= 1;
RCU->PRSTCFG_bit.TMR0EN= 1;
RCU->HCLKCFG_bit.GPIOBEN = 1; // Enable clocking of GPIOB
RCU->HRSTCFG_bit.GPIOBEN = 1; // Remove Reset of GPIOB
// Настройка таймера
TMR0->LOAD= 999999; 
TMR0->ADCSOC_bit.EN = 1;//разрешение управления АЦП таймером
//ADC
ADC->ACTL_bit.ADCEN = 1; // разрешение работы АЦП
ADC->EMUX_bit.EM0 = 3; //срабатывание от таймера
ADC->SEQ[0].SCCTL_bit.ICNT = 0;//количество записей в FIFO для прерывания
ADC->SEQ[0].SCCTL_bit.RCNT = 0;//количество перезапусков
ADC->SEQ[0].SRTMR = 0; // время задержки перезапуска секвенсора 0
ADC->SEQ[0].SRQCTL_bit.RQMAX = 0; // измерения по одному каналу
ADC->SEQ[0].SRQSEL_bit.RQ0 =0; //приоретет опроса
ADC->SEQEN_bit.SEQEN0 = 1;//разрешение работы сенквенстора
ADC->IM_bit.SEQIM0 = 1;
Энвик_EnableIRQ(ADC_SEQ0_IRQn);
// Запуск
while(!ADC->ACTL_bit.ADCRDY);
TMR0->CTRL_bit.ON = 1; //включение таймера
//порт
GPIOB->DENSET = 0b1UL << 5;          // Connect pin 5 to digital subsystem
GPIOB->INMODE |= 0b11UL << 10;       // Input functionality disabled
GPIOB->PULLMODE &= ~(0b11UL << 10);  // No Pull Up/Down
GPIOB->OUTMODE &= ~(0b11UL << 10);   // Output push-pull
GPIOB->DRIVEMODE &= ~(0b11UL << 10); // High speed, high current
GPIOB->OUTENSET = 0b1UL << 5;        // Enable pin control by DataOut reg
GPIOB->ALTFUNCCLR = 0b1UL << 5;      // Disable alt func at the pin
while(1);
}
void ADC_SEQ0_IRQHandler ()
{
GPIOB->DATAOUTTGL = 0b1UL << 5; //инверсия выхода
ADC->IC_bit.SEQIC0 = 1;// сброс флага
}
KHIPSTERcat commented 7 months ago

Не могли бы вы указать руководство, среду и версию SDK которыми вы пользовались?

KHIPSTERcat commented 7 months ago
#include <K1921VK035.h>
#include <math.h>

void ADC_SEQ0_IRQHandler () {
    GPIOB->DATAOUTTGL = 0b1UL << 5; //инверсия выхода
    ADC->IC_bit.SEQIC0 = 1;// сброс флага
}

int main() {
//RCU
    RCU->OSICFG_bit.EN=1; // включение осциллиратора
    RCU->OSICFG_bit.CAL=8; // подстройка частоты внутр осциллиратора на 8МГц
    RCU->PLLCFG_bit.REFSRC=1;//Выбор источника тактирования
    RCU->PLLCFG_bit.N=2;//коэф N
    RCU->PLLCFG_bit.M=50;//коэф M
    RCU->PLLCFG_bit.OD=1;//коэф OD
    RCU->PLLCFG_bit.OUTEN=1;//Разрешение вывода частоты с PLL
    RCU->SYSCLKCFG_bit.SYSSEL= 2; //тактовый сигнал с PLL для системного тактового сигнала
    RCU->ADCCFG_bit.CLKSEL= 1; // Выбираем в качестве источника выходную частоту
    RCU->ADCCFG_bit.DIVN = 1; // делитель частоты на 4
    RCU->ADCCFG_bit.DIVEN= 1; // разрешение делителя входного сигнала
    RCU->ADCCFG_bit.CLKEN= 1; // включение тактирования блока АЦП
    RCU->ADCCFG_bit.RSTDIS= 1; // отключение сброса
    RCU->PCLKCFG_bit.TMR0EN= 1;
    RCU->PRSTCFG_bit.TMR0EN= 1;
    RCU->HCLKCFG_bit.GPIOBEN = 1; // Enable clocking of GPIOB
    RCU->HRSTCFG_bit.GPIOBEN = 1; // Remove Reset of GPIOB
    // Настройка таймера
    TMR0->LOAD= 999999; 
    TMR0->ADCSOC_bit.EN = 1;//разрешение управления АЦП таймером
    //ADC
    ADC->ACTL_bit.ADCEN = 1; // разрешение работы АЦП
    ADC->EMUX_bit.EM0 = 3; //срабатывание от таймера
    ADC->SEQ[0].SCCTL_bit.ICNT = 0;//количество записей в FIFO для прерывания
    ADC->SEQ[0].SCCTL_bit.RCNT = 0;//количество перезапусков
    ADC->SEQ[0].SRTMR = 0; // время задержки перезапуска секвенсора 0
    ADC->SEQ[0].SRQCTL_bit.RQMAX = 0; // измерения по одному каналу
    ADC->SEQ[0].SRQSEL_bit.RQ0 =0; //приоретет опроса
    ADC->SEQEN_bit.SEQEN0 = 1;//разрешение работы сенквенстора
    ADC->IM_bit.SEQIM0 = 1;
    NVIC_EnableIRQ(ADC_SEQ0_IRQn);
    // Запуск
    while(!ADC->ACTL_bit.ADCRDY);
    TMR0->CTRL_bit.ON = 1; //включение таймера
    //порт
    GPIOB->DENSET = 0b1UL << 5;          // Connect pin 5 to digital subsystem
    GPIOB->INMODE |= 0b11UL << 10;       // Input functionality disabled
    GPIOB->PULLMODE &= ~(0b11UL << 10);  // No Pull Up/Down
    GPIOB->OUTMODE &= ~(0b11UL << 10);   // Output push-pull
    GPIOB->DRIVEMODE &= ~(0b11UL << 10); // High speed, high current
    GPIOB->OUTENSET = 0b1UL << 5;        // Enable pin control by DataOut reg
    GPIOB->ALTFUNCCLR = 0b1UL << 5;      // Disable alt func at the pin
    while(1);
}

Исправили название функции включения прерывания Энвик_EnableIRQ(ADC_SEQ0_IRQn), на NVIC_EnableIRQ(ADC_SEQ0_IRQn). После исправления программа успешно запустилась на плате UNO-VN035.

teneg13 commented 7 months ago

Не могли бы вы указать руководство, среду и версию SDK которыми вы пользовались? SDK - Arduino IDE 2.1.1, платформа версии 1.0.3 1921VK035.pdf

teneg13 commented 7 months ago

к сожалению код не заработал

teneg13 commented 7 months ago

Есть ли возможность во время работы программы смотреть что лежит в регистрах и ставить точки остановы?

kenny5660 commented 7 months ago

Да полноценный debug поддерживается в ide VScode с расширением platfrmio. Для вашего кода не требуется зависимости от Arduino framework, достаточно будет k1921vk_sdk. Можно начать с этого примера проекта NIIET_SDK_vostok_uno_vn035_led_blink