Реклама на сайте DatasheetsDatasheets

KAZUS.RUN - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Книги и журналы
FAQ по электронике

  Datasheets
Поиск SMD
Онлайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Схемы и проекты
Принципиальные схемы
  Программы
Каталог сайтов
Калькуляторы
  Форумы по электронике
Помощь проекту


 
Опции темы

STM32 не уходит в прерывания

Непрочитано 21.04.2024, 21:19  
sanekfps
Прохожий
 
Регистрация: 21.04.2024
Сообщений: 8
Сказал спасибо: 1
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
sanekfps на пути к лучшему
По умолчанию 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);
	
	

}
Реклама:
sanekfps вне форума  
Непрочитано 22.04.2024, 07:41  
NewWriter
Почётный гражданин KAZUS.RUN
 
Аватар для NewWriter
 
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,481
Сказал спасибо: 396
Сказали Спасибо 2,222 раз(а) в 1,317 сообщении(ях)
NewWriter на пути к лучшему
По умолчанию Re: STM32 не уходит в прерывания

Всегда удивлялся, зачем в процессе изучения STM32 новички обязательно задирают частоту МК до максимума, аж 72 МГц, и при этом всего лишь проверяют, как считает таймер или как мигает светодиод. Ну это так, мелочи. Просто МК для этих целей прекрасно работает на частоте 8 МГц по умолчанию от HSI, и никаких настроек частоты и флеша для этого не требуется вообще.

Во-вторых, вот сначала настройте таймер, все его PSC, ARR и прочее, а потом и запускайте его, установив бит CEN.

В-третьих, MODIFY_REG для регистров PSC и ARR использовать не нужно. Надо просто записать новое число в регистры и всё: TIM2-›PSC = 3599. И кстати, в ARR тоже нужно записывать число на 1 меньше коэфф. деления, поскольку отсчет идет от 0.

В-четвертых, поставьте брекпоинт на строчку void TIM2_IRQHandler (void) и в отладке посмотрите, есть ли заход в нее и как пошагово выполняется эта функция от входа до выхода.
__________________
Убейте шизофреника Вовку Стогова!
NewWriter вне форума  
Непрочитано 23.04.2024, 21:59  
DanilinSA
Почётный гражданин KAZUS.RUN
 
Регистрация: 25.11.2010
Адрес: г. Дзержинск Нижегородская обл.
Сообщений: 1,801
Сказал спасибо: 133
Сказали Спасибо 1,152 раз(а) в 549 сообщении(ях)
DanilinSA на пути к лучшему
По умолчанию Re: STM32 не уходит в прерывания

И тактовую неплохо вывести наружу. И глянуть на реальную частоту.
DanilinSA вне форума  
Непрочитано 04.05.2024, 19:23  
sanekfps
Прохожий
 
Регистрация: 21.04.2024
Сообщений: 8
Сказал спасибо: 1
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
sanekfps на пути к лучшему
По умолчанию 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);//Инвертируем состояние вывода - зажигаем/гасим светодиод
}
sanekfps вне форума  
Непрочитано 04.05.2024, 19:23  
sanekfps
Прохожий
 
Регистрация: 21.04.2024
Сообщений: 8
Сказал спасибо: 1
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
sanekfps на пути к лучшему
По умолчанию Re: STM32 не уходит в прерывания

В keil есть какие-то особенности по симуляции МК?
sanekfps вне форума  
Непрочитано 04.05.2024, 19:32  
NewWriter
Почётный гражданин KAZUS.RUN
 
Аватар для NewWriter
 
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,481
Сказал спасибо: 396
Сказали Спасибо 2,222 раз(а) в 1,317 сообщении(ях)
NewWriter на пути к лучшему
По умолчанию Re: STM32 не уходит в прерывания

Ах, так это симуууляяяятор... Понятно. Он там косячный. Купите на Алиэкспрессе демоплату STM32 BluePill и "свисток" ST-Link за 300 руб в сумме и ковыряйте по-человечьи в железе.
Ну и поставьте CubeIDE - с кодогенератором меньше ошибок в конфигурациях будет.

PS. Чтобы вызывался код прерываний, нужен присутствующий файл с описанием таблицы векторов прерываний. Обычно, это ассемблерный файл startup_stm32f10x_md.s
__________________
Убейте шизофреника Вовку Стогова!
NewWriter вне форума  
Непрочитано 04.05.2024, 19:39  
sanekfps
Прохожий
 
Регистрация: 21.04.2024
Сообщений: 8
Сказал спасибо: 1
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
sanekfps на пути к лучшему
По умолчанию Re: STM32 не уходит в прерывания

Понял. Комплект у меня есть. Надо было сразу на нем тестить. Спасибо. А есть ли вариант скачать cubeIDE без пиратства и vpn?
sanekfps вне форума  
Непрочитано 04.05.2024, 20:04  
NewWriter
Почётный гражданин KAZUS.RUN
 
Аватар для NewWriter
 
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,481
Сказал спасибо: 396
Сказали Спасибо 2,222 раз(а) в 1,317 сообщении(ях)
NewWriter на пути к лучшему
По умолчанию Re: STM32 не уходит в прерывания

Сейчас - нету. Да забейте на это якобы "пиратство", он изначально CubeIDE бесплатен, в отличие от Кейла. Ну и вообще, нынче это зовется "трофеями", и стесняться тут нечего
Впрочем, CubeIDE вовсе необязателен. Можете продолжать в Кейле, это не принципиально для начала изучения.
__________________
Убейте шизофреника Вовку Стогова!
NewWriter вне форума  
Непрочитано 05.05.2024, 16:29  
sanekfps
Прохожий
 
Регистрация: 21.04.2024
Сообщений: 8
Сказал спасибо: 1
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
sanekfps на пути к лучшему
По умолчанию 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)
 {

 }

 
}
sanekfps вне форума  
Непрочитано 05.05.2024, 17:26  
индюк
Гуру портала
 
Аватар для индюк
 
Регистрация: 17.07.2010
Адрес: мурмурляндия
Сообщений: 11,134
Сказал спасибо: 202
Сказали Спасибо 3,285 раз(а) в 2,151 сообщении(ях)
индюк на пути к лучшему
По умолчанию Re: STM32 не уходит в прерывания

Сообщение от sanekfps Посмотреть сообщение
Такое чувство что Keil целиком кривой
да сам ты кривой.
никгда ни на каких стм у меня не было глюков в кеиле!!

пиши битами и ничо тебе кеил не перепутает.
__________________
кагмаподэ магмаподэ

Последний раз редактировалось индюк; 05.05.2024 в 17:36.
индюк вне форума  
 

Метки
keil uvision, stm32
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
STM32 как определить разрешены ли прерывания глобально kvark85 ARM 2 28.05.2015 13:08
Как расчитать время выполнения прерывания в STM32? MaxiMuz79 ARM 10 18.04.2014 18:30
Программа уходит в HardFault (STM32) valic Песочница (вопросы новичков) 9 26.05.2013 09:15
AT89C5131 прием и передача данных по USB rihkov AVR 14 15.11.2012 08:16
Вход в прерывания для PIC микроконтроллеров dimmich Микроконтроллеры, АЦП, память и т.д 4 06.12.2009 17:17


Часовой пояс GMT +4, время: 11:57.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.