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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Проблема с прерыванием, Мигание светодиодами посредством прерывания
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
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

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

 


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


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