реклама на сайте
подробности

 
 
> Проблема с прерыванием, Мигание светодиодами посредством прерывания
Rudthaky
сообщение Jul 14 2015, 19:53
Сообщение #1





Группа: Новичок
Сообщений: 9
Регистрация: 6-05-15
Пользователь №: 86 548



Здравствуйте уважаемые форумчане. Такой вопрос: не работает прерывание на плате stm32f3discavery, ниже код:
CODE
#include "stm32f30x.h" // Device header


#define LED_ON() GPIO_SetBits(GPIOE, GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_1
4|GPIO_Pin_15)
#define LED_OFF() GPIO_ResetBits(GPIOE, GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_1
4|GPIO_Pin_15)
//-------------------------
#define RED_OFF() GPIO_ResetBits (GPIOE, GPIO_Pin_9|GPIO_Pin_13)
#define RED_ON() GPIO_SetBits(GPIOE, GPIO_Pin_9|GPIO_Pin_13)
//-------------------------
#define BLUE_OFF() GPIO_ResetBits (GPIOE, GPIO_Pin_8|GPIO_Pin_12)
#define BLUE_ON() GPIO_SetBits(GPIOE, GPIO_Pin_8|GPIO_Pin_12)
//--------------------------
#define GREEN_OFF() GPIO_ResetBits (GPIOE, GPIO_Pin_11|GPIO_Pin_15)
#define GREEN_ON() GPIO_SetBits(GPIOE, GPIO_Pin_11|GPIO_Pin_15)
//--------------------------
#define ORANGE_OFF() GPIO_ResetBits (GPIOE, GPIO_Pin_10|GPIO_Pin_14)
#define ORANGE_ON() GPIO_SetBits(GPIOE, GPIO_Pin_10|GPIO_Pin_14)
//--------------------------

static volatile uint16_t msTick= 0;

void SisTick_Handler(void)
{
msTick++;
}

void delay_ms(uint16_t ms)
{
uint16_t startTicks;
startTicks = msTick;
while((msTick - startTicks)< ms);
}

void LEDs_ini(void)
{
GPIO_InitTypeDef GPIO_InitType_LED;

//RCC_AHBPeriph_GPIOE

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOE,ENABLE);

GPIO_InitType_LED.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_1
4|GPIO_Pin_15;
GPIO_InitType_LED.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitType_LED.GPIO_Speed = GPIO_Speed_Level_2;
GPIO_InitType_LED.GPIO_OType = GPIO_OType_PP;
GPIO_InitType_LED.GPIO_PuPd = GPIO_PuPd_NOPULL;

GPIO_Init(GPIOE, &GPIO_InitType_LED);
}




int main(void)
{
SysTick_Config(SystemCoreClock/1000);
// uint32_t i;
LEDs_ini();


while(1)
{
RED_ON();
delay_ms(100);

RED_OFF();
delay_ms(100);


}
}
Выполняет только функция RED_ON(), соответственно диоды не моргают. Пробовал вариант:
вместо:
Код
static volatile uint16_t msTick= 0;

void SisTick_Handler(void)
{
    msTick++;
}

void delay_ms(uint16_t ms)
{
    uint16_t startTicks;
    startTicks = msTick;
    while((msTick - startTicks)< ms);
}
делать через
Код
uint16_t delay_count = 0;

void SysTick_Handler(void)
{
    if(delay_count > 0)
    {
        delay_count--;
    }
}

void delay_ms(uint16_t delay_temp)
{
    delay_count = delay_temp;
    while(delay_count){}
}
Keil выдает ошибку:
Цитата
..\Objects\project2.axf: Error: L6200E: Symbol SysTick_Handler multiply defined (by hal_cm4.o and main.o).
Где находятся (by hal_cm4.o and main.o) я не нашел. Помогите пожалуйста разобраться новичку с прерываниями crying.gif

Сообщение отредактировал IgorKossak - Jul 15 2015, 05:30
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!
Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 23)
veteq
сообщение Jul 14 2015, 20:23
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 28
Регистрация: 5-12-06
Пользователь №: 23 160



Надо искать с расширением С раз уж на то пошло, а не объектные файлы... Обработчик уже где-то определён в hal... Тупо воспользоваться поиском по всему проекту и найти этот обработчик....
И да: в исходнике неправильное название обработчика sys а не sis... Где-то правильно написано где-то нет...

Сообщение отредактировал veteq - Jul 14 2015, 20:26
Go to the top of the page
 
+Quote Post
Mihey_K
сообщение Jul 14 2015, 21:41
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 156
Регистрация: 27-09-06
Из: Irkutsk
Пользователь №: 20 747



Код
void SisTick_Handler(void)
это что такое. Если хотите свое имя функции-обработчика прерываний, то будьте добры их поправить в startup файле.
Похоже проблема с самим проектом. CMSIS добавили?


--------------------
Блог о разработке на CC430, SIM900, GPS, ARM и не только...
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Jul 15 2015, 03:55
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



HAL вставляет свой обработчик прерывания системного таймера и оттуда делает вызов пользовательской функции...
Go to the top of the page
 
+Quote Post
Rudthaky
сообщение Jul 15 2015, 06:22
Сообщение #5





Группа: Новичок
Сообщений: 9
Регистрация: 6-05-15
Пользователь №: 86 548



По поводу :
Код
void SisTick_Handler(void)
, каюсь. Нет не хотел свою функцию, просто опечатался blush.gif при исправлении на правлиьный
Код
void SysTick_Handler(void)
появляется уже знакомая ошибка.
Цитата
Тупо воспользоваться поиском по всему проекту и найти этот обработчик....
Хотелось бы, но как этот поиск сделать... банальная ctrl+f не работает на глобальный, ищет постранично...
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Jul 15 2015, 06:38
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



не ctrl+f а ctrl+shift+f если кеилsm.gif..
если нет, то найти в файлах...
а вообще идите hal_cm4 файл, он вроде с, и там найдете эту фукнкцию, а в ней найдете вызов пользовательской, которая объявлена как weak, ее и переопределяйте у себя.

в HAL много каких инициализаций и работы сделано на таймаутах считаемых в их функции, так что без нее работать не будет, вы не сможете заменить ее на свою и радоваться... надо будет пользовательскую переписывать... либо вызывать HAL_Tick() у себя.
Go to the top of the page
 
+Quote Post
Rudthaky
сообщение Jul 15 2015, 06:55
Сообщение #7





Группа: Новичок
Сообщений: 9
Регистрация: 6-05-15
Пользователь №: 86 548



поп поиску SysTick_Handler выдает:
Цитата
Searching for 'SysTick_Handler'...
D:\Keil_v5\project2\User\startup_stm32f30x.s(81) : DCD SysTick_Handler ; SysTick Handler
D:\Keil_v5\project2\User\startup_stm32f30x.s(224) : SysTick_Handler PROC
D:\Keil_v5\project2\User\startup_stm32f30x.s(225) : EXPORT SysTick_Handler [WEAK]
D:\Keil_v5\project2\User\main.c(22) : void SysTick_Handler(void)
Lines matched: 4 Files matched: 2 Total files searched: 60

ни какого (by hal_cm4.o and main.o) не увидел...

Где вообще искать hal_cm4 в keil 5? Упоминаний о ней много, все советуют в нее заглянуть, а вот где она находится - для меня загадка... smile3046.gif

в проекте присутствует core_cm4.h файл, в нем про SysTick только:
Код
#define SysTick             ((SysTick_Type   *)     SysTick_BASE  )   /*!< SysTick configuration struct       */
и
вроде как инициализация:
Код
__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)
{
  if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) { return (1UL); }    /* Reload value impossible */

  SysTick->LOAD  = (uint32_t)(ticks - 1UL);                         /* set reload register */
  NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */
  SysTick->VAL   = 0UL;                                             /* Load the SysTick Counter Value */
  SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk |
                   SysTick_CTRL_TICKINT_Msk   |
                   SysTick_CTRL_ENABLE_Msk;                         /* Enable SysTick IRQ and SysTick Timer */
  return (0UL);                                                     /* Function successful */
}
Go to the top of the page
 
+Quote Post
bugdesigner
сообщение Jul 15 2015, 07:10
Сообщение #8


Частый гость
**

Группа: Участник
Сообщений: 123
Регистрация: 12-06-15
Из: Земля
Пользователь №: 87 133



Если вы пользуетесь HAL-ом, то не нужно переопределять обработчик SysTick, тк он уже определен в библиотеке HAL. Если нужно использовать прерывание - поместите в своем файле callback ф-цию void HAL_SYSTICK_Callback(void)
Вот ее определение в stm32f4xx_hal_cortex.c:
CODE
__weak void HAL_SYSTICK_Callback(void)
{
/* NOTE : This function Should not be modified, when the callback is needed,
the HAL_SYSTICK_Callback could be implemented in the user file
*/
}


Примерно так:
void HAL_SYSTICK_Callback(void)
{
// DO something
}

Сообщение отредактировал bugdesigner - Jul 15 2015, 07:13
Go to the top of the page
 
+Quote Post
Rudthaky
сообщение Jul 15 2015, 07:45
Сообщение #9





Группа: Новичок
Сообщений: 9
Регистрация: 6-05-15
Пользователь №: 86 548



Спасибо за HAL, наконец знаю куда заглянуть, но проблема ни куда ну ушла. Попробовал так- светодиоды - просто горят =(
CODE
#include "stm32f30x.h" // Device header



#define LED_ON() GPIO_SetBits(GPIOE, GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_1
4|GPIO_Pin_15)
#define LED_OFF() GPIO_ResetBits(GPIOE, GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_1
4|GPIO_Pin_15)
//-------------------------
#define RED_OFF() GPIO_ResetBits (GPIOE, GPIO_Pin_9|GPIO_Pin_13)
#define RED_ON() GPIO_SetBits(GPIOE, GPIO_Pin_9|GPIO_Pin_13)
//-------------------------
#define BLUE_OFF() GPIO_ResetBits (GPIOE, GPIO_Pin_8|GPIO_Pin_12)
#define BLUE_ON() GPIO_SetBits(GPIOE, GPIO_Pin_8|GPIO_Pin_12)
//--------------------------
#define GREEN_OFF() GPIO_ResetBits (GPIOE, GPIO_Pin_11|GPIO_Pin_15)
#define GREEN_ON() GPIO_SetBits(GPIOE, GPIO_Pin_11|GPIO_Pin_15)
//--------------------------
#define ORANGE_OFF() GPIO_ResetBits (GPIOE, GPIO_Pin_10|GPIO_Pin_14)
#define ORANGE_ON() GPIO_SetBits(GPIOE, GPIO_Pin_10|GPIO_Pin_14)
//--------------------------

uint16_t delay_count = 0;

void HAL_SYSTICK_Callback(void)
{
if(delay_count > 0)
{
delay_count--;
}
}

void delay_ms(uint16_t delay_temp)
{
delay_count = delay_temp;
while(delay_count){}
}

//-------------------------------------------

void LEDs_ini(void)
{
GPIO_InitTypeDef GPIO_InitType_LED;

//RCC_AHBPeriph_GPIOE

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOE,ENABLE);

GPIO_InitType_LED.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_1
4|GPIO_Pin_15;
GPIO_InitType_LED.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitType_LED.GPIO_Speed = GPIO_Speed_Level_2;
GPIO_InitType_LED.GPIO_OType = GPIO_OType_PP;
GPIO_InitType_LED.GPIO_PuPd = GPIO_PuPd_NOPULL;

GPIO_Init(GPIOE, &GPIO_InitType_LED);
}




int main(void)
{
SysTick_Config(SystemCoreClock/1000);
// uint32_t i;
LEDs_ini();


while(1)
{
RED_ON();
delay_ms(100);

RED_OFF();
delay_ms(100);


}
}

где-то я ошибаюсь, но не пойму где...

Сообщение отредактировал IgorKossak - Jul 15 2015, 13:55
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!
Go to the top of the page
 
+Quote Post
bugdesigner
сообщение Jul 15 2015, 07:59
Сообщение #10


Частый гость
**

Группа: Участник
Сообщений: 123
Регистрация: 12-06-15
Из: Земля
Пользователь №: 87 133



Для начала объявить переменную так: volatile uint16_t delay_count
Возможно умный компилятор её выкинул.
И ещё, раз уж пользуетесь хал, то инициализацию таймера лучше делать его средствами. Так сказать, придерживаясь их стиля.
Go to the top of the page
 
+Quote Post
Rudthaky
сообщение Jul 15 2015, 12:53
Сообщение #11





Группа: Новичок
Сообщений: 9
Регистрация: 6-05-15
Пользователь №: 86 548



Поменял- эффект то же... светодиоды просто горят... Напишите пожалуйста пример использования и объявления прирывания через хал...
Go to the top of the page
 
+Quote Post
Tanya
сообщение Jul 15 2015, 14:41
Сообщение #12


Гуру
******

Группа: Модераторы
Сообщений: 8 752
Регистрация: 6-01-06
Пользователь №: 12 883



Цитата(Rudthaky @ Jul 15 2015, 15:53) *
Поменял- эффект то же... светодиоды просто горят... Напишите пожалуйста пример использования и объявления прирывания через хал...

Вы бы написали, что хотите сделать... Кажется, что Вы это сами не знаете... Русским языком...
Go to the top of the page
 
+Quote Post
bugdesigner
сообщение Jul 15 2015, 14:42
Сообщение #13


Частый гость
**

Группа: Участник
Сообщений: 123
Регистрация: 12-06-15
Из: Земля
Пользователь №: 87 133



Цитата(Rudthaky @ Jul 15 2015, 15:53) *
Напишите пожалуйста пример использования и объявления прирывания через хал...

Я этот хал похоронил для себя, просто кое-какие воспоминания остались. К тому же сейчас в командировке. Дома кое-какие тестовые проекты были, но доберусь я к ним через 3 недели.
Я советую посмотреть примеры (они есть и в STM32CubeXXX). Посмотрите пример GPIO_IOToggle и на базе него разберетесь.
PS: И еще. У Вас в коде используются ф-ции HAL и SPL. Это как минимум странно. Вы уж определитесь, что Вам больше нравится. А то такой дикий винегрет получится, что фиг потом разберешься.

Сообщение отредактировал bugdesigner - Jul 15 2015, 14:51
Go to the top of the page
 
+Quote Post
veteq
сообщение Jul 15 2015, 15:09
Сообщение #14


Участник
*

Группа: Участник
Сообщений: 28
Регистрация: 5-12-06
Пользователь №: 23 160



uint16_t delay_count = 0;

Попробовать добавить volatile к нему...
Go to the top of the page
 
+Quote Post
Rudthaky
сообщение Jul 15 2015, 15:48
Сообщение #15





Группа: Новичок
Сообщений: 9
Регистрация: 6-05-15
Пользователь №: 86 548



Цитата
Вы бы написали, что хотите сделать... Кажется, что Вы это сами не знаете... Русским языком...

Банально помигать светодиодами на плате STM32F3 discavery... есть видео уроки на youtube-е
Цитата

вот по ним пытаюсь освоить Keil и ARM. Да, в уроках используется плата stm32f4xx discavery, но я думаю это не суть вещей. Адекватной литературы на тему "Самоучитель для чайников ARM" я не нашел, либо старье либо не для keil. Может быть плохо искал, не знаю. По этому и спрашиваю, уважаемых Вас, что бы ткнули пальцем, как слепому котенку. Типа делай так и так и будет тебе счастье...
Не поняв как работать, вызывать прерывание через hel или нет, дальше смотреть туториалы и побывать по ним писать код - не вижу смысла так как это основа-основ.
Цитата
uint16_t delay_count = 0; Попробовать добавить volatile к нему...
делал, результат тот же...
Go to the top of the page
 
+Quote Post
Tanya
сообщение Jul 15 2015, 15:57
Сообщение #16


Гуру
******

Группа: Модераторы
Сообщений: 8 752
Регистрация: 6-01-06
Пользователь №: 12 883



Цитата(Rudthaky @ Jul 15 2015, 18:48) *
Банально помигать светодиодами на плате STM32F3 discavery... есть видео уроки на

Запустите таймер с ШИМ - будет мигать безо всяких прерываний непонятно от чего...
Go to the top of the page
 
+Quote Post
Rudthaky
сообщение Jul 16 2015, 06:12
Сообщение #17





Группа: Новичок
Сообщений: 9
Регистрация: 6-05-15
Пользователь №: 86 548



Цитата
Посмотрите пример GPIO_IOToggle и на базе него разберетесь.
Спасибо bugdesigner, разобрался. Тема закрыта. bb-offtopic.gif
Go to the top of the page
 
+Quote Post
RusikOk
сообщение Sep 10 2016, 18:12
Сообщение #18


Участник
*

Группа: Участник
Сообщений: 46
Регистрация: 14-01-12
Пользователь №: 69 438



подскажите новенькому как часто будет вызываться обработчик прерывания void SysTick_Handler(void) при тактовой частоте 72МГц?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Sep 10 2016, 18:31
Сообщение #19


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Смотря что записано в регистры LOAD и CTRL SysTick.
Go to the top of the page
 
+Quote Post
smk
сообщение Jul 28 2017, 16:34
Сообщение #20


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



Хотелось бы поднять тему. Не вызывается HAL_IncTick(); Куда ни добавлял - бесполезно. HAL_SYSTICK_Callback тоже не вызывается. Прерывание от системного таймера включено. Где-то определен обработчик но найти его не удается. Демоплата STM32746G-Discovery. Keil5. Проект генерировался средствами кейла. Смотрел примеры так они все на основе ОС. Мне нужно без нее. Хочу поинтересоваться как выйти из этой ситуации. Проблема ранее в этой теме описана но решение никто не привел. Может кто уже сталкивался и поборол эту ситуацию? Спасибо.


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jul 29 2017, 02:25
Сообщение #21


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(smk @ Jul 28 2017, 19:34) *
Где-то определен обработчик но найти его не удается.

Достаточно заглянуть в таблицу векторов прерываний чтобы найти его.
Или и таблицу прерываний тоже найти не удаётся? biggrin.gif smile3009.gif
Go to the top of the page
 
+Quote Post
ivan24190
сообщение Jul 29 2017, 06:44
Сообщение #22


Участник
*

Группа: Участник
Сообщений: 41
Регистрация: 25-08-15
Из: Рыбное
Пользователь №: 88 141



smk, обработчик прерывания системного таймера находится в файле stm32f7xx_it.c, и там вызывается функция HAL_IncTick().
реализация функции HAL_IncTick() находится в файле stm32fxx_hal.c. Еще гляньте файл stm32f7xx_hal_cortex.c.

Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Jul 29 2017, 20:19
Сообщение #23


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(smk @ Jul 28 2017, 19:34) *
Может кто уже сталкивался и поборол эту ситуацию?

Наблюдал аналогичное на другом контроллере вообше.
На четвертый день заработало само по тем же исходникам.
Подозрения есть, но достоверного объяснения нет.
Ну разве что обработчик не искал sm.gif, но программа туда не заходила. Таймер считал.


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
Lagman
сообщение Jul 30 2017, 10:14
Сообщение #24


Знающий
****

Группа: Свой
Сообщений: 875
Регистрация: 28-10-05
Пользователь №: 10 245



Документ Description of STM32F7 HAL and Low-layer drivers
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 07:51
Рейтинг@Mail.ru


Страница сгенерированна за 0.01551 секунд с 7
ELECTRONIX ©2004-2016