Hello,Mr Cb1
first thing,Thank you very much.your encouragement really inspired me greatly
Mr Cb1,what if my english become so native like you in future,so i can understand your careful suggestions thoroughly , hhh.
the day after tomorrow ,the contest will be held,and i can only use tm4c or C2000 now(just some basic functions),really anxious now.
I made mistakes between PF0 and PF4,so i need to unlock PF0 tomorrow (it's so late now(24:00))
Dear Mr Cb1,I have another question about hibernate, Could you help me out, my board always get tripped in _HibernateWriteComplete() in HibernateEnableExpClk(uint32_t ui32HibClk) ,and it cannot awake by RTC Counter,i can only use ROM_SysCtlReset() to get it into reset. below is code.
And thank all my other friends helpped me.
/* * hibernateCBC.c * *通过按键进入休眠,再次按键跳出休眠,或者5秒后自动走出休眠 * Created on: 2019年8月4日 * Author: Administrator */ #include <stdint.h> #include <stdbool.h> #include <time.h> #include "inc/hw_memmap.h" #include "inc/hw_ints.h" #include "driverlib/debug.h" #include "driverlib/fpu.h" #include "driverlib/gpio.h" #include "driverlib/hibernate.h" #include "driverlib/sysctl.h" #include "driverlib/systick.h" #include "driverlib/rom.h" #include "driverlib/uart.h" #include "utils/ustdlib.h" #include "drivers/buttons.h" #include "inc/hw_hibernate.h" #include "driverlib/pin_map.h" #include "driverlib/timer.h" #include "driverlib/interrupt.h" #include "utils/uartstdio.h" //void HibernateHandler(void); void Timer0A_Init(void); void Timer0A_ISR(void); static volatile bool bSelectPressed = 0; #ifdef DEBUG void __error__(char *pcFilename, uint32_t ui32Line) { } #endif void ConfigureUART(void) { // // Enable the GPIO Peripheral used by the UART. // ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); // // Enable UART0 // ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0); // // Configure GPIO Pins for UART mode. // /*ROM_GPIOPinConfigure(GPIO_PA0_U0RX); ROM_GPIOPinConfigure(GPIO_PA1_U0TX); ROM_GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1);*/ // // Use the internal 16MHz oscillator as the UART clock source. // UARTClockSourceSet(UART0_BASE, UART_CLOCK_PIOSC); // // Initialize the UART for console I/O. // UARTStdioConfig(0, 115200, 16000000); } int main(void) { uint32_t ui32Status = 0; uint32_t ui32HibernateCount = 0; ROM_FPULazyStackingEnable(); ROM_SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHZ); ConfigureUART(); ButtonsInit(); Timer0A_Init(); ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_HIBERNATE); while(!ROM_SysCtlPeripheralReady(SYSCTL_PERIPH_HIBERNATE)) ; SysCtlDelay(SysCtlClockGet()/3); //延时1秒使能振荡器 HibernateEnableExpClk(SysCtlClockGet()); HibernateClockConfig(HIBERNATE_OSC_LOWDRIVE); if(HibernateIsActive()) //休眠模式的时钟是否使能 { ui32Status = HibernateIntStatus(0); //清除中断状态,即便暂时没有使能中断 HibernateIntClear(ui32Status); if(ui32Status & HIBERNATE_INT_PIN_WAKE) { UARTprintf("button awake\n"); } else if(ui32Status & HIBERNATE_INT_RTC_MATCH_0) { UARTprintf("timeout awake\n"); } else { UARTprintf("Reset awake\n"); } if(ui32Status & (HIBERNATE_INT_PIN_WAKE | HIBERNATE_INT_RTC_MATCH_0)) { HibernateDataGet(&ui32HibernateCount, 1); } } /*if(!(ui32Status & (HIBERNATE_INT_PIN_WAKE | HIBERNATE_INT_RTC_MATCH_0))) { HibernateClockConfig(HIBERNATE_OSC_LOWDRIVE); UARTprintf("Reset awake\n"); }*/ bSelectPressed = 0; while(!bSelectPressed) { SysCtlDelay(SysCtlClockGet()/30); //wait 100ms } UARTprintf("Release the Button\n"); while(bSelectPressed) { } //ui32HibernateCount = (ui32HibernateCount > 10000) ? 0 : ui32HibernateCount; ui32HibernateCount++; HibernateDataSet(&ui32HibernateCount, 1); UARTprintf("Intcnt:%d",ui32HibernateCount); HibernateRTCEnable(); HibernateRTCSet(0); HibernateRTCMatchSet(0, 5); HibernateIntEnable(HIBERNATE_INT_PIN_WAKE |HIBERNATE_INT_RTC_MATCH_0); HibernateIntClear(HIBERNATE_INT_PIN_WAKE | HIBERNATE_INT_RTC_MATCH_0); //HibernateIntRegister(HibernateHandler); HibernateWakeSet(HIBERNATE_WAKE_PIN | HIBERNATE_WAKE_RTC); /*IntPrioritySet(HIBERNATE_INT_PIN_WAKE,0x20); IntPrioritySet(HIBERNATE_INT_RTC_MATCH_0,0x40); IntPrioritySet(TIMER_TIMA_TIMEOUT,0x60); */ UARTprintf("Select to Hib"); UARTprintf("Wake in 5 s,"); UARTprintf("or press Select"); UARTprintf("for immed. wake.\n"); HibernateRequest(); SysCtlDelay(SysCtlClockGet()/3); bSelectPressed = 0; while(!bSelectPressed) { } ROM_SysCtlReset(); //SysCtlReset() 软件复位 while(1) { } } /*void HibernateHandler(void) { uint32_t ui32Status; ui32Status = HibernateIntStatus(1); HibernateIntClear(ui32Status); }*/ void Timer0A_Init(void) { uint32_t ui32Period,SysPeriod,TimerFrequency; TimerFrequency = 100; SysPeriod = SysCtlClockGet(); SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0); TimerConfigure(TIMER0_BASE, TIMER_CFG_PERIODIC); //设置时钟的类型为周期型的 ui32Period =SysPeriod/ TimerFrequency; //配置时钟的频率,10ms计数一次 TimerLoadSet(TIMER0_BASE, TIMER_A, ui32Period - 1); IntMasterEnable(); //开主中断 IntEnable(INT_TIMER0A); //使能TIMER0A中断 TimerIntEnable(TIMER0_BASE, TIMER_TIMA_TIMEOUT); TimerEnable(TIMER0_BASE, TIMER_A); } void Timer0A_ISR(void) { TimerIntClear(TIMER0_BASE, TIMER_TIMA_TIMEOUT); uint8_t ui8Data, ui8Delta; // // Get buttons status using button debouncer driver // ui8Data = ButtonsPoll(&ui8Delta, 0); // // See if the select button was just pressed. // if(BUTTON_PRESSED(SELECT_BUTTON, ui8Data, ui8Delta)) { // // Set a flag to indicate that the select button was just pressed. // bSelectPressed = 1; } // // Else, see if the select button was just released. // if(BUTTON_RELEASED(SELECT_BUTTON, ui8Data, ui8Delta)) { // // Clear the button pressed flag. // bSelectPressed = 0; } }