Rudthaky 0 14 июля, 2015 Опубликовано 14 июля, 2015 (изменено) · Жалоба Здравствуйте уважаемые форумчане. Такой вопрос: не работает прерывание на плате stm32f3discavery, ниже код: #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: Изменено 15 июля, 2015 пользователем IgorKossak [codebox] для длинного кода, [code] - для короткого!!! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
veteq 0 14 июля, 2015 Опубликовано 14 июля, 2015 (изменено) · Жалоба Надо искать с расширением С раз уж на то пошло, а не объектные файлы... Обработчик уже где-то определён в hal... Тупо воспользоваться поиском по всему проекту и найти этот обработчик.... И да: в исходнике неправильное название обработчика sys а не sis... Где-то правильно написано где-то нет... Изменено 14 июля, 2015 пользователем veteq Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
miheyk 0 14 июля, 2015 Опубликовано 14 июля, 2015 · Жалоба void SisTick_Handler(void) это что такое. Если хотите свое имя функции-обработчика прерываний, то будьте добры их поправить в startup файле. Похоже проблема с самим проектом. CMSIS добавили? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 15 июля, 2015 Опубликовано 15 июля, 2015 · Жалоба HAL вставляет свой обработчик прерывания системного таймера и оттуда делает вызов пользовательской функции... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Rudthaky 0 15 июля, 2015 Опубликовано 15 июля, 2015 · Жалоба По поводу : void SisTick_Handler(void) , каюсь. Нет не хотел свою функцию, просто опечатался при исправлении на правлиьный void SysTick_Handler(void) появляется уже знакомая ошибка. Тупо воспользоваться поиском по всему проекту и найти этот обработчик.... Хотелось бы, но как этот поиск сделать... банальная ctrl+f не работает на глобальный, ищет постранично... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 15 июля, 2015 Опубликовано 15 июля, 2015 · Жалоба не ctrl+f а ctrl+shift+f если кеил:).. если нет, то найти в файлах... а вообще идите hal_cm4 файл, он вроде с, и там найдете эту фукнкцию, а в ней найдете вызов пользовательской, которая объявлена как weak, ее и переопределяйте у себя. в HAL много каких инициализаций и работы сделано на таймаутах считаемых в их функции, так что без нее работать не будет, вы не сможете заменить ее на свою и радоваться... надо будет пользовательскую переписывать... либо вызывать HAL_Tick() у себя. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Rudthaky 0 15 июля, 2015 Опубликовано 15 июля, 2015 · Жалоба поп поиску 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: в проекте присутствует 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 */ } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
bugdesigner 0 15 июля, 2015 Опубликовано 15 июля, 2015 (изменено) · Жалоба Если вы пользуетесь HAL-ом, то не нужно переопределять обработчик SysTick, тк он уже определен в библиотеке HAL. Если нужно использовать прерывание - поместите в своем файле callback ф-цию void HAL_SYSTICK_Callback(void) Вот ее определение в stm32f4xx_hal_cortex.c: __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 } Изменено 15 июля, 2015 пользователем bugdesigner Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Rudthaky 0 15 июля, 2015 Опубликовано 15 июля, 2015 (изменено) · Жалоба Спасибо за HAL, наконец знаю куда заглянуть, но проблема ни куда ну ушла. Попробовал так- светодиоды - просто горят =( #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); } } где-то я ошибаюсь, но не пойму где... Изменено 15 июля, 2015 пользователем IgorKossak [codebox] для длинного кода, [code] - для короткого!!! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
bugdesigner 0 15 июля, 2015 Опубликовано 15 июля, 2015 · Жалоба Для начала объявить переменную так: volatile uint16_t delay_count Возможно умный компилятор её выкинул. И ещё, раз уж пользуетесь хал, то инициализацию таймера лучше делать его средствами. Так сказать, придерживаясь их стиля. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Rudthaky 0 15 июля, 2015 Опубликовано 15 июля, 2015 · Жалоба Поменял- эффект то же... светодиоды просто горят... Напишите пожалуйста пример использования и объявления прирывания через хал... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Tanya 4 15 июля, 2015 Опубликовано 15 июля, 2015 · Жалоба Поменял- эффект то же... светодиоды просто горят... Напишите пожалуйста пример использования и объявления прирывания через хал... Вы бы написали, что хотите сделать... Кажется, что Вы это сами не знаете... Русским языком... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
bugdesigner 0 15 июля, 2015 Опубликовано 15 июля, 2015 (изменено) · Жалоба Напишите пожалуйста пример использования и объявления прирывания через хал... Я этот хал похоронил для себя, просто кое-какие воспоминания остались. К тому же сейчас в командировке. Дома кое-какие тестовые проекты были, но доберусь я к ним через 3 недели. Я советую посмотреть примеры (они есть и в STM32CubeXXX). Посмотрите пример GPIO_IOToggle и на базе него разберетесь. PS: И еще. У Вас в коде используются ф-ции HAL и SPL. Это как минимум странно. Вы уж определитесь, что Вам больше нравится. А то такой дикий винегрет получится, что фиг потом разберешься. Изменено 15 июля, 2015 пользователем bugdesigner Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
veteq 0 15 июля, 2015 Опубликовано 15 июля, 2015 · Жалоба uint16_t delay_count = 0; Попробовать добавить volatile к нему... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Rudthaky 0 15 июля, 2015 Опубликовано 15 июля, 2015 · Жалоба Вы бы написали, что хотите сделать... Кажется, что Вы это сами не знаете... Русским языком... Банально помигать светодиодами на плате STM32F3 discavery... есть видео уроки на youtube-е https://www.youtube.com/watch?v=Bd8YxrMES70...jqV&index=4 вот по ним пытаюсь освоить Keil и ARM. Да, в уроках используется плата stm32f4xx discavery, но я думаю это не суть вещей. Адекватной литературы на тему "Самоучитель для чайников ARM" я не нашел, либо старье либо не для keil. Может быть плохо искал, не знаю. По этому и спрашиваю, уважаемых Вас, что бы ткнули пальцем, как слепому котенку. Типа делай так и так и будет тебе счастье... Не поняв как работать, вызывать прерывание через hel или нет, дальше смотреть туториалы и побывать по ним писать код - не вижу смысла так как это основа-основ. uint16_t delay_count = 0; Попробовать добавить volatile к нему... делал, результат тот же... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться