Hallo möchte au feinem STM32F103RB ein Bauteil an den SPI anschliessen. Bei dem Chip steht in einem Beispiel (Bosch BMA 020A) für einen AVR die Beschaltung SCK MOSI MIOS GND und (INT) und (CS) ? Cableselect? Was ist dieses INT und CS, welcher Pin ist dies an meinem STM? lg Kerstin
CS = SPI Chip select (Dürfte beim STM32 NSS sein). Als Interrupt-Eingang wird wahrscheinlich jeder GPIO geeignet sein, Programmierung im EXTI. HDH. Zock
>Was ist dieses INT und CS, welcher Pin ist dies an meinem STM?
Schau in die Datenblätter beider Chips. Die sind dazu
da solche Fragen zu beantworten.
Mir ist klar dass es beim Atmel ein Interrupt Pin ist, der dann einen entsprechenden Interrupt auslösen kann. Nur ich finde einen solchen nicht beim STM32.
Kerstin M. schrieb: > Mir ist klar dass es beim Atmel ein Interrupt Pin ist, > der dann einen entsprechenden Interrupt auslösen kann. > Nur ich finde einen solchen nicht beim STM32. Brille sauber?
Du kannst beim STM32 eigentlich jeden Pin als Interrupt Source einstellen. Siehe EXTI Beispiel in der Firmware Package zum STM32F4-Discovery. ... /** * This function handles External line 0 interrupt request. */ void EXTI0_IRQHandler(void) { if ((EXTI->IMR & EXTI_IMR_MR0) && (EXTI->PR & EXTI_IMR_MR0)) { // ... // Clear the EXTI line 0 pending bit EXTI->PR = EXTI_PR_PR0; } } ... // Enable SYSCFG clock RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); // Connect EXTI Line0 to PB0 pin */ SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOB, EXTI_PinSource0); // Configure EXTI Line0 EXTI_InitTypeDef touchExti; touchExti.EXTI_Line = EXTI_Line0; touchExti.EXTI_Mode = EXTI_Mode_Interrupt; touchExti.EXTI_Trigger = EXTI_Trigger_Falling; touchExti.EXTI_LineCmd = ENABLE; EXTI_Init(&touchExti); // Enable and set EXTI Line0 Interrupt to the lowest priority NVIC_InitTypeDef touchInt; touchInt.NVIC_IRQChannel = EXTI0_IRQn; touchInt.NVIC_IRQChannelPreemptionPriority = 0x01; touchInt.NVIC_IRQChannelSubPriority = 0x01; touchInt.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&touchInt);
Hallo habes nun mal probiert nur er break nicht in die Methode rein.
1 | void InitEXTI(void) |
2 | {
|
3 | EXTI_InitTypeDef EXTI_InitStructure; |
4 | NVIC_InitTypeDef NVIC_InitStructure; |
5 | |
6 | EXTI_StructInit(&EXTI_InitStructure); |
7 | |
8 | /* Connect Button EXTI Line to PB7 */
|
9 | GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource7); |
10 | |
11 | /* Configure Button EXTI line */
|
12 | EXTI_InitStructure.EXTI_Line = EXTI_Line0; |
13 | EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; |
14 | |
15 | EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; |
16 | |
17 | EXTI_InitStructure.EXTI_LineCmd = ENABLE; |
18 | EXTI_Init(&EXTI_InitStructure); |
19 | |
20 | /* Enable and set Button EXTI Interrupt to the lowest priority */
|
21 | NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; |
22 | NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0A; |
23 | NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0A; |
24 | NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; |
25 | |
26 | NVIC_Init(&NVIC_InitStructure); |
27 | }
|
Die Portconfig.
1 | RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | |
2 | RCC_APB2Periph_AFIO | RCC_APB2Periph_ADC1, |
3 | ENABLE); |
4 | |
5 | /* Configure PB7 pin as input */
|
6 | GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; |
7 | GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; |
8 | GPIO_Init(GPIOB, &GPIO_InitStructure); |
was bedeutet das floating?
1 | void EXTI0_IRQHandler(void) |
2 | {
|
3 | unsigned char test; |
4 | |
5 | test= 6; |
6 | };
|
weis jemand warum? lg Kerstin
Die Zeile EXTI_GenerateSWInterrupt(EXTI_Line0); löst einen Breakpoint aus, aber ein externes Signal nicht?
Hi, zunächst erstmal ein gut gemeinter Rat, du solltest nicht die ST-Besipiele einfach kopieren ohne ins Datenblatt zu schauen warum und wieso das so gemacht wurde. Danach schau dir mal die Zeilen unten an, die bei dir geändert habe (natürlich ohne Gewähr).
1 | EXTI_InitStructure.EXTI_Line = EXTI_Line7 |
2 | NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn; |
3 | GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //weil trigger_falling |
4 | |
5 | void EXTI9_5_IRQHandler(void) |
6 | {
|
7 | EXTI_ClearFlag(EXTI_Line7); |
8 | EXTI_ClearITPendingBit(EXTI_Line7); |
9 | |
10 | unsigned char test; |
11 | test= 6; |
12 | }
|
Natürlich musste jetzt in der IRG noch abfangen, ob wirklich dein GPIOB_7 den Interrupt ausgelöst hat. Dafür schauste in die EXTICR Register von AFIO. Aber das probier erstmal selbst, denn selber machen übt. Gruß und 55
Hätte dazu auch mal 'ne Frage, da ich dazu keine Beispiele gefunden habe. Kann ich auch mehrere Pins auf eine EXTI Line legen , z.B. so:
1 | SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOB, EXTI_PinSource0 | EXTI_PinSource1 | EXTI_PinSource2); |
Konkret möchte ich mit 3 Hallsensoren eines BLDC Motors den gleichen Interrupt auslösen .
Hab mir meine Frage selbst beantwortet, nein es geht nicht, da beim STM32 die Verdrahtung von Pins zu den EXTI Lines fest verschaltet ist. Bit 0 eines Ports ist mit EXTI0 verbunden, Bit1 mit EXTI1 usw. Das eingebaute Hallsensor Fietscha des STM32 kann ich nicht benutzen, da mein Motor ganz anders angesteuert wird, also keine simple Block Kommutation. In meinen EXTI0 bis EXTI2 Handlern rufe ich nun einfach einen gemeinsamen IRQ Handler auf.
1 | void EXTI0_IRQHandler(void) |
2 | {
|
3 | if(EXTI_GetITStatus(HALL1_EXTI_LINE) != RESET) |
4 | {
|
5 | HallIRQ(); |
6 | /* Clear the EXTI line pending bit */
|
7 | EXTI_ClearITPendingBit(HALL1_EXTI_LINE); |
8 | }
|
9 | }
|
Es gäbe auch noch die EXTI9_5 und EXTI15_10 Interrupts, die mehrere Leitungen zusammenfassen. mfg
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.