Hallo, ich versuche grad an meinem STM32F3 (STM32F303VC) den USER-Button als Interrupt einzustellen. Es soll eine LED leuchten falls der Interrupt detektiert wird. Im Prinzip ein Simples Programm. Das Problem ist ich kann den Interrupt nicht auffangen das Programm Springt immer zum Default-Handler. (Default_Handler(void) in der Datei vectors_stm32f30x.c) Hier Der Code //------------------------------------------ #include<stm32f30x_conf.h> int main(void) { GPIO_InitTypeDef GPIO_InitStructure; SystemInit(); EXTI_InitTypeDef EXTI_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA | RCC_AHBPeriph_GPIOE, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); //lighting LED GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOE, &GPIO_InitStructure); GPIO_WriteBit(GPIOE, GPIO_Pin_0, Bit_SET); //button interrupt GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; GPIO_Init(GPIOA, &GPIO_InitStructure); SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource0); //Configure Button EXTI line EXTI_InitStructure.EXTI_Line = EXTI_Line0; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); //set priotity 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); while(1) { } } void EXTI0_IRQHandler(void){ EXTI_ClearITPendingBit(EXTI_Line0); if(GPIO_ReadOutputDataBit(GPIOE, GPIO_Pin_15)){ GPIO_WriteBit(GPIOE, GPIO_Pin_15, Bit_RESET); }else{ GPIO_WriteBit(GPIOE, GPIO_Pin_15, Bit_SET); } } //----SPRNGT nach INT hier REIN------- //Datei:vectors_stm32f30x.c void _attribute_ ((section(".after_vectors"))) Default_Handler(void) { #if defined(DEBUG) __DEBUG_BKPT(); #endif while (1) { } } //------------------------------------------ Ich hoffe jemand kann mir dabei weiterhelfen.
Shaker A. schrieb: > Hier Der Code... Oh nein. Erwarte lieber nicht, daß die Leute sich da drauf stürzen. Lerne lieber, wie man einen ordentlichen Startupcode in Assembler selber schreibt und wie man ohne die leigige ST-Lib zu Potte kommt. Dann hat sich dein Problem bereits in Luft aufgelöst. W.S.
Es scheint mir das die Benennung von der ISR nicht richtig ist. Damit endet das in hardfault handler. (ich gehe davon aus das das Problem beim drucken auf die User Button auftreht). Welche IDE verwendet du ?
W.S. schrieb: > Oh nein. > Erwarte lieber nicht, daß die Leute sich da drauf stürzen. Lerne lieber, > wie man einen ordentlichen Startupcode in Assembler selber schreibt Hier ist er ja nun wirklich nicht mehr im Startupcode! Und der Rest ist auch CMSIS. Kopfschüttel!
Versuchen sie mal die Handler in startup_stm32f30x.s zuruck zu finden ! Hier aus ein Beispiel von STM Lib :
1 | /******************************************************************************/
|
2 | /* STM32F30x Peripherals Interrupt Handlers */
|
3 | /* Add here the Interrupt Handler for the used peripheral(s) (PPP), for the */
|
4 | /* available peripheral interrupt handler's name please refer to the startup */
|
5 | /* file (startup_stm32f30x.s). */
|
6 | /******************************************************************************/
|
7 | /**
|
8 | * @brief This function handles External lines 5 to 9 interrupt request.
|
9 | * @param None
|
10 | * @retval None
|
11 | */
|
12 | void EXTI9_5_IRQHandler(void) |
13 | {
|
14 | if((EXTI_GetITStatus(EXTI_Line6) != RESET)) |
15 | {
|
16 | /* Toggle LD1 */
|
17 | STM_EVAL_LEDToggle(LED1); |
18 | |
19 | /* Clear the EXTI line 6 pending bit */
|
20 | EXTI_ClearITPendingBit(EXTI_Line6); |
21 | }
|
22 | else if((EXTI_GetITStatus(EXTI_Line5) != RESET)) |
23 | {
|
24 | /* Toggle LD3 */
|
25 | STM_EVAL_LEDToggle(LED3); |
26 | |
27 | /* Clear the EXTI line 5 pending bit */
|
28 | EXTI_ClearITPendingBit(EXTI_Line5); |
29 | }
|
30 | }
|
31 | |
32 | /**
|
33 | * @brief This function handles External lines 10 to 15 interrupt request.
|
34 | * @param None
|
35 | * @retval None
|
36 | */
|
37 | void EXTI15_10_IRQHandler(void) |
38 | {
|
39 | if(EXTI_GetITStatus(EXTI_Line13) != RESET) |
40 | {
|
41 | /* Toggle LD2 */
|
42 | STM_EVAL_LEDToggle(LED2); |
43 | |
44 | /* Clear the EXTI line 13 pending bit */
|
45 | EXTI_ClearITPendingBit(EXTI_Line13); |
46 | }
|
47 | }
|
Ich Benutze Eclipse(CDT) (+ Arm-Plugin + ST-Flash + OpenOCD) Ein Start-up Code hab ich nicht. Assembler wäre auch Neugebiet für mich. RP6conrad ich habe die zwei Interrupt-Handler eingefügt die du/Sie gepostet hast, die haben den Interrupt Leider aber auch nicht auffangen können.
Shaker A. schrieb: > Ein Start-up Code hab ich nicht. Doch, den hast Du sogar schon teilweise gepostet: Datei:vectors_stm32f30x.c Dort müssten IMO auch die restlichen Namen der Interrupt Handler stehen. Es kommt auf die korrekte Schreibweise an.
Es geht jetzt mein Interrupt Handler wird jetzt angenommen. Es musste vor dem Handler noch ein ,,extern "C"´´. Bsp:
1 | extern "C" void EXTI0_IRQHandler(void) |
2 | {
|
3 | /* Make sure that interrupt flag is set */
|
4 | if (EXTI_GetITStatus(EXTI_Line0) != RESET) { |
5 | /* Toggle LED on PE15 */
|
6 | if(GPIO_ReadOutputDataBit(GPIOE, GPIO_Pin_15)){ |
7 | GPIO_WriteBit(GPIOE, GPIO_Pin_15, Bit_RESET); |
8 | }else{ |
9 | GPIO_WriteBit(GPIOE, GPIO_Pin_15, Bit_SET); |
10 | }
|
11 | /* Clear interrupt flag */
|
12 | EXTI_ClearITPendingBit(EXTI_Line12); |
13 | }
|
14 | |
15 | }
|
Vielen Dank für Euer Engagment.
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.