Easyelectronics.ru

Электроника для всех
Текущее время: 29 окт 2020, 22:38

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/5шт. два слоя. $5/5шт. четыре слоя
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 6 ] 
Автор Сообщение
 Заголовок сообщения: Не сбрасываются флаги регистра SR (STM32F417ZG)
СообщениеДобавлено: 23 июл 2012, 19:05 
Здравствуйте!

Зарегистрирован: 23 июл 2012, 18:43
Сообщения: 3
Доброго времени суток.
Я пишу программу на STM32F417ZG для получения сигнала вида (01010111) и так периодически. Использую два таймера. Не тактированы, но с одинаковой частотой счета. После разрешения прерываний для третьего таймера программа заходит в обработчик, выполняет действия, но не сбрасывает флаги прерываний. Более того, по непонятной для меня причине, кроме флагов разрешенных мной прерываний (UIF, CC1IF) еще устанавливаются флаги CC2IF, CC3IF, CC4IF.
Подскажите, пожалуйста, причину и правильное решение этой задачи.

/* Includes ------------------------------------------------------------------*/
#include "Main.h"

/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
//u8 u8RecentlyWasFlashed=0;//8 bit
//u32 u32State=0;//32 bit in Ram/flash

/* Private function prototypes -----------------------------------------------*/
//plays here your functions definitions
/* Private functions ---------------------------------------------------------*/


GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;

//----------------------------------------USART__Init--------------------------------------
void USART__Init(void)
{
/* Enable GPIO clock */
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);

/* Connect USART pins to AF7 */
GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_USART1);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_USART1);

/* Configure USART Tx and Rx as alternate function push-pull */
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10 ;
GPIO_Init(GPIOA, &GPIO_InitStructure);

/* Enable USART clock */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);

USART_InitStructure.USART_BaudRate = 115200; //3750000;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USART1, &USART_InitStructure);

/* Enable USART */
//USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
//USART_ITConfig(USART1, USART_IT_TC, ENABLE);
USART_Cmd(USART1, ENABLE);
}


//-----------------------------------main---------------------------------------
int main(void)
{
SystemInit();
//USART__Init();

//------------------NVIC----------------------

//объявление структуры NVIC
NVIC_InitTypeDef NVIC_InitStructure;

NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);


//-------------------IO-----------------------
//объявление структуры IO
GPIO_InitTypeDef GPIO_InitStructure;

//тактирование IO
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);

//инициализация полей IO структуры
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //двухтактный; с открытым стоком
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //подтяжка вверх
//инициализация IO
GPIO_Init(GPIOA, &GPIO_InitStructure);

//подключение ножек на выход таймера
GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_TIM2);



//-------------------TIM2--------------------

//объявление структуры таймера
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
//объявление структуры выхода сравнения для таймера
TIM_OCInitTypeDef TIM_OCInitStructure;
// тактирование таймера
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

//объявления полей структуры таймера
TIM_TimeBaseInitStructure.TIM_Prescaler = 3;
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInitStructure.TIM_Period = 665;
TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
//инициализация таймера
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);


//объявление полей структуры выхода сравнения
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 333;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
//инициализация выхода сравнения
TIM_OC4Init(TIM2, &TIM_OCInitStructure);

TIM_OC4PreloadConfig(TIM2, TIM_OCPreload_Enable);


TIM_Cmd(TIM2, ENABLE);

//-------------------TIM3--------------------

//объявление структуры таймера
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructureTIM3;
//объявление структуры выхода сравнения для таймера
TIM_OCInitTypeDef TIM_OCInitStructureTIM3;
// тактирование таймера
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);

//объявления полей структуры таймера
TIM_TimeBaseInitStructureTIM3.TIM_Prescaler = 3;
TIM_TimeBaseInitStructureTIM3.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInitStructureTIM3.TIM_Period = 2663;
TIM_TimeBaseInitStructureTIM3.TIM_ClockDivision = TIM_CKD_DIV1;
//инициализация таймера
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStructureTIM3);

//объявление полей структуры выхода сравнения
TIM_OCInitStructureTIM3.TIM_OCMode = TIM_OCMode_PWM2;
TIM_OCInitStructureTIM3.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructureTIM3.TIM_Pulse = 1332;
TIM_OCInitStructureTIM3.TIM_OCPolarity = TIM_OCPolarity_High;
//инициализация выхода сравнения
TIM_OC1Init(TIM3, &TIM_OCInitStructureTIM3);

TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);

//разрешение прерываний таймера
TIM_ITConfig(TIM3, TIM_IT_Update|TIM_IT_CC1, ENABLE);


TIM_Cmd(TIM3, ENABLE);



while(1){;}



}

//-----------------TIM3_IRQHandler----------------
void TIM3_IRQHandler(void)
{
if(TIM3->SR&TIM_SR_CC1IF != 0)
{
TIM2->ARR = 1331;
TIM3->SR &= ~TIM_SR_CC1IF;
}
if(TIM3->SR&TIM_SR_UIF != 0)
{
TIM2->ARR = 665;
TIM3->SR &= ~TIM_SR_UIF;
}

//TIM2->SR = 0;
}

/*****END OF FILE****/[/code]


Последний раз редактировалось AlelxSS 25 июл 2012, 14:59, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не сбрасываются флаги регистра SR (STM32F417ZG)
СообщениеДобавлено: 23 июл 2012, 19:38 
Старожил

Зарегистрирован: 18 янв 2011, 22:54
Сообщения: 309
Да, действительно не сбрасываются сами. Их надо сбрасывать вручную при входе в прерывание.
Например:
/* Clear TIM4 Capture compare interrupt pending bit */
TIM_ClearITPendingBit(TIM4, TIM_IT_CC2);


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не сбрасываются флаги регистра SR (STM32F417ZG)
СообщениеДобавлено: 25 июл 2012, 12:57 
Здравствуйте!

Зарегистрирован: 23 июл 2012, 18:43
Сообщения: 3
Так в том то и дело, я пытаюсь их сбросить в прерывании, но они не сбрасываются!
TIM3->SR &= ~TIM_SR_UIF;


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не сбрасываются флаги регистра SR (STM32F417ZG)
СообщениеДобавлено: 25 июл 2012, 19:52 
Только пришел

Зарегистрирован: 26 дек 2010, 01:06
Сообщения: 21
Бывало такое на STM32F1xx когда сбрасывал флаг в конце прерывания. Почемуто МК не успевал сбрасить флаги до выхода из прерывания. Поробуйте сбрасывать флаги в начале:

Код:
TIM3->SR &= ~(TIM_SR_UIF | TIM_SR_CC1IF);

if(TIM3->SR&TIM_SR_CC1IF != 0)
{....}
....


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не сбрасываются флаги регистра SR (STM32F417ZG)
СообщениеДобавлено: 27 июл 2012, 17:19 
Здравствуйте!

Зарегистрирован: 23 июл 2012, 18:43
Сообщения: 3
Дело в том, что я не могу очищать флаги в начале, так как я проверяю по какому событию произошло прерывание if(TIM3->SR&TIM_SR_CC1IF != 0)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не сбрасываются флаги регистра SR (STM32F417ZG)
СообщениеДобавлено: 27 июл 2012, 19:28 
Только пришел

Зарегистрирован: 26 дек 2010, 01:06
Сообщения: 21
Сохраните в локальную переменую значения флагов, а потом сбрасывайте, проверки делайте по переменую. Главное локализовать проблемму.
Код:
uin32_t Temp;
Temp = TIM3->SR;
TIM3->SR &= ~(TIM_SR_UIF | TIM_SR_CC1IF);
if(Temp & TIM_SR_CC1IF){
   ...
} else if(Temp & TIM_SR_UIF){
   ...
}


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 6 ] 


Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB