Sanekfps2024



Ответы в темах

Просмотр 1 сообщения - с 1 по 1 (всего 1)
  • Автор
    Сообщения
  • в ответ на: Программирование МК STM32 #26231
    Sanekfps2024
    Участник

    Добрый день. У меня проблема. STM32f103 не уходит в прерывание по таймеру. Флаг прерывания подымается а вектор не обрабатывается.
    код:
    #include «stm32f10x.h»
    #define SYSCLOCK 72000000U

    unsigned long long int _time=0;

    //описание вектора прерывания
    void TIM2_IRQHandler (void) {

    if(READ_BIT(TIM2->SR, TIM_SR_UIF))//проверка флага перевания
    {
    CLEAR_BIT(TIM2->SR, TIM_SR_UIF);//сброч флага
    }
    _time++;

    }

    void ClockInit(void)
    {
    SET_BIT(RCC->CR,RCC_CR_HSION);

    while(READ_BIT(RCC->CR, RCC_CR_HSIRDY) == RESET);

    MODIFY_REG(RCC->CFGR,RCC_CFGR_PLLMULL,0x07);//PLL множитель равен 9
    SET_BIT(RCC->CFGR,RCC_CFGR_PLLSRC); //Тактирование PLL от HSE
    while(READ_BIT(RCC->CR, RCC_CR_PLLRDY) == RESET);
    //Устанавливаем 2 цикла ожидания для Flash
    //так как частота ядра у нас будет 48 MHz < SYSCLK <= 72 MHz
    MODIFY_REG(FLASH->ACR,FLASH_ACR_LATENCY,0x02);
    //Делители
    MODIFY_REG(RCC->CFGR,RCC_CFGR_PPRE2,0x00);
    MODIFY_REG(RCC->CFGR,RCC_CFGR_PPRE1,0x04);
    MODIFY_REG(RCC->CFGR,RCC_CFGR_HPRE,0x00);
    //Переключаем на внешний pll
    MODIFY_REG(RCC->CFGR,RCC_CFGR_SW,0x02);
    //ждем завершения
    while(READ_BIT(RCC->CFGR, RCC_CFGR_SWS_1) == RESET);
    //отклюбчем внутрению RC
    CLEAR_BIT(RCC->CR,RCC_CR_HSION);
    //SYSCLOCK = 8MHz * 9=72MHz;
    }

    void Timer2Init()
    {
    SET_BIT(RCC->APB1ENR,RCC_APB1ENR_TIM2EN);//включили тактиирование таймера
    SET_BIT(TIM2->CR1,TIM_CR1_CEN);//запускаем счет таймера
    MODIFY_REG(TIM2->PSC,TIM_PSC_PSC,3599);//делитель частоты
    MODIFY_REG(TIM2->ARR,TIM_ARR_ARR,2000);//длительность
    SET_BIT(TIM2->DIER,TIM_DIER_UIE);//разрешаем прерывания таймеру

    }

    int main()
    {

    ClockInit();
    Timer2Init();

    NVIC_EnableIRQ(TIM2_IRQn); //разрешаем прерывание в регистре перывания
    __enable_irq ();
    while(1);

    }

  • Автор
    Сообщения
  • в ответ на: Программирование МК STM32 #26231

    Sanekfps2024
    Участник
    • Оффлайн

    Добрый день. У меня проблема. STM32f103 не уходит в прерывание по таймеру. Флаг прерывания подымается а вектор не обрабатывается.
    код:
    #include «stm32f10x.h»
    #define SYSCLOCK 72000000U

    unsigned long long int _time=0;

    //описание вектора прерывания
    void TIM2_IRQHandler (void) {

    if(READ_BIT(TIM2->SR, TIM_SR_UIF))//проверка флага перевания
    {
    CLEAR_BIT(TIM2->SR, TIM_SR_UIF);//сброч флага
    }
    _time++;

    }

    void ClockInit(void)
    {
    SET_BIT(RCC->CR,RCC_CR_HSION);

    while(READ_BIT(RCC->CR, RCC_CR_HSIRDY) == RESET);

    MODIFY_REG(RCC->CFGR,RCC_CFGR_PLLMULL,0x07);//PLL множитель равен 9
    SET_BIT(RCC->CFGR,RCC_CFGR_PLLSRC); //Тактирование PLL от HSE
    while(READ_BIT(RCC->CR, RCC_CR_PLLRDY) == RESET);
    //Устанавливаем 2 цикла ожидания для Flash
    //так как частота ядра у нас будет 48 MHz < SYSCLK <= 72 MHz
    MODIFY_REG(FLASH->ACR,FLASH_ACR_LATENCY,0x02);
    //Делители
    MODIFY_REG(RCC->CFGR,RCC_CFGR_PPRE2,0x00);
    MODIFY_REG(RCC->CFGR,RCC_CFGR_PPRE1,0x04);
    MODIFY_REG(RCC->CFGR,RCC_CFGR_HPRE,0x00);
    //Переключаем на внешний pll
    MODIFY_REG(RCC->CFGR,RCC_CFGR_SW,0x02);
    //ждем завершения
    while(READ_BIT(RCC->CFGR, RCC_CFGR_SWS_1) == RESET);
    //отклюбчем внутрению RC
    CLEAR_BIT(RCC->CR,RCC_CR_HSION);
    //SYSCLOCK = 8MHz * 9=72MHz;
    }

    void Timer2Init()
    {
    SET_BIT(RCC->APB1ENR,RCC_APB1ENR_TIM2EN);//включили тактиирование таймера
    SET_BIT(TIM2->CR1,TIM_CR1_CEN);//запускаем счет таймера
    MODIFY_REG(TIM2->PSC,TIM_PSC_PSC,3599);//делитель частоты
    MODIFY_REG(TIM2->ARR,TIM_ARR_ARR,2000);//длительность
    SET_BIT(TIM2->DIER,TIM_DIER_UIE);//разрешаем прерывания таймеру

    }

    int main()
    {

    ClockInit();
    Timer2Init();

    NVIC_EnableIRQ(TIM2_IRQn); //разрешаем прерывание в регистре перывания
    __enable_irq ();
    while(1);

    }

Просмотр 1 сообщения - с 1 по 1 (всего 1)