Ответы в темах
-
АвторСообщения
-
Sanekfps2024
УчастникДобрый день. У меня проблема. STM32f103 не уходит в прерывание по таймеру. Флаг прерывания подымается а вектор не обрабатывается.
код:
#include «stm32f10x.h»
#define SYSCLOCK 72000000Uunsigned 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);}
-
АвторСообщения
-
АвторСообщения
-
Добрый день. У меня проблема. STM32f103 не уходит в прерывание по таймеру. Флаг прерывания подымается а вектор не обрабатывается.
код:
#include «stm32f10x.h»
#define SYSCLOCK 72000000Uunsigned 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);}
-
АвторСообщения