21.04.2024, 21:19
|
|
Прохожий
Регистрация: 21.04.2024
Сообщений: 8
Сказал спасибо: 1
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
STM32 не уходит в прерывания
Написал код в keil. По идеи stm уходит в прерывания по таймеру и прибавляет к переменной 1. В debug флаг прерывания подымается а вектор прерывания не обрабатывается. Помогите пожалуйста.
Код:
|
#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);
} |
|
|
|
|
22.04.2024, 07:41
|
|
Заблокирован
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,486
Сказал спасибо: 396
Сказали Спасибо 2,220 раз(а) в 1,319 сообщении(ях)
|
Re: STM32 не уходит в прерывания
Всегда удивлялся, зачем в процессе изучения STM32 новички обязательно задирают частоту МК до максимума, аж 72 МГц, и при этом всего лишь проверяют, как считает таймер или как мигает светодиод. Ну это так, мелочи. Просто МК для этих целей прекрасно работает на частоте 8 МГц по умолчанию от HSI, и никаких настроек частоты и флеша для этого не требуется вообще.
Во-вторых, вот сначала настройте таймер, все его PSC, ARR и прочее, а потом и запускайте его, установив бит CEN.
В-третьих, MODIFY_REG для регистров PSC и ARR использовать не нужно. Надо просто записать новое число в регистры и всё: TIM2-›PSC = 3599. И кстати, в ARR тоже нужно записывать число на 1 меньше коэфф. деления, поскольку отсчет идет от 0.
В-четвертых, поставьте брекпоинт на строчку void TIM2_IRQHandler (void) и в отладке посмотрите, есть ли заход в нее и как пошагово выполняется эта функция от входа до выхода.
|
|
|
|
23.04.2024, 21:59
|
|
Почётный гражданин KAZUS.RU
Регистрация: 25.11.2010
Адрес: г. Дзержинск Нижегородская обл.
Сообщений: 1,682
Сказал спасибо: 130
Сказали Спасибо 1,085 раз(а) в 519 сообщении(ях)
|
Re: STM32 не уходит в прерывания
И тактовую неплохо вывести наружу. И глянуть на реальную частоту.
|
|
|
|
04.05.2024, 19:23
|
|
Прохожий
Регистрация: 21.04.2024
Сообщений: 8
Сказал спасибо: 1
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: STM32 не уходит в прерывания
Я переписал код. Но прерывания все равно не происходят
Код:
|
#include "stm32f10x.h"
int main(void)
{
//включить тактирование порта B
RCC-›APB2ENR |= 1‹‹3;
//настройка PB9
GPIOB-›CRH |= 1‹‹5;//B9-выход с максимальной частотой 2 МГц
GPIOB-›CRH |= 1‹‹6;//B9-с открытым стоком
//настройка таймера
RCC-›APB1ENR |= 1;//включить тактирование таймера 2
NVIC_EnableIRQ (TIM2_IRQn);//разрешить перывания таймера 2
TIM2-›PSC = 7200-1;//насколько делится максимальная частота (+1)
TIM2-›ARR = 10000-1;//до скольки таймер считает (+1)
TIM2-›DIER |= 1;//разрешаем прерывания таймера 2
TIM2-›CR1 |= 1;//запускаем счет
while(1){}
}
void TIM2_IRQHandler() //Функция обработчика прерывания от таймера 2
{
TIM2-›SR &= ~1;//сбрасываем бит вызова прерывания
GPIOB-›ODR ^= (1‹‹9);//Инвертируем состояние вывода - зажигаем/гасим светодиод
} |
|
|
|
|
04.05.2024, 19:23
|
|
Прохожий
Регистрация: 21.04.2024
Сообщений: 8
Сказал спасибо: 1
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: STM32 не уходит в прерывания
В keil есть какие-то особенности по симуляции МК?
|
|
|
|
04.05.2024, 19:32
|
|
Заблокирован
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,486
Сказал спасибо: 396
Сказали Спасибо 2,220 раз(а) в 1,319 сообщении(ях)
|
Re: STM32 не уходит в прерывания
Ах, так это симуууляяяятор... Понятно. Он там косячный. Купите на Алиэкспрессе демоплату STM32 BluePill и "свисток" ST-Link за 300 руб в сумме и ковыряйте по-человечьи в железе.
Ну и поставьте CubeIDE - с кодогенератором меньше ошибок в конфигурациях будет.
PS. Чтобы вызывался код прерываний, нужен присутствующий файл с описанием таблицы векторов прерываний. Обычно, это ассемблерный файл startup_stm32f10x_md.s
|
|
|
|
04.05.2024, 19:39
|
|
Прохожий
Регистрация: 21.04.2024
Сообщений: 8
Сказал спасибо: 1
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: STM32 не уходит в прерывания
Понял. Комплект у меня есть. Надо было сразу на нем тестить. Спасибо. А есть ли вариант скачать cubeIDE без пиратства и vpn?
|
|
|
|
04.05.2024, 20:04
|
|
Заблокирован
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,486
Сказал спасибо: 396
Сказали Спасибо 2,220 раз(а) в 1,319 сообщении(ях)
|
Re: STM32 не уходит в прерывания
Сейчас - нету. Да забейте на это якобы "пиратство", он изначально CubeIDE бесплатен, в отличие от Кейла. Ну и вообще, нынче это зовется "трофеями", и стесняться тут нечего
Впрочем, CubeIDE вовсе необязателен. Можете продолжать в Кейле, это не принципиально для начала изучения.
|
|
|
|
05.05.2024, 16:29
|
|
Прохожий
Регистрация: 21.04.2024
Сообщений: 8
Сказал спасибо: 1
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: STM32 не уходит в прерывания
В третий раз переписал код. В прерывания и на плате не уходит. Такое чувство что Keil целиком кривой.
Код:
|
#include "stm32f10x.h"
void TIM2_IRQHandler() //Функция обработчика прерывания от таймера 2
{
TIM2-›SR &= ~1;//сбрасываем бит вызова прерывания
//GPIOC-›ODR^=GPIO_ODR_ODR13;
SET_BIT(GPIOC-›ODR,GPIO_ODR_ODR13);
}
int main(void)
{
//RCC-›APB2ENR|=RCC_APB2ENR_IOPAEN;
SET_BIT(RCC-›APB2ENR,RCC_APB2ENR_IOPCEN);
SET_BIT(RCC-›APB1ENR,RCC_APB1ENR_TIM2EN);
//GPIOA-›CRL&=0x00000000;
//GPIOA-›CRL=0x00000002;
GPIOC-›CRH=0;
SET_BIT(GPIOC-›CRH,GPIO_CRH_MODE13_1);
SET_BIT(GPIOC-›CRH,GPIO_CRH_CNF13_0);
NVIC_EnableIRQ(TIM2_IRQn);
TIM2-›PSC=7000;
TIM2-›ARR=9000;
SET_BIT(TIM2-›DIER,TIM_DIER_UIE);
SET_BIT(TIM2-›CR1,TIM_CR1_CEN);
while(1)
{
}
} |
|
|
|
|
05.05.2024, 17:26
|
|
Гуру портала
Регистрация: 17.07.2010
Адрес: мурмурляндия
Сообщений: 10,557
Сказал спасибо: 180
Сказали Спасибо 3,155 раз(а) в 2,041 сообщении(ях)
|
Re: STM32 не уходит в прерывания
Сообщение от sanekfps
|
Такое чувство что Keil целиком кривой
|
да сам ты кривой.
никгда ни на каких стм у меня не было глюков в кеиле!!
пиши битами и ничо тебе кеил не перепутает.
__________________
кагмаподэ магмаподэ
Последний раз редактировалось индюк; 05.05.2024 в 17:36.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 10:35.
|
|