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

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

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

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

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

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


 
Опции темы
Непрочитано 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
Заблокирован
 
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,488
Сказал спасибо: 396
Сказали Спасибо 2,220 раз(а) в 1,319 сообщении(ях)
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.RU
 
Регистрация: 25.11.2010
Адрес: г. Дзержинск Нижегородская обл.
Сообщений: 1,672
Сказал спасибо: 130
Сказали Спасибо 1,074 раз(а) в 517 сообщении(ях)
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
Заблокирован
 
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,488
Сказал спасибо: 396
Сказали Спасибо 2,220 раз(а) в 1,319 сообщении(ях)
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
Заблокирован
 
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,488
Сказал спасибо: 396
Сказали Спасибо 2,220 раз(а) в 1,319 сообщении(ях)
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
Адрес: мурмурляндия
Сообщений: 10,453
Сказал спасибо: 176
Сказали Спасибо 3,133 раз(а) в 2,021 сообщении(ях)
индюк на пути к лучшему
По умолчанию 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, время: 00:27.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot