📄 main.c
字号:
// 冬眠模块RTC唤醒示例,UART输出日历
#include <hw_types.h>
#include <hw_memmap.h>
#include <hw_sysctl.h>
#include <hw_gpio.h>
#include <hw_uart.h>
#include <hw_hibernate.h>
#include <sysctl.h>
#include <gpio.h>
#include <uart.h>
#include <hibernate.h>
#include <stdio.h>
/* 将较长的标识符定义成较短的形式 */
#define SysCtlPeriEnable SysCtlPeripheralEnable
#define SysCtlPeriDisable SysCtlPeripheralDisable
#define GPIOPinTypeIn GPIOPinTypeGPIOInput
#define GPIOPinTypeOut GPIOPinTypeGPIOOutput
#define HibIsActive HibernateIsActive
#define HibEnable() HibernateEnableExpClk(SysCtlClockGet())
#define HibClockSelect HibernateClockSelect
#define HibWakeSet HibernateWakeSet
#define HibRequest HibernateRequest
#define HibRTCSet HibernateRTCSet
#define HibRTCGet HibernateRTCGet
#define HibRTCMatch0Set HibernateRTCMatch0Set
#define HibRTCEnable HibernateRTCEnable
#define HibIntClear HibernateIntClear
/* 定义按键 */
#define KEY_PORT SYSCTL_PERIPH_GPIOB
#define KEY_PIN GPIO_PORTB_BASE , GPIO_PIN_5
#define keyGet() GPIOPinRead(KEY_PIN)
/* 定义加载RTC初值的按键 */
#define KEY_LOAD_PORT SYSCTL_PERIPH_GPIOE
#define KEY_LOAD_PIN GPIO_PORTE_BASE , GPIO_PIN_3
#define keyloadGet() GPIOPinRead(KEY_LOAD_PIN)
/* 定义LED */
#define LED_PORT SYSCTL_PERIPH_GPIOC
#define LED_PIN GPIO_PORTC_BASE , GPIO_PIN_5
#define ledOn() GPIOPinWrite(LED_PIN , (0 << 5))
#define ledOff() GPIOPinWrite(LED_PIN , (1 << 5))
#define ledToggle() GPIOPinWrite(LED_PIN , ~GPIOPinRead(LED_PIN))
/* 防止JTAG失效 */
void jtagWait(void)
{
SysCtlPeriEnable(KEY_PORT); /* 使能KEY所在的GPIO端口 */
GPIOPinTypeIn(KEY_PIN); /* 设置KEY所在管脚为输入 */
if ( keyGet() == 0x00 ) { /* 如果复位时按下KEY,则进入 */
for (;;); /* 死循环,以等待JTAG连接 */
}
SysCtlPeriDisable(KEY_PORT); /* 禁止KEY所在的GPIO端口 */
}
/* 延时 */
void timeDelay(unsigned long ulVal)
{
do {
} while ( --ulVal != 0 );
}
/* UART0初始化 */
void uart0Init(void)
{
SysCtlPeriEnable(SYSCTL_PERIPH_GPIOA); /* 使能UART0所在的GPIOA端口 */
SysCtlPeriEnable(SYSCTL_PERIPH_UART0); /* 使能UART0模块 */
GPIOPinTypeUART(GPIO_PORTA_BASE , /* 配置PA0和PA1为UART功能 */
GPIO_PIN_0 | GPIO_PIN_1);
UARTConfigSet(UART0_BASE ,
9600 , /* 波特率:9600 */
UART_CONFIG_WLEN_8 | /* 数据位:8 */
UART_CONFIG_STOP_ONE | /* 停止位:1 */
UART_CONFIG_PAR_NONE); /* 校验位:无 */
UARTEnable(UART0_BASE); /* 使能UART0端口 */
}
/* 发送1个字符 */
#define uart0PutC(x) UARTCharPut(UART0_BASE , x)
/* 发送字符串 */
void uart0PutS(const char *pStr)
{
char c;
for (;;)
{
c = *(pStr++);
if (c == '\0') break;
uart0PutC(c);
}
}
/* 计算并显示时间 */
void timeDisplay(unsigned long ulVal)
{
char cBuf[16];
uart0PutS("\r\n");
if ( (ulVal / 3600) < 10 ) { /* 计算并显示小时 */
uart0PutC ('0');
}
sprintf(cBuf , "%ld:" , ulVal / 3600);
ulVal %= 3600;
uart0PutS(cBuf);
if ( (ulVal / 60) < 10 ) { /* 计算并显示分钟 */
uart0PutC('0');
}
sprintf(cBuf , "%ld:" , ulVal / 60);
ulVal %= 60;
uart0PutS(cBuf);
if ( ulVal < 10 ) { /* 显示秒钟 */
uart0PutC('0');
}
sprintf(cBuf , "%ld" , ulVal);
uart0PutS(cBuf);
uart0PutS("\r\n");
}
int main(void)
{
jtagWait(); /* 防止JTAG失效,重要! */
SysCtlLDOSet(SYSCTL_LDO_2_50V); /* 设置LDO输出电压 */
SysCtlClockSet(SYSCTL_USE_OSC | /* 系统时钟设置,采用主振荡器 */
SYSCTL_OSC_MAIN |
SYSCTL_XTAL_8MHZ |
SYSCTL_SYSDIV_1);
timeDelay(50 * (8000000UL / 4000)); /* 8MHz晶振,延迟约50ms */
uart0Init(); /* UART初始化 */
SysCtlPeriEnable(SYSCTL_PERIPH_HIBERNATE); /* 使能冬眠模块 */
HibEnable(); /* 使能冬眠 */
HibClockSelect(HIBERNATE_CLOCK_SEL_DIV128); /* 选择4.1943MHz晶体/128 */
timeDelay(25 * (8000000UL / 4000)); /* 8MHz晶振,延迟约25ms */
HibWakeSet(HIBERNATE_WAKE_RTC); /* 进入冬眠后采用RTC唤醒 */
SysCtlPeriEnable(KEY_LOAD_PORT); /* 使能按键所在的GPIO端口 */
GPIOPinTypeIn(KEY_LOAD_PIN); /* 设置按键所在管脚为输入 */
if ( keyloadGet() == 0x00 ) { /* 如果KEY_LOAD被按下,则 */
HibRTCSet(35920UL); /* 设置RTC初值:09:58:40 */
}
SysCtlPeriDisable(KEY_LOAD_PORT); /* 禁止按键所在的GPIO端口 */
HibRTCMatch0Set(5 + HibRTCGet()); /* 设置RTC匹配0的值 */
HibRTCEnable(); /* 使能冬眠RTC */
timeDisplay(HibRTCGet()); /* 显示RTC时间 */
timeDelay(50 * (8000000UL / 4000)); /* 8MHz晶振,延迟约50ms */
HibRequest(); /* 请求进入冬眠状态 */
for (;;) {
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -