FAQ | Points | Add... | Recent posts | Search | Register | Log in


[STM32][C/GCC] Przerwanie na buttonie i Hard Fault


Post new topic  This topic is locked      Main Page -> Forum Index -> Microcontrollers Generally -> ARM Microcontrollers -> [STM32][C/GCC] Przerwanie na buttonie i Hard Fault
Author
Message
qscgu
Poziom 23
Poziom 23


Joined: 07 Jul 2005
Posts: 3274
Location: Myslowice

Post#1 Post from the author of the topic 06 Feb 2012 12:14   

[STM32][C/GCC] Przerwanie na buttonie i Hard Fault


Witam.

Mam płytkę WaveShare Port103Z
Chciałem sobie zrobić obsługę przerwań na przycisku.

Projektem jest przykładowy projekt ze strony:
http://www.freddiechopin.info/index.php/pl/download/category/6-przyklady
stm32_blink_led
Z dodaną biblioteką stm32f10x

Samo miganie diodą działa poprawnie.

Kod inicjalizacji przycisku:
Code C - [expand]
void ButtonInit(void)
{
//EXTI structure to init EXT
EXTI_InitTypeDef EXTI_InitStructure;
//NVIC structure to set up NVIC controller
NVIC_InitTypeDef NVIC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
 
NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
 
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOF, &GPIO_InitStructure);
 
GPIO_EXTILineConfig(GPIO_PortSourceGPIOF, GPIO_PinSource13);
EXTI_InitStructure.EXTI_Line = EXTI_Line13;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
 
 
}


Praktycznie skopiowany stąd:
http://www.elektroda.pl/rtvforum/topic1991536.html
Autor pisał, że dla przycisku A0 działa. Mi natomiast wyrzuca Hard fault już nawet po dotknięciu płytki ew po naciśnięciu przycisku. Jak wywalę ten kod inicjalizacji to problemu nie ma.

Wiem, że jeszcze trzeba włączyć wewnętrzny pull-up ale to w sumie nie powinno mieć znaczenia jeśli przycisk jest złączony z masą, po prostu powinien nie działać a tymczasem wywala Hard Fault. Czyżbym o czymś zapomniał?

Przycisk jest złączony z masą na porcie PF13[/code]
Back to top
   
Freddie Chopin
Poziom 25
Poziom 25


Joined: 12 Dec 2005
Posts: 7300
Location: Zawiercie

Post#2 06 Feb 2012 14:19   

Re: [STM32][C/GCC] Przerwanie na buttonie i Hard Fault


A funkcja obsługi przerwania jest?

4\/3!!
Back to top
   
qscgu
Poziom 23
Poziom 23


Joined: 07 Jul 2005
Posts: 3274
Location: Myslowice

Post#3 Post from the author of the topic 06 Feb 2012 14:38   

Re: [STM32][C/GCC] Przerwanie na buttonie i Hard Fault


Tak oczywiście:
Podobnie zresztą jak w kodzie, który wyżej dałem.
Code C - [expand]
void EXTI15_10_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line13) != RESET)
{
// Czyszczenie flagi przerwania
EXTI_ClearITPendingBit(EXTI_Line13);
 
//TIM_SetCompare1(TIM2, 200); // okolo 60ms
//TIM_SetCounter(TIM2, 0); // zeruj licznik
 
// Wlaczenie timera
//TIM_Cmd(TIM2, ENABLE);
// oraz jego przerwania
//TIM_ITConfig(TIM2, TIM_IT_CC1, ENABLE);
if (led == 1) {
LED_bb = 1;
led = 0;
} else {
LED_bb = 0;
led = 0;
}
}
}


Ale on do tej funkcji w ogóle nie wchodzi. Mam tu ustawionego breakpointa.
Back to top
   
nsvinc
Poziom 22
Poziom 22


Joined: 25 Mar 2006
Posts: 2066
Location: otfock

Post#4 06 Feb 2012 14:51   

Re: [STM32][C/GCC] Przerwanie na buttonie i Hard Fault


Sprawdz, czy nazwa ISRa ( EXTI15_10_IRQHandler ) jest identyczna jak w pliku z rozbiegówką.

qscgu wrote:
Wiem, że jeszcze trzeba włączyć wewnętrzny pull-up ale to w sumie nie powinno mieć znaczenia jeśli przycisk jest złączony z masą, po prostu powinien nie działać

Układ po prostu powinien nie działać, skoro nie włączyłeś pull-upa. Jak procesor ma odróżnić HiZ od masy?...
Back to top
   
stanleysts
Poziom 14
Poziom 14


Joined: 03 Mar 2010
Posts: 183
Location: Kraków

Post#5 06 Feb 2012 14:53   

Re: [STM32][C/GCC] Przerwanie na buttonie i Hard Fault


a zegary masz ustawione (np. dla AFIO- RCC_APBxPeriphClockCmd(RCC_APBxPeriph_AFIO, ENABLE); )
Back to top
   
Google

Google Adsense


Post# 06 Feb 2012 14:53   





Back to top
   
qscgu
Poziom 23
Poziom 23


Joined: 07 Jul 2005
Posts: 3274
Location: Myslowice

Post#6 Post from the author of the topic 06 Feb 2012 15:00   

Re: [STM32][C/GCC] Przerwanie na buttonie i Hard Fault


Rozbiegówką?
W sensie w pliku nagłówkowym? Jeśli tak to jest ta sama nazwa. Chyba, że chodzi o jakiś plik biblioteki?
Back to top
   
nsvinc
Poziom 22
Poziom 22


Joined: 25 Mar 2006
Posts: 2066
Location: otfock

Post#7 06 Feb 2012 15:11   

Re: [STM32][C/GCC] Przerwanie na buttonie i Hard Fault


chodzi o (najpewniej jedyny w projekcie) plik z rozszerzeniem .s
Back to top
   
qscgu
Poziom 23
Poziom 23


Joined: 07 Jul 2005
Posts: 3274
Location: Myslowice

Post#8 Post from the author of the topic 06 Feb 2012 15:27   

Re: [STM32][C/GCC] Przerwanie na buttonie i Hard Fault


Hmm, w pliku startup.S nie ma definicji. Jest natomiast w pliku vectors.c i tam też się nazywa
EXTI15_10_IRQHandler

linijka
void EXTI15_10_IRQHandler(void) __attribute__ ((interrupt, weak, alias("__Default_Handler")));
Back to top
   
gaskoin
Poziom 22
Poziom 22


Joined: 02 Jun 2010
Posts: 2194
Location: Bytom

Post#9 06 Feb 2012 15:30   

Re: [STM32][C/GCC] Przerwanie na buttonie i Hard Fault


to jeszcze dla handlera przerwania musisz dodać informację, że jest ono przerwaniem poprzez atrybut interrupt.
Back to top
   
qscgu
Poziom 23
Poziom 23


Joined: 07 Jul 2005
Posts: 3274
Location: Myslowice

Post#10 Post from the author of the topic 06 Feb 2012 15:45   

Re: [STM32][C/GCC] Przerwanie na buttonie i Hard Fault


Nic to niestety nie pomogło :|

Z innych modyfikacji kodu Frediego to:

Włączenie F:
Code C - [expand]
RCC->APB2ENR = RCC_APB2ENR_IOPAEN | RCC_APB2ENR_IOPBEN | RCC_APB2ENR_IOPCEN |
RCC_APB2ENR_IOPDEN | RCC_APB2ENR_IOPEEN | RCC_APB2ENR_IOPFEN | RCC_APB2ENR_AFIOEN; // enable all GPIOs and AFIO

Za pomocą RCC_APB2ENR_IOPFEN

I tutaj miałem dziwny problem, odkomentowałem odpowienią linię w pliku nagłówkowym stm32f10x.h:
Code C - [expand]
#if !defined (STM32F10X_LD) && !defined (STM32F10X_LD_VL) && !defined (STM32F10X_MD) && !defined (STM32F10X_MD_VL) && !defined (STM32F10X_HD) && !defined (STM32F10X_HD_VL) && !defined (STM32F10X_XL) && !defined (STM32F10X_CL)
/* #define STM32F10X_LD */ /*!< STM32F10X_LD: STM32 Low density devices */
/* #define STM32F10X_LD_VL */ /*!< STM32F10X_LD_VL: STM32 Low density Value Line devices */
 
/* #define STM32F10X_MD */ /*!< STM32F10X_MD: STM32 Medium density devices */
/* #define STM32F10X_MD_VL */ /*!< STM32F10X_MD_VL: STM32 Medium density Value Line devices */
#define STM32F10X_HD /*!< STM32F10X_HD: STM32 High density devices */
/* #define STM32F10X_HD_VL */ /*!< STM32F10X_HD_VL: STM32 High density value line devices */
/* #define STM32F10X_XL */ /*!< STM32F10X_XL: STM32 XL-density devices */
/* #define STM32F10X_CL */ /*!< STM32F10X_CL: STM32 Connectivity line devices */
#endif
 


Tak, żebym mógł w ogóle uzyskać dostęp do przerwań > 4. W pliku gpio.h mam:
Code C - [expand]
 
#include "stm32f10x.h"


Natomiast przy kompilacji wyrzuca błąd:
Code:
'Compiling file: gpio.c'
arm-none-eabi-gcc -c -mcpu=cortex-m3 -mthumb -O0 -ffunction-sections -fdata-sections -Wall -Wstrict-prototypes -Wextra -std=gnu89 -g -ggdb3 -fverbose-asm -Wa,-ahlms=out/gpio.lst -DSTM32F10X_MD -MD -MP -MF out/gpio.d -I.  gpio.c -o out/gpio.o
gpio.c: In function 'gpio_init':
gpio.c:61:46: error: 'RCC_APB2ENR_IOPFEN' undeclared (first use in this function)
gpio.c:61:46: note: each undeclared identifier is reported only once for each function it appears in
cs-make: *** [out/gpio.o] Error 1


Ale zdefiniowałem sobie to w gpio.h i działa...
Code C - [expand]
#define RCC_APB2ENR_IOPFEN ((uint32_t)0x00000080)


Dziwne jest to, że układ reaguje na bliskość palca. Już samo zbliżenie palucha do buttona powoduje wywołanie przerwania Hard Fault...
Czuję, że jest jakiś problem na fundamentalnym poziomie :(
Back to top
   
nsvinc
Poziom 22
Poziom 22


Joined: 25 Mar 2006
Posts: 2066
Location: otfock

Post#11 06 Feb 2012 15:48   

Re: [STM32][C/GCC] Przerwanie na buttonie i Hard Fault


Czy hardfault wystepuje gdy wyłączysz przerwania i zbliżysz palca do układu?
Włącz systick - to mniej lub bardziej pozwoli zweryfikować, gdzie masz zonk; jak systick będzie ci działał i od zbliżania palca nie będzie hardfaulta, to trzeba od początku powoli i spokojnie przekopać się przez EXTI.
Back to top
   
qscgu
Poziom 23
Poziom 23


Joined: 07 Jul 2005
Posts: 3274
Location: Myslowice

Post#12 Post from the author of the topic 06 Feb 2012 15:58   

Re: [STM32][C/GCC] Przerwanie na buttonie i Hard Fault


Włączony systick. Wchodzi w niego. Bez debugowania zdąży 2 razy się uruchomić.
Z debugowaniem po pierwszej instrukcji jest Hard Fault.
Back to top
   
nsvinc
Poziom 22
Poziom 22


Joined: 25 Mar 2006
Posts: 2066
Location: otfock

Post#13 06 Feb 2012 15:59   

Re: [STM32][C/GCC] Przerwanie na buttonie i Hard Fault


po pierwszej instrukcji w ISRrze systick'a?
Back to top
   
qscgu
Poziom 23
Poziom 23


Joined: 07 Jul 2005
Posts: 3274
Location: Myslowice

Post#14 Post from the author of the topic 06 Feb 2012 16:07   

Re: [STM32][C/GCC] Przerwanie na buttonie i Hard Fault


Tak, wygląda to jakby po prostu po pewnym czasie wywalało hard fault. Po prostu jak nie włączę breakpointa to program wykonuje się ok 2s. W trybie debudowania pierwsze przejście zajmuje ze 2s.

EDIT:

Po wyłączeniu konfiguracji buttona systick działa normalnie.
Back to top
   
Google

Google Adsense


Post# Post from the author of the topic 06 Feb 2012 16:07   





Back to top
   
Freddie Chopin
Poziom 25
Poziom 25


Joined: 12 Dec 2005
Posts: 7300
Location: Zawiercie

Post#15 06 Feb 2012 23:19helpful post - solution   

Re: [STM32][C/GCC] Przerwanie na buttonie i Hard Fault


Co do Twojego problemu deklaracji typu układu - typ ten zdefiniowany jest w Makefile (MD, HD, CL, ...)

Jeśli używasz przerwań, to ustaw jakąś wielkość stosu dla przerwań w skrypcie linkera (domyślnie jest 0, bo nie ma przerwań w przykładach).

4\/3!!
Back to top
   
Google

Google Adsense


Post# 06 Feb 2012 23:19helpful post - solution   





Back to top
   
qscgu
Poziom 23
Poziom 23


Joined: 07 Jul 2005
Posts: 3274
Location: Myslowice

Post#16 Post from the author of the topic 07 Feb 2012 01:30   

Re: [STM32][C/GCC] Przerwanie na buttonie i Hard Fault


Problem rozwiązany. Przede wszystkim ustawiłem wszystko tak jak ma być pod mojego buttona (ale to nie było powodem problemu!):
Code C - [expand]
void ButtonInit(void)
{
EXTI_InitTypeDef EXTI_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
 
/* Enable GPIOA clock */
RCC->APB2ENR = RCC_APB2ENR_IOPAEN | RCC_APB2ENR_IOPEEN;
 
/* Configure PA.00 pin as input floating */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOA, &GPIO_InitStructure);
 
/* Enable AFIO clock */
RCC->APB2ENR |= RCC_APB2ENR_AFIOEN;
 
/* Connect EXTI0 Line to PA.00 pin */
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);
 
/* Configure EXTI0 line */
EXTI_InitStructure.EXTI_Line = EXTI_Line0;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
 
/* Enable and set EXTI0 Interrupt to the lowest priority */
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0F;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0F;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
 
}


Czyli tryb buttona na GPIO_Mode_IPU tj Input Pull Up. oraz wykrywanie zbocza opadającego: EXTI_Trigger_Falling.

Co więc było powodem problemu? Nie mam zielonego pojęcia.
Co zrobiłem? Wyciągnąłem kawałki kodu z biblioteki ST32... Jedyne czym się różni kod to tak na prawdę brak wywołań:
assert_param(IS_EXTI_LINE(EXTI_Line));

Tak wygląda teraz moja funkcja:
Code C - [expand]
void EXTI0_IRQHandler(void)
{
if (((EXTI->PR & EXTI_Line0) != (uint32_t)RESET) && (EXTI->IMR & EXTI_Line0 != (uint32_t)RESET))
{
if (led == 1) {
LED2_bb = 1;
led = 0;
} else {
LED2_bb = 0;
led = 1;
}
EXTI->PR = EXTI_Line0;
}
}


Na pewno jest to kiepskie rozwiązanie ale przynajmniej znalazłem przyczynę problemu. Teraz tylko pozbyć się wszystkich bibliotek ST32, zostawić ewentualnie nagłówki i opracować prostsze funkcje konfiguracyjne porty.
Back to top
   
Freddie Chopin
Poziom 25
Poziom 25


Joined: 12 Dec 2005
Posts: 7300
Location: Zawiercie

Post#17 07 Feb 2012 08:56   

Re: [STM32][C/GCC] Przerwanie na buttonie i Hard Fault


qscgu wrote:
if (led == 1) {
LED2_bb = 1;
led = 0;
} else {
LED2_bb = 0;
led = 1;
}

W tym kawałku kodu możesz odczytywać bezpośrednio wartość LED2_bb - też się da. A w zasadzie wystarczyłoby gdybyś tylko odwracał stan - LED2_bb ^= 1.

qscgu wrote:
Teraz tylko pozbyć się wszystkich bibliotek ST32

No właśnie - bardzo dobra decyzja <;

qscgu wrote:
opracować prostsze funkcje konfiguracyjne porty

Jeśli chodzi Ci o konfigurację typu kierunek (to co jest w CRL/CRH) to taka funkcja jest w przykładach najnowszych.

4\/3!!
Back to top
   
qscgu
Poziom 23
Poziom 23


Joined: 07 Jul 2005
Posts: 3274
Location: Myslowice

Post#18 Post from the author of the topic 07 Feb 2012 12:56   

Re: [STM32][C/GCC] Przerwanie na buttonie i Hard Fault


Quote:
W tym kawałku kodu możesz odczytywać bezpośrednio wartość LED2_bb - też się da.

Ja wiem, że się da odczytać z rejestrów wyjściowych. Po prostu na szybko wcześniej coś napisałem nie myśląc i potem tego nie zmieniałem.
Znam te tematy z atmeg. Na początku nie wiedziałem jak to jest z armami.

Quote:
Jeśli chodzi Ci o konfigurację typu kierunek

Chodzi mi o konfiguracje tych pierdółek:

Code C - [expand]
EXTI_InitTypeDef EXTI_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;

Nie widzę sensu tworzenia struktur przy konfiguracji rejestrów EXTI GPIO i NVIC. Programowanie struktur nie ma tutaj uzasadnienia. Dużo prościej zrobić coś pokroju:

GPIO_Init(GPIOA, GPIO_Pin_0 | GPIO_Mode_IPU | GPIO_Speed_50MHz);
Ewentualnie , zamiast |.
[/quote]
Back to top
   
Freddie Chopin
Poziom 25
Poziom 25


Joined: 12 Dec 2005
Posts: 7300
Location: Zawiercie

Post#19 07 Feb 2012 13:09   

Re: [STM32][C/GCC] Przerwanie na buttonie i Hard Fault


No to od GPIO masz funkcję w przykładach najnowszych:

Code C - [expand]
/*------------------------------------------------------------------------*//**
* \brief Configures pin.
* \details Configures one pin in one port.
*
* \param [in] port_ptr points to the configuration structure of desired port
* \param [in] pin selects one pin, [0,15]
* \param [in] mode_cnf_value is a value of MODE and CNF which will be set for
* selected pin, {GPIO_CRx_MODE_CNF_IN_ANALOG_value,
* GPIO_CRx_MODE_CNF_IN_FLOATING_value, GPIO_CRx_MODE_CNF_IN_PULL_U_D_value,
* GPIO_CRx_MODE_CNF_OUT_PP_2M_value, GPIO_CRx_MODE_CNF_OUT_PP_10M_value,
* GPIO_CRx_MODE_CNF_OUT_PP_50M_value, GPIO_CRx_MODE_CNF_OUT_OD_2M_value,
* GPIO_CRx_MODE_CNF_OUT_OD_10M_value, GPIO_CRx_MODE_CNF_OUT_OD_50M_value,
* GPIO_CRx_MODE_CNF_ALT_PP_2M_value, GPIO_CRx_MODE_CNF_ALT_PP_10M_value,
* GPIO_CRx_MODE_CNF_ALT_PP_50M_value, GPIO_CRx_MODE_CNF_ALT_OD_2M_value,
* GPIO_CRx_MODE_CNF_ALT_OD_10M_value, GPIO_CRx_MODE_CNF_ALT_OD_50M_value} or
* use m_GPIO_MODE_CNF_value(mode, cnf) macro
*/
/*-------------------------------------------------------------------------*/
 
void gpio_pin_cfg(GPIO_TypeDef *port_ptr, uint32_t pin, uint32_t mode_cnf_value)


użycie:

Code C - [expand]
gpio_pin_cfg(LED_GPIO, LED_pin, GPIO_CRx_MODE_CNF_OUT_PP_10M_value);


4\/3!!
Back to top
   
qscgu
Poziom 23
Poziom 23


Joined: 07 Jul 2005
Posts: 3274
Location: Myslowice

Post#20 Post from the author of the topic 07 Feb 2012 13:15   

Re: [STM32][C/GCC] Przerwanie na buttonie i Hard Fault


Jeśli mam być szczery to nie podoba mi się cały ciąg tego. Może i funkcja sama jest git, ale tryby raz, że nie kompletne bo brakuje
GPIO_Mode_IPD = 0x28,
GPIO_Mode_IPU = 0x48,

to jeszcze całe te ciągi wg mnie są chyba nie potrzebne
Zamiast:
GPIO_CRx_MODE_CNF_IN_FLOATING_value
Można dać
GPIO_Mode_IN_FLOATING_value
A nawet:
GPIO_Mode_IN_FLOATING

Poprawia to czytelność.

Jak rozumiem, te przykłady to twoje projekty tak? Jeśli tak to jaka jest na nie licencja? Można je przerobić i wykorzystać do komercyjnych projektów czy jest to zabronione?
Back to top
   
Freddie Chopin
Poziom 25
Poziom 25


Joined: 12 Dec 2005
Posts: 7300
Location: Zawiercie

Post#21 07 Feb 2012 13:22helpful post - solution   

Re: [STM32][C/GCC] Przerwanie na buttonie i Hard Fault


qscgu wrote:
Jeśli mam być szczery to nie podoba mi się cały ciąg tego. Może i funkcja sama jest git, ale tryby raz, że nie kompletne bo brakuje
GPIO_Mode_IPD = 0x28,
GPIO_Mode_IPU = 0x48,

Albo ja o czymś nie wiem, albo ty mówisz o innych STM32...
Bo opcja o pullup/down jest, ale samo skonfigurowanie czy down czy up nie jest już kwestią tej funkcji, tylko ustawienia rejestru ODR.

Quote:
to jeszcze całe te ciągi wg mnie są chyba nie potrzebne
Zamiast:
GPIO_CRx_MODE_CNF_IN_FLOATING_value
Można dać
GPIO_Mode_IN_FLOATING_value
A nawet:
GPIO_Mode_IN_FLOATING

Poprawia to czytelność.

Być może, to już kwestia osobistych preferencji.

Quote:
Jak rozumiem, te przykłady to twoje projekty tak? Jeśli tak to jaka jest na nie licencja? Można je przerobić i wykorzystać do komercyjnych projektów czy jest to zabronione?

Licencja bez-licencji czyli "róbta co chceta" (; W terminach prawnych chyba będzie to "public domain". Nic nie jest zabronione. Na pewno jednak będzie miło, jeśli zachowasz info o oryginalnym autorze wraz z linkiem, ale to też nie jest konieczność, tylko miły gest (;

4\/3!!
Back to top
   
qscgu
Poziom 23
Poziom 23


Joined: 07 Jul 2005
Posts: 3274
Location: Myslowice

Post#22 Post from the author of the topic 07 Feb 2012 13:33   

Re: [STM32][C/GCC] Przerwanie na buttonie i Hard Fault


Quote:
Bo opcja o pullup/down jest, ale samo skonfigurowanie czy down czy up nie jest już kwestią tej funkcji, tylko ustawienia rejestru ODR.


Code C - [expand]
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOA, &GPIO_InitStructure);


Już samym takim ustawieniu, działa button podłączony do masy.
Sprawdziłem funkcję GPIO_Init i tam nie ma ani jednego odniesienia do rejestru ODR.

EDIT:
Zmieniłem ten kawałek kodu na:
Code C - [expand]
gpio_pin_cfg(GPIOA, GPIO_Pin_0, GPIO_CRx_MODE_CNF_IN_PULL_U_D_value);

I nie działa. Dioda miga cały czas. Czyli cały czas wchodzi do przerwania. Chyba jednak nie jest to całe skonfigurowane.

Quote:
Na pewno jednak będzie miło, jeśli zachowasz info o oryginalnym autorze wraz z linkiem


Nie ma problemu, tylko komentarze też będę musiał przerobić na mój styl.
Back to top
   
nsvinc
Poziom 22
Poziom 22


Joined: 25 Mar 2006
Posts: 2066
Location: otfock

Post#23 07 Feb 2012 13:50   

Re: [STM32][C/GCC] Przerwanie na buttonie i Hard Fault


Code C - [expand]
 
GPIOA->CRL=8;
GPIOA->ODR=1;
 

konfiguruje A0 na wejście z podciąganiem. Nie są potrzebne dalsze udziwnienia, aby po prostu chodziło...
Back to top
   
gaskoin
Poziom 22
Poziom 22


Joined: 02 Jun 2010
Posts: 2194
Location: Bytom

Post#24 07 Feb 2012 14:07   

Re: [STM32][C/GCC] Przerwanie na buttonie i Hard Fault


nsvinc wrote:
Code C - [expand]
 
GPIOA->CRL=8;
GPIOA->ODR=1;
 

konfiguruje A0 na wejście z podciąganiem. Nie są potrzebne dalsze udziwnienia, aby po prostu chodziło...


Jedyna niedogodność jest taka, że trzeba pamiętać wszystkie konfigi i je przesuwać o pin*4 albo za każdym razem czytać manuala (po 4 miesiącach jak zerkniesz w kod to nie będziesz pamiętał co to jest to 8)
Back to top
   
nsvinc
Poziom 22
Poziom 22


Joined: 25 Mar 2006
Posts: 2066
Location: otfock

Post#25 07 Feb 2012 14:11   

Re: [STM32][C/GCC] Przerwanie na buttonie i Hard Fault


będę, bo teraz pisałem z pamięci ;]

Prosta zasada wpisywania liczb do CRH/CRL:

- 3: output 50MHz
- B: alt output 50MHz
- 7: OD output 50MHz
- 4: floating input
- 8: pu/pd input
- 0: adc input
Back to top
   
qscgu
Poziom 23
Poziom 23


Joined: 07 Jul 2005
Posts: 3274
Location: Myslowice

Post#26 Post from the author of the topic 07 Feb 2012 14:11   

Re: [STM32][C/GCC] Przerwanie na buttonie i Hard Fault


Quote:
konfiguruje A0 na wejście z podciąganiem. Nie są potrzebne dalsze udziwnienia, aby po prostu chodziło...

Wytłumacz mi w takim razie dlaczego konfiguracja od STM'a działa poprawnie bez odwoływania się do rejestru ODR ?
Back to top
   
nsvinc
Poziom 22
Poziom 22


Joined: 25 Mar 2006
Posts: 2066
Location: otfock

Post#27 07 Feb 2012 14:28   

Re: [STM32][C/GCC] Przerwanie na buttonie i Hard Fault


Nie potrafię tego wytłumaczyć. I nie podejmuję się również research'a tej materii, gdyż tylko twórcy tej (tfu!) biblioteki wiedzą, jak ona działa.
Manual mówi, że aby włączyć pin A0 na wejście z podciąganiem, w SFRach musi być to, co podałem. A skoro manual tak mówi, to tak jest.
Back to top
   
qscgu
Poziom 23
Poziom 23


Joined: 07 Jul 2005
Posts: 3274
Location: Myslowice

Post#28 Post from the author of the topic 07 Feb 2012 14:32   

Re: [STM32][C/GCC] Przerwanie na buttonie i Hard Fault


Przepraszam za zamieszanie. Nie przestudiowałem dokładnie funkcji z tej biblioteki. On po prostu nie odwołu się do ODR a do BRR i BSRR

Code C - [expand]
 
if (GPIO_InitStruct->GPIO_Mode == GPIO_Mode_IPD)
{
GPIOx->BRR = (((uint32_t)0x01) << pinpos);
}
else
{
/* Set the corresponding ODR bit */
if (GPIO_InitStruct->GPIO_Mode == GPIO_Mode_IPU)
{
GPIOx->BSRR = (((uint32_t)0x01) << pinpos);
}
}

Back to top
   
gaskoin
Poziom 22
Poziom 22


Joined: 02 Jun 2010
Posts: 2194
Location: Bytom

Post#29 07 Feb 2012 15:33   

Re: [STM32][C/GCC] Przerwanie na buttonie i Hard Fault


nsvinc wrote:
będę, bo teraz pisałem z pamięci ;]

Prosta zasada wpisywania liczb do CRH/CRL:

- 3: output 50MHz
- B: alt output 50MHz
- 7: OD output 50MHz
- 4: floating input
- 8: pu/pd input
- 0: adc input


dla mnie wygodniej jest stworzyć coś takiego :

Code C - [expand]
 
...
#define OUTPUT_50MHZ 3
 
#define LED_PIN 4
#define LED_GPIO GPIOA
 
void configureGPIO(GPIO_TypeDef* gpio, uint8_t pin, uint8_t conf){
uint32_t *crPointer;
 
if(pin < 8)
crPointer = gpio->CRL;
else {
crPointer = gpio->CRH;
pin -= 8;
}
 
*crPointer &= ~( 0xF << (pin * 4));
*crPointer |= conf << (pin * 4);
}
 
...
 
configureGPIO(LED_GPIO, LED_PIN, OUTPUT_50MHZ)


Podejrzewam, że to co napisał Freddie wygląda bardzo podobnie :) Można cudować jeszcze z listą pinów i konfiguracji, ale nie widzę potrzeby jak mam tyle flasha. Nie muszę znać DSa na pamięć, dla klarowności zamiast definów można zrobić enuma z konfiguracjami
Back to top
   
nsvinc
Poziom 22
Poziom 22


Joined: 25 Mar 2006
Posts: 2066
Location: otfock

Post#30 07 Feb 2012 16:00   

Re: [STM32][C/GCC] Przerwanie na buttonie i Hard Fault


Oczywiście, że to jest prostsze i przyjemniejsze ;]
Nie stosuję tego, z czystego lenistwa chyba. Jedyny mankament takiej funkcji jest to, że gdy się chce często i szybko zmieniać konfigurację konkretnego pina (np. przełączanie między wyjściem a wejściem) to funkcja marnuje czas. Ale tak poza tym, to nie da się ukryć że patent jest fajny ;]
Back to top
   
Google

Google Adsense


Post# 07 Feb 2012 16:00   





Back to top
   
Post new topic  This topic is locked      Main Page -> Forum Index -> Microcontrollers Generally -> ARM Microcontrollers -> [STM32][C/GCC] Przerwanie na buttonie i Hard Fault
Page 1 of 2 Go to page 1, 2  Next
Similar topics
[ARM7][gcc 4.2.2] przerwanie FIQ (26)
[at91sam7s256][gcc] przerwanie z timera (30)
[Bascom] Hard spi, slave, chip select, przerwanie (7)
[STM32][Keil][C]Hard Fault tylko przy optymalizacji -O3 (9)
[stm32][c/crossworks] Hard Fault przy wejsciu do funkcji (13)
[STM32 / Truestudio]Hard Fault przy powrocie z funkcji. (2)
[STM32]USART hard fault przy wysyłaniu (7)
[at91sam7s][gcc] Przerwanie USART (6)
AVR GCC TIMER0 i przerwanie - problem (6)
[atmega8][gcc]przerwanie od zbocza od przepełnienia (3)

Page generation time: 0.312 seconds


FAQ || Administrator || Moderators || Widgets and banners || Contact
elektroda.pl topic RSS feed