| Author |
Message
|
qscgu Poziom 23

Joined: 07 Jul 2005 Posts: 3274 Location: Myslowice
|
#1
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:
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

Joined: 12 Dec 2005 Posts: 7300 Location: Zawiercie
|
#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

Joined: 07 Jul 2005 Posts: 3274 Location: Myslowice
|
#3
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.
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

Joined: 25 Mar 2006 Posts: 2066 Location: otfock
|
#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

Joined: 03 Mar 2010 Posts: 183 Location: Kraków
|
#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

|
#
06 Feb 2012 14:53 |
|
|
|
|
|
| Back to top |
|
 |
qscgu Poziom 23

Joined: 07 Jul 2005 Posts: 3274 Location: Myslowice
|
#6
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

Joined: 25 Mar 2006 Posts: 2066 Location: otfock
|
#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

Joined: 07 Jul 2005 Posts: 3274 Location: Myslowice
|
#8
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

Joined: 02 Jun 2010 Posts: 2194 Location: Bytom
|
#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

Joined: 07 Jul 2005 Posts: 3274 Location: Myslowice
|
#10
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:
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:
#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:
#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...
#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

Joined: 25 Mar 2006 Posts: 2066 Location: otfock
|
#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

Joined: 07 Jul 2005 Posts: 3274 Location: Myslowice
|
#12
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

Joined: 25 Mar 2006 Posts: 2066 Location: otfock
|
#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

Joined: 07 Jul 2005 Posts: 3274 Location: Myslowice
|
#14
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

|
#
06 Feb 2012 16:07 |
|
|
|
|
|
| Back to top |
|
 |
Freddie Chopin Poziom 25

Joined: 12 Dec 2005 Posts: 7300 Location: Zawiercie
|
#15
06 Feb 2012 23:19 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

|
#
06 Feb 2012 23:19 |
|
|
|
|
|
| Back to top |
|
 |
qscgu Poziom 23

Joined: 07 Jul 2005 Posts: 3274 Location: Myslowice
|
#16
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!):
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:
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

Joined: 12 Dec 2005 Posts: 7300 Location: Zawiercie
|
#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

Joined: 07 Jul 2005 Posts: 3274 Location: Myslowice
|
#18
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:
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

Joined: 12 Dec 2005 Posts: 7300 Location: Zawiercie
|
#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:
/*------------------------------------------------------------------------*//** * \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:
gpio_pin_cfg(LED_GPIO, LED_pin, GPIO_CRx_MODE_CNF_OUT_PP_10M_value);
4\/3!!
|
|
| Back to top |
|
 |
qscgu Poziom 23

Joined: 07 Jul 2005 Posts: 3274 Location: Myslowice
|
#20
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

Joined: 12 Dec 2005 Posts: 7300 Location: Zawiercie
|
#21
07 Feb 2012 13:22 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

Joined: 07 Jul 2005 Posts: 3274 Location: Myslowice
|
#22
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. |
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:
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

Joined: 25 Mar 2006 Posts: 2066 Location: otfock
|
#23
07 Feb 2012 13:50 Re: [STM32][C/GCC] Przerwanie na buttonie i Hard Fault |
|
|
|
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

Joined: 02 Jun 2010 Posts: 2194 Location: Bytom
|
#24
07 Feb 2012 14:07 Re: [STM32][C/GCC] Przerwanie na buttonie i Hard Fault |
|
|
|
| nsvinc wrote: |
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

Joined: 25 Mar 2006 Posts: 2066 Location: otfock
|
#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

Joined: 07 Jul 2005 Posts: 3274 Location: Myslowice
|
#26
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

Joined: 25 Mar 2006 Posts: 2066 Location: otfock
|
#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

Joined: 07 Jul 2005 Posts: 3274 Location: Myslowice
|
#28
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
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

Joined: 02 Jun 2010 Posts: 2194 Location: Bytom
|
#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 :
... #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

Joined: 25 Mar 2006 Posts: 2066 Location: otfock
|
#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

|
#
07 Feb 2012 16:00 |
|
|
|
|
|
| Back to top |
|
 |