We are running a survey to help us improve the experience for all of our members. If you see the survey appear, please take the time to tell us about your experience if you can.
I am using the following code: // Timer3 IRQ: Executed each 10ms void T3TIMI_IRQHandler (void) __irq { GPIO_BitWrite(GPIO2, 15, ~GPIO_BitRead(GPIO2, 15)); TIM_FlagClear(TIM3, TIM_TO_IT); EIC->IPR = 1 << T3TIMI_IRQChannel; } And I receive the following error: Build target 'STR7 Eval Board RAM' assembling Startup.s... compiling Hello.c... compiling UART.c... compiling GPIO.c... linking... *** ERROR L104: MULTIPLE PUBLIC DEFINITIONS SYMBOL: GPIO_Config?T MODULE: C:\Keil\ARM\LIB\ST\STR71x.LIB (gpio) DEFINED: .\RAM\GPIO.obj (GPIO) *** ERROR L104: MULTIPLE PUBLIC DEFINITIONS SYMBOL: GPIO_BitWrite?T MODULE: C:\Keil\ARM\LIB\ST\STR71x.LIB (gpio) DEFINED: .\RAM\GPIO.obj (GPIO) *** ERROR L104: MULTIPLE PUBLIC DEFINITIONS SYMBOL: GPIO_ByteWrite?T MODULE: C:\Keil\ARM\LIB\ST\STR71x.LIB (gpio) DEFINED: .\RAM\GPIO.obj (GPIO) *** WARNING L23: UNRESOLVED EXTERNAL SYMBOLS Program Size: data=2074 const=0 code=242 Target not created If I put the: GPIO_BitWrite(GPIO2, 15, ~GPIO_BitRead(GPIO2, 15)); in the main function everything works just fine. If I put it in the ISR I get the above error. Why doesn't it work in an interrupt service routine? regards, Erik
My evalboard is: MCBSTR7 > STR710F2 microcontroller from ST microelectronics my code: HELLO.C: Hello World Example < // Timer3 IRQ: Executed each 10ms void T3TIMI_IRQHandler (void) __irq { GPIO_BitWrite(GPIO2, 15, ~GPIO_BitRead(GPIO2, 15)); TIM_FlagClear(TIM3, TIM_TO_IT); EIC->IPR = 1 << T3TIMI_IRQChannel; }> < // Timer 3 Configuration: Periodic Interrupts at aprox. 10ms TIM_Init (TIM3); // Initialization TIM_PrescalerConfig (TIM3, 256); // Prescaler TIM_ITConfig (TIM3, TIM_TO_IT, ENABLE); // Enable Overflow Interrupt TIM_CounterConfig (TIM3,TIM_START); // Start Timer // Configure and enable IRQ for Timer 3 EIC->IVR = (u32)T3TIMI_IRQHandler; EIC->SIR[T3TIMI_IRQChannel] = ((u16)T3TIMI_IRQHandler << 16); EIC_IRQChannelConfig(T3TIMI_IRQChannel, ENABLE); EIC_IRQChannelPriorityConfig(T3TIMI_IRQChannel, 1); > UART.c void UART_ByteSend(UART_TypeDef *UARTx, u8 *Data) { while (!(UARTx->SR & UART_TxEmpty)); // while the transmit shift register not empty UARTx->TxBUFR = *Data; } GPIO.c void GPIO_BitWrite(GPIO_TypeDef *GPIOx, u8 Port_Pin, u8 Port_Val) { if (Port_Val&0x01) GPIOx->PD |= 1<<Port_Pin; else GPIOx->PD &= ~(1<<Port_Pin); } Include path is : C:\Keil\ARM\INC\ST
I recommend that you directly access the peripherals (which is anyway more efficient than using the software wrappers provided by ST). Reinhard