Hallo zusammen
Ich bin was das Programmieren angeht noch Neuling. Derzeit versuche ich
gerade so zu programmieren, dass ich auch genau verstanden habe, wie
welches Bit gesetzt werden muss, ohne die fertigen Funktionen von ST zu
verwenden.
Das ging soweit gut, aber wenn ich jetzt zB einen externen Interrupt
über einen Pin definieren will wird es schon kompliziert.
Zum Beispiel habe ich Folgendes habe ich in diesem Link gefunden:
https://stm32f4-discovery.net/2014/08/stm32f4-external-interrupts-tutorial/
1 | /* Configure pins to be interrupts */
|
2 | void Configure_PD0(void) {
|
3 | /* Set variables used */
|
4 | GPIO_InitTypeDef GPIO_InitStruct;
|
5 | EXTI_InitTypeDef EXTI_InitStruct;
|
6 | NVIC_InitTypeDef NVIC_InitStruct;
|
7 |
|
8 | /* Enable clock for GPIOD */
|
9 | RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
|
10 | /* Enable clock for SYSCFG */
|
11 | RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
|
12 |
|
13 | /* Set pin as input */
|
14 | GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN;
|
15 | GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
|
16 | GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
|
17 | GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;
|
18 | GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz;
|
19 | GPIO_Init(GPIOD, &GPIO_InitStruct);
|
20 |
|
21 | /* Tell system that you will use PD0 for EXTI_Line0 */
|
22 | SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOD, EXTI_PinSource0);
|
23 |
|
24 | /* PD0 is connected to EXTI_Line0 */
|
25 | EXTI_InitStruct.EXTI_Line = EXTI_Line0;
|
26 | /* Enable interrupt */
|
27 | EXTI_InitStruct.EXTI_LineCmd = ENABLE;
|
28 | /* Interrupt mode */
|
29 | EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
|
30 | /* Triggers on rising and falling edge */
|
31 | EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising_Falling;
|
32 | /* Add to EXTI */
|
33 | EXTI_Init(&EXTI_InitStruct);
|
34 |
|
35 | /* Add IRQ vector to NVIC */
|
36 | /* PD0 is connected to EXTI_Line0, which has EXTI0_IRQn vector */
|
37 | NVIC_InitStruct.NVIC_IRQChannel = EXTI0_IRQn;
|
38 | /* Set priority */
|
39 | NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0x00;
|
40 | /* Set sub priority */
|
41 | NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0x00;
|
42 | /* Enable interrupt */
|
43 | NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
|
44 | /* Add to NVIC */
|
45 | NVIC_Init(&NVIC_InitStruct);
|
46 | }
|
Ich frage mich wie die Leute immer wissen, wie man die Interrupts etc.
implementiert. Ich würde zB nie allein mittels des Reference Manuals
drauf kommen, welche Interrupt Handler es gibt: die stehen ja nur in der
startupxxx.s datei und warum ich den NVIC benötige bzw. wie ich auf
diesen komme.
Neben der Tatsache, dass es bei meinem STM32L4 diese NVIC_InitStructs
und den EXTI_InitStruct nicht gibt, [b]würde ich gerne erfahren, wie ich
grundsätzlich als Anfänger beim Programmieren vorgehen soll und wie ich
das womöglich ohne den fertigen Funktionen von ST bewerkstelligen kann.
[b].
Ich wäre echt froh, wenn ich das erfahren könnte, da ich manchmal
überhaupt keinen Überblick habe.
Vielen Dank für eure Hilfe