|
Проблема с прерыванием, Мигание светодиодами посредством прерывания |
|
|
|
Jul 14 2015, 19:53
|
Группа: Новичок
Сообщений: 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) я не нашел. Помогите пожалуйста разобраться новичку с прерываниями
Сообщение отредактировал IgorKossak - Jul 15 2015, 05:30
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!
|
|
|
|
|
Jul 14 2015, 20:23
|
Участник

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

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

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

|
Код void SisTick_Handler(void) это что такое. Если хотите свое имя функции-обработчика прерываний, то будьте добры их поправить в startup файле. Похоже проблема с самим проектом. CMSIS добавили?
--------------------
Блог о разработке на CC430, SIM900, GPS, ARM и не только...
|
|
|
|
|
Jul 15 2015, 06:22
|
Группа: Новичок
Сообщений: 9
Регистрация: 6-05-15
Пользователь №: 86 548

|
По поводу : Код void SisTick_Handler(void) , каюсь. Нет не хотел свою функцию, просто опечатался  при исправлении на правлиьный Код void SysTick_Handler(void) появляется уже знакомая ошибка. Цитата Тупо воспользоваться поиском по всему проекту и найти этот обработчик.... Хотелось бы, но как этот поиск сделать... банальная ctrl+f не работает на глобальный, ищет постранично...
|
|
|
|
|
Jul 15 2015, 06:55
|
Группа: Новичок
Сообщений: 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? Упоминаний о ней много, все советуют в нее заглянуть, а вот где она находится - для меня загадка...  в проекте присутствует 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 */ }
|
|
|
|
|
Jul 15 2015, 07:10
|
Частый гость
 
Группа: Участник
Сообщений: 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
|
|
|
|
|
Jul 15 2015, 07:45
|
Группа: Новичок
Сообщений: 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] - для короткого!!!
|
|
|
|
|
Jul 15 2015, 12:53
|
Группа: Новичок
Сообщений: 9
Регистрация: 6-05-15
Пользователь №: 86 548

|
Поменял- эффект то же... светодиоды просто горят... Напишите пожалуйста пример использования и объявления прирывания через хал...
|
|
|
|
|
Jul 15 2015, 14:42
|
Частый гость
 
Группа: Участник
Сообщений: 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
|
|
|
|
|
Jul 15 2015, 15:09
|
Участник

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

|
uint16_t delay_count = 0;
Попробовать добавить volatile к нему...
|
|
|
|
|
Jul 15 2015, 15:48
|
Группа: Новичок
Сообщений: 9
Регистрация: 6-05-15
Пользователь №: 86 548

|
Цитата Вы бы написали, что хотите сделать... Кажется, что Вы это сами не знаете... Русским языком... Банально помигать светодиодами на плате STM32F3 discavery... есть видео уроки на youtube-е Цитата вот по ним пытаюсь освоить Keil и ARM. Да, в уроках используется плата stm32f4xx discavery, но я думаю это не суть вещей. Адекватной литературы на тему "Самоучитель для чайников ARM" я не нашел, либо старье либо не для keil. Может быть плохо искал, не знаю. По этому и спрашиваю, уважаемых Вас, что бы ткнули пальцем, как слепому котенку. Типа делай так и так и будет тебе счастье... Не поняв как работать, вызывать прерывание через hel или нет, дальше смотреть туториалы и побывать по ним писать код - не вижу смысла так как это основа-основ. Цитата uint16_t delay_count = 0; Попробовать добавить volatile к нему... делал, результат тот же...
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|