This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
Tool/software: TI C/C++ Compiler
Hi sir,
I am new to Embedded programming.so if there is any error in my code please let me know.
Problem:
I am generating delay in LED blink program using Systick timer interrupt.The program is given below and I am attaching my c file also.
#include "stdio.h" #include "driverlib/sysctl.h" #include "driverlib/gpio.h" #include "hw_memmap.h" #include "driverlib/pin_map.h" #include "inc/hw_types.h" #include "driverlib/interrupt.h" #include "driverlib/systick.h" void delay(int a); volatile uint32_t count=0;//Counter to count the number of interrupts that have been called int main() { SysCtlClockSet(SYSCTL_SYSDIV_2_5|SYSCTL_USE_OSC |SYSCTL_XTAL_8MHZ|SYSCTL_OSC_MAIN); //seting system clock as 50Mhz SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); //Enabling port A peripheral pin while(!SysCtlPeripheralReady(SYSCTL_PERIPH_GPIOA)); //delay(3000); //GPIODirModeSet(GPIO_PORTA_BASE, GPIO_PIN_7,GPIO_DIR_MODE_OUT);// make portA as output //GPIODirModeSet(GPIO_PORTF_BASE, GPIO_PIN_2,GPIO_DIR_MODE_IN); //make portF pin2 as input //GPIODirModeGet(GPIO_PORTF_BASE, GPIO_PIN_1); //GPIOPinConfigure(GPIO_PIN_1); //GPIOIntTypeSet(GPIO_PORTA_BASE,GPIO_PIN_7,GPIO_HIGH_LEVEL);//set the interrupt type for a specified pin //GPIOIntRegister(GPIO_PORTA_BASE,PortAIntHandler);//PortAIntHandler function is called when an interrupt is detected from the selected GPIO port //GPIOIntEnable(GPIO_PORTA_BASE, GPIO_INT_PIN_7);//Enable the interrupt for a specified pin GPIOPinTypeGPIOOutput(GPIO_PORTA_BASE, GPIO_PIN_7);//Set portApin7 as output count=0; SysTickPeriodSet(SysCtlClockGet());// Set up the period for the SysTick timer. The SysTick timer period will // be equal to the system clock, resulting in a period of 1 second. IntMasterEnable();// Enable interrupts to the processor. SysTickIntEnable(); // Enable the SysTick Interrupt. // // Enable interrupts to the processor. // SysTickEnable();// Enable SysTick. while(1) { //uint32_t pinVal=0; // variable to hold the pinRead //pinVal= GPIOPinRead(GPIO_PORTF_BASE,GPIO_PIN_2); // read F4 //if( (pinVal & GPIO_PIN_2)==0){ // AND to strip out anything but the value read from F4 //GPIOPinWrite(GPIO_PORTF_BASE,GPIO_PIN_1, 0);} // turn on one LED //GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1,1); //make portA pin7 as high //delay(); //else{} // GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_7, GPIO_PIN_7); //make portA pin7 as high //GPIO_PORTF_DATA1_bit = 1; // delay(3000); // GPIO_PORTF_DATA1_bit = 0; // GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_7, 0); //make portA pin7 as low // delay(3000); } } void delay(int a) { int i,j; for (i=0;i<=a;i++) for (j=0;j<=a;j++) ; } // // The interrupt handler for the for Systick interrupt. // void SysTick_Handler(void){ // // Update the Systick interrupt counter. // count++; // // Check to see if systick interrupt count changed, and if so then // write high to the port pin. // if(count == 1){ GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_7,GPIO_PIN_7); } else if(count == 2){ GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_7,0); count=0;} }
#include "stdio.h"
#include "driverlib/sysctl.h"
#include "driverlib/gpio.h"
#include "hw_memmap.h"
#include "driverlib/pin_map.h"
#include "inc/hw_types.h"
#include "driverlib/interrupt.h"
#include "driverlib/systick.h"
void delay(int a);
volatile uint32_t count=0;//Counter to count the number of interrupts that have been called
int main()
{
SysCtlClockSet(SYSCTL_SYSDIV_2_5|SYSCTL_USE_OSC |SYSCTL_XTAL_8MHZ|SYSCTL_OSC_MAIN); //seting system clock as 50Mhz
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); //Enabling port A peripheral pin
while(!SysCtlPeripheralReady(SYSCTL_PERIPH_GPIOA));
GPIOPinTypeGPIOOutput(GPIO_PORTA_BASE, GPIO_PIN_7);//Set portApin7 as output
count=0;
SysTickPeriodSet(SysCtlClockGet());// Set up the period for the SysTick timer. The SysTick timer period will
// be equal to the system clock, resulting in a period of 1 second.
IntMasterEnable();// Enable interrupts to the processor.
SysTickIntEnable();
SysTickEnable();// Enable SysTick.
while(1)
{
}}
void SysTick_Handler(void){
//
// Update the Systick interrupt counter.
//
count++;
//
// Check to see if systick interrupt count changed, and if so then
// write high to the port pin.
//
if(count == 1){
GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_7,GPIO_PIN_7);
}
else if(count == 2){
GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_7,0);
count=0;}
}
The above code is working, but If I am inserting the highlighted section of above program inside the while loop(i.e, while(1) in main) then the program is not taking the interrupt handler function, it will run inside while loop only. I am incrementing the count inside interrupt handler function because of that only that I am not able to blink the led.
I am not getting why the interrupt handler function is not executing.Please help me to solve the issue.Feel free to contact me if you are having any doubt in my code.
Thank you,
Alphy Ouseph
Yes sir, I placed the break point and checked.After enabling the interrupt, the program is directly going to While(1) condition instead of SysTick_Handler function.Inside the interrupt handler function I am incrementing the counter and based on the counter value I am blinking my led.The interrupt handler function is not executing so the counter value is not changing and led also not blinking.I am not getting why it is not going to interrupt handler function.
Thank you,
Alphy
Hi,
Below is a partial snippet of the startup_ccs.c file. did you add the SysTick_Handler vector to the vector table?
static void NmiSR(void); static void FaultISR(void); static void IntDefaultHandler(void); static void SysTick_Handler(void); //***************************************************************************** // // External declaration for the reset handler that is to be called when the // processor is started // //***************************************************************************** extern void _c_int00(void); //***************************************************************************** // // Linker variable that marks the top of the stack. // //***************************************************************************** extern uint32_t __STACK_TOP; //***************************************************************************** // // The vector table. Note that the proper constructs must be placed on this to // ensure that it ends up at physical address 0x0000.0000 or at the start of // the program if located at a start address other than 0. // //***************************************************************************** #pragma DATA_SECTION(g_pfnVectors, ".intvecs") void (* const g_pfnVectors[])(void) = { (void (*)(void))((uint32_t)&__STACK_TOP), // The initial stack pointer ResetISR, // The reset handler NmiSR, // The NMI handler FaultISR, // The hard fault handler IntDefaultHandler, // The MPU fault handler IntDefaultHandler, // The bus fault handler IntDefaultHandler, // The usage fault handler 0, // Reserved 0, // Reserved 0, // Reserved 0, // Reserved IntDefaultHandler, // SVCall handler IntDefaultHandler, // Debug monitor handler 0, // Reserved IntDefaultHandler, // The PendSV handler SysTick_Handler, // The SysTick handler IntDefaultHandler, // GPIO Port A IntDefaultHandler, // GPIO Port B IntDefaultHandler, // GPIO Port C IntDefaultHandler, // GPIO Port D IntDefaultHandler, // GPIO Port E
Hi sir,
Sorry sir, I am new to embedded C programming, so I dont know how to check the SysTick_Handler vector is added to the vector table or not. If it is not added, please let me know how I can add it to the vector table.
Thank you.
When you said you were in while(1). Which while(1) were you in? If you were in the while(1) inside the IntDefaultHandler ISR then it means you did not declare a proper vector for your SysTick_Handler vector into the vector table. Replace your existing startup_ccs.c with the below file. Or you can just see the difference between yours and the below and modify accordingly. After you modify and if you are still not entering the SysTick_Handler with breakpoint inserted inside then it is a different problem.
//***************************************************************************** // // startup_ccs.c - Startup code for use with TI's Code Composer Studio. // // Copyright (c) 2012-2017 Texas Instruments Incorporated. All rights reserved. // Software License Agreement // // Texas Instruments (TI) is supplying this software for use solely and // exclusively on TI's microcontroller products. The software is owned by // TI and/or its suppliers, and is protected under applicable copyright // laws. You may not combine this software with "viral" open-source // software in order to form a larger program. // // THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. // NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT // NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY // CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL // DAMAGES, FOR ANY REASON WHATSOEVER. // // This is part of revision 2.1.4.178 of the EK-TM4C123GXL Firmware Package. // //***************************************************************************** #include <stdint.h> #include "inc/hw_nvic.h" #include "inc/hw_types.h" //***************************************************************************** // // Forward declaration of the default fault handlers. // //***************************************************************************** void ResetISR(void); static void NmiSR(void); static void FaultISR(void); static void IntDefaultHandler(void); extern void SysTick_Handler(void); //***************************************************************************** // // External declaration for the reset handler that is to be called when the // processor is started // //***************************************************************************** extern void _c_int00(void); //***************************************************************************** // // Linker variable that marks the top of the stack. // //***************************************************************************** extern uint32_t __STACK_TOP; //***************************************************************************** // // The vector table. Note that the proper constructs must be placed on this to // ensure that it ends up at physical address 0x0000.0000 or at the start of // the program if located at a start address other than 0. // //***************************************************************************** #pragma DATA_SECTION(g_pfnVectors, ".intvecs") void (* const g_pfnVectors[])(void) = { (void (*)(void))((uint32_t)&__STACK_TOP), // The initial stack pointer ResetISR, // The reset handler NmiSR, // The NMI handler FaultISR, // The hard fault handler IntDefaultHandler, // The MPU fault handler IntDefaultHandler, // The bus fault handler IntDefaultHandler, // The usage fault handler 0, // Reserved 0, // Reserved 0, // Reserved 0, // Reserved IntDefaultHandler, // SVCall handler IntDefaultHandler, // Debug monitor handler 0, // Reserved IntDefaultHandler, // The PendSV handler SysTick_Handler, // The SysTick handler IntDefaultHandler, // GPIO Port A IntDefaultHandler, // GPIO Port B IntDefaultHandler, // GPIO Port C IntDefaultHandler, // GPIO Port D IntDefaultHandler, // GPIO Port E IntDefaultHandler, // UART0 Rx and Tx IntDefaultHandler, // UART1 Rx and Tx IntDefaultHandler, // SSI0 Rx and Tx IntDefaultHandler, // I2C0 Master and Slave IntDefaultHandler, // PWM Fault IntDefaultHandler, // PWM Generator 0 IntDefaultHandler, // PWM Generator 1 IntDefaultHandler, // PWM Generator 2 IntDefaultHandler, // Quadrature Encoder 0 IntDefaultHandler, // ADC Sequence 0 IntDefaultHandler, // ADC Sequence 1 IntDefaultHandler, // ADC Sequence 2 IntDefaultHandler, // ADC Sequence 3 IntDefaultHandler, // Watchdog timer IntDefaultHandler, // Timer 0 subtimer A IntDefaultHandler, // Timer 0 subtimer B IntDefaultHandler, // Timer 1 subtimer A IntDefaultHandler, // Timer 1 subtimer B IntDefaultHandler, // Timer 2 subtimer A IntDefaultHandler, // Timer 2 subtimer B IntDefaultHandler, // Analog Comparator 0 IntDefaultHandler, // Analog Comparator 1 IntDefaultHandler, // Analog Comparator 2 IntDefaultHandler, // System Control (PLL, OSC, BO) IntDefaultHandler, // FLASH Control IntDefaultHandler, // GPIO Port F IntDefaultHandler, // GPIO Port G IntDefaultHandler, // GPIO Port H IntDefaultHandler, // UART2 Rx and Tx IntDefaultHandler, // SSI1 Rx and Tx IntDefaultHandler, // Timer 3 subtimer A IntDefaultHandler, // Timer 3 subtimer B IntDefaultHandler, // I2C1 Master and Slave IntDefaultHandler, // Quadrature Encoder 1 IntDefaultHandler, // CAN0 IntDefaultHandler, // CAN1 0, // Reserved 0, // Reserved IntDefaultHandler, // Hibernate IntDefaultHandler, // USB0 IntDefaultHandler, // PWM Generator 3 IntDefaultHandler, // uDMA Software Transfer IntDefaultHandler, // uDMA Error IntDefaultHandler, // ADC1 Sequence 0 IntDefaultHandler, // ADC1 Sequence 1 IntDefaultHandler, // ADC1 Sequence 2 IntDefaultHandler, // ADC1 Sequence 3 0, // Reserved 0, // Reserved IntDefaultHandler, // GPIO Port J IntDefaultHandler, // GPIO Port K IntDefaultHandler, // GPIO Port L IntDefaultHandler, // SSI2 Rx and Tx IntDefaultHandler, // SSI3 Rx and Tx IntDefaultHandler, // UART3 Rx and Tx IntDefaultHandler, // UART4 Rx and Tx IntDefaultHandler, // UART5 Rx and Tx IntDefaultHandler, // UART6 Rx and Tx IntDefaultHandler, // UART7 Rx and Tx 0, // Reserved 0, // Reserved 0, // Reserved 0, // Reserved IntDefaultHandler, // I2C2 Master and Slave IntDefaultHandler, // I2C3 Master and Slave IntDefaultHandler, // Timer 4 subtimer A IntDefaultHandler, // Timer 4 subtimer B 0, // Reserved 0, // Reserved 0, // Reserved 0, // Reserved 0, // Reserved 0, // Reserved 0, // Reserved 0, // Reserved 0, // Reserved 0, // Reserved 0, // Reserved 0, // Reserved 0, // Reserved 0, // Reserved 0, // Reserved 0, // Reserved 0, // Reserved 0, // Reserved 0, // Reserved 0, // Reserved IntDefaultHandler, // Timer 5 subtimer A IntDefaultHandler, // Timer 5 subtimer B IntDefaultHandler, // Wide Timer 0 subtimer A IntDefaultHandler, // Wide Timer 0 subtimer B IntDefaultHandler, // Wide Timer 1 subtimer A IntDefaultHandler, // Wide Timer 1 subtimer B IntDefaultHandler, // Wide Timer 2 subtimer A IntDefaultHandler, // Wide Timer 2 subtimer B IntDefaultHandler, // Wide Timer 3 subtimer A IntDefaultHandler, // Wide Timer 3 subtimer B IntDefaultHandler, // Wide Timer 4 subtimer A IntDefaultHandler, // Wide Timer 4 subtimer B IntDefaultHandler, // Wide Timer 5 subtimer A IntDefaultHandler, // Wide Timer 5 subtimer B IntDefaultHandler, // FPU 0, // Reserved 0, // Reserved IntDefaultHandler, // I2C4 Master and Slave IntDefaultHandler, // I2C5 Master and Slave IntDefaultHandler, // GPIO Port M IntDefaultHandler, // GPIO Port N IntDefaultHandler, // Quadrature Encoder 2 0, // Reserved 0, // Reserved IntDefaultHandler, // GPIO Port P (Summary or P0) IntDefaultHandler, // GPIO Port P1 IntDefaultHandler, // GPIO Port P2 IntDefaultHandler, // GPIO Port P3 IntDefaultHandler, // GPIO Port P4 IntDefaultHandler, // GPIO Port P5 IntDefaultHandler, // GPIO Port P6 IntDefaultHandler, // GPIO Port P7 IntDefaultHandler, // GPIO Port Q (Summary or Q0) IntDefaultHandler, // GPIO Port Q1 IntDefaultHandler, // GPIO Port Q2 IntDefaultHandler, // GPIO Port Q3 IntDefaultHandler, // GPIO Port Q4 IntDefaultHandler, // GPIO Port Q5 IntDefaultHandler, // GPIO Port Q6 IntDefaultHandler, // GPIO Port Q7 IntDefaultHandler, // GPIO Port R IntDefaultHandler, // GPIO Port S IntDefaultHandler, // PWM 1 Generator 0 IntDefaultHandler, // PWM 1 Generator 1 IntDefaultHandler, // PWM 1 Generator 2 IntDefaultHandler, // PWM 1 Generator 3 IntDefaultHandler // PWM 1 Fault }; //***************************************************************************** // // This is the code that gets called when the processor first starts execution // following a reset event. Only the absolutely necessary set is performed, // after which the application supplied entry() routine is called. Any fancy // actions (such as making decisions based on the reset cause register, and // resetting the bits in that register) are left solely in the hands of the // application. // //***************************************************************************** void ResetISR(void) { // // Jump to the CCS C initialization routine. This will enable the // floating-point unit as well, so that does not need to be done here. // __asm(" .global _c_int00\n" " b.w _c_int00"); } //***************************************************************************** // // This is the code that gets called when the processor receives a NMI. This // simply enters an infinite loop, preserving the system state for examination // by a debugger. // //***************************************************************************** static void NmiSR(void) { // // Enter an infinite loop. // while(1) { } } //***************************************************************************** // // This is the code that gets called when the processor receives a fault // interrupt. This simply enters an infinite loop, preserving the system state // for examination by a debugger. // //***************************************************************************** static void FaultISR(void) { // // Enter an infinite loop. // while(1) { } } //***************************************************************************** // // This is the code that gets called when the processor receives an unexpected // interrupt. This simply enters an infinite loop, preserving the system state // for examination by a debugger. // //***************************************************************************** static void IntDefaultHandler(void) { // // Go into an infinite loop. // while(1) { } }
Hi sir,
Thank you for your support, that issue resolved by correcting my vector table.I learned more things from your reply messages.Thank you so much for your support.
Thank you,
Alphy ouseph