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;
}
}