Форум Микро-Чип
Поиск и заказ электронных компонентов
 

Вернуться   Форум Микро-Чип > Микроконтроллеры других производителей

Микроконтроллеры других производителей Все, что касается микроконтроллеров и НЕ подошло в раздел Microchip.

Ответ
 
Опции темы Опции просмотра
Старый 24.06.2016, 16:08   #1
Pasha_Bi
Senior Member
 
Регистрация: 24.07.2009
Адрес: г. Иваново
Возраст: 42
Сообщений: 238
Вес репутации: 617/36
Pasha_Bi is a name known to allPasha_Bi is a name known to allPasha_Bi is a name known to allPasha_Bi is a name known to allPasha_Bi is a name known to allPasha_Bi is a name known to all
По умолчанию Помогите понять необходимость проверки флага в обработчике прерывания TIM1_UP_IRQHandler

Вот минимальный код, который работает (PC13 меняет свое состояние раз в секунду):
Код:
#include "stm32f10x.h"			// Периферия микроконтроллера
#include "system_stm32f10x.h"	// Функции инициализации от CMSIS
void TIM1_UP_IRQHandler(void)
{
	if(TIM1->SR&TIM_SR_UIF)
	{
		GPIOC->ODR^=GPIO_ODR_ODR13;
		// Сброс флага события UEV (update even)
		TIM1->SR&=~TIM_SR_UIF;
	}
}
int main(void)
{
	// Инициализация системы тактирования микроконтроллера
	SystemInit();
	// Настройка порта PC13 на выход
	// Включение тактирования порта
	RCC->APB2ENR|=RCC_APB2ENR_IOPCEN;
	GPIOC->ODR=0;
	GPIOC->CRL=(uint32_t)0x44444444;
	GPIOC->CRH=(uint32_t)0x44244444;	
	// Настройка TIM1
	// Таймеры TIM1, TIM8, TIM9, TIM10, TIM11 тактируется с шины APB2
	// Таймеры TIM2-TIM7, TIM12, TIM13, TIM14 тактируется с шины APB1
	RCC->APB2ENR|=RCC_APB2ENR_TIM1EN; 		// Включение тактирования таймера
	// Таймер TIM1 используем для получения прерываний с периодом 1c
	// Регистр предделителя (TIMx_PSC)
	TIM1->PSC=7200-1;							//Тактирование 100us
	// Регистр автоперезагрузки (TIMx_ARR)
	TIM1->ARR=10000-1;
	// Включение счётчика
	TIM1->CR1|=TIM_CR1_CEN;
	// Разрешаем прерывания от события UEV (update even)
	TIM1->DIER|=TIM_DIER_UIE;
	// Устанавливаем приоритет прерыванияот от события UEV (update even) TIM1 - 0 (наивысший)
	NVIC_SetPriority(TIM1_UP_IRQn,0);		
	// Разрешение прерывания в NVIC от от события UEV (update even)	TIM1
	NVIC_EnableIRQ(TIM1_UP_IRQn);	
	while(1);
}
Если я из обработчика прерывания выкидываю условие if(TIM1->SR&TIM_SR_UIF), PC13 не изменяет состояние. Как так? Ведь этот обработчик привязан только к событию UPDATE, и вроде проверка то лишняя? Или я чего то не понимаю?
Вот проект целиком:
Вложения
Тип файла: rar TestTIM1.rar (164.3 Кб, 1 просмотров)
Pasha_Bi вне форума   Ответить с цитированием
Старый 24.06.2016, 18:11   #2
HHIMERA
Senior Member
 
Регистрация: 10.06.2008
Возраст: 55
Сообщений: 2,482
Вес репутации: 3440/90
HHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond repute
По умолчанию Re: Помогите понять необходимость проверки флага в обработчике прерывания TIM1_UP_IRQHandler

Цитата:
Сообщение от Pasha_Bi Посмотреть сообщение
PC13 не изменяет состояние. Как так? Ведь этот обработчик привязан только к событию UPDATE, и вроде проверка то лишняя? Или я чего то не понимаю?
Да всё там просто... Конвейер... Почитайте про барьеры...
Если кратко... при коротком обработчике... выход из прерывания происходит раньше, чем выполнение команд самого обработчика... Обычно теряют только сброс флага... Поэтому и предпочитают ставить сброс флага в начале обработчика...
Лечится дополнительными командами барьера или НОПами...

Проверка здесь действительно лишняя... Обычно так пишут для однообразности... потому что в других случаях проверка всё таки нужна...
__________________
"Я не даю готовых решений, я заставляю думать!"(С)
HHIMERA вне форума   Ответить с цитированием
Старый 24.06.2016, 19:43   #3
Pasha_Bi
Senior Member
 
Регистрация: 24.07.2009
Адрес: г. Иваново
Возраст: 42
Сообщений: 238
Вес репутации: 617/36
Pasha_Bi is a name known to allPasha_Bi is a name known to allPasha_Bi is a name known to allPasha_Bi is a name known to allPasha_Bi is a name known to allPasha_Bi is a name known to all
По умолчанию Re: Помогите понять необходимость проверки флага в обработчике прерывания TIM1_UP_IRQHandler

Спасибо, почитаю. Всё понятно. В понедельник NOP-ов добавлю, проверю. Тут, конечно, не догадаешься. Ещё раз, спасибо.
Pasha_Bi вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы
Опции просмотра

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

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

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

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
PIC18F4520 проблемы с UART-ом AlHakim Продукция MICROCHIP 4 30.10.2007 07:31


Часовой пояс GMT +3, время: 17:44.


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