1、利用SysTick定时器编写倒计时程序,如初始设置为2分30秒,每秒在屏幕上输出一次时间,倒计时为0后,红灯亮,停止屏幕输出,并关闭SysTick定时器的中断。
main.c:
#define GLOBLE_VAR
#include "includes.h" //包含总头文件
void systick_disable(void)
{
// 禁止SysTick中断和停止SysTick计时器
SysTick->CTRL &= ~(SysTick_CTRL_ENABLE_Msk | SysTick_CTRL_TICKINT_Msk);
}
int main(void)
{
//(1.1)声明main函数使用的局部变量
uint8_t mSec; //记当前秒的值
//(1.2)【不变】关总中断
DISABLE_INTERRUPTS;
wdog_stop();
//(1.3)给主函数使用的局部变量赋初值
//(1.4)给全局变量赋初值
//"时分秒"缓存初始化(00:00:00)
gTime[0] = 0; //时
gTime[1] = 2; //分
gTime[2] = 30; //秒
mSec = 0; //记住当前秒的值
//(1.5)用户外设模块初始化
gpio_init(LIGHT_RED,GPIO_OUTPUT,LIGHT_OFF); //初始化红灯
systick_init(10); //设置systick为10ms中断
//(1.6)使能模块中断
//(1.7)【不变】开总中断
ENABLE_INTERRUPTS;
printf("CA的嵌入式作业,倒计时2分30秒\n");
for(;;) //for(;;)(开头)
{
if (gTime[2] == mSec) continue;
mSec=gTime[2];
if(gTime[0]==0&&gTime[1]==0&&gTime[2]==0) //倒计时结束
{
gpio_set(LIGHT_RED,LIGHT_ON); //设置灯“亮”
printf("%d:%d:%d\n",gTime[0],gTime[1],gTime[2]);
systick_disable();
}
else
{
printf("%d:%d:%d\n",gTime[0],gTime[1],gTime[2]);
}
} //for(;;)结尾
}
isr.c:
#include "includes.h"
//isr.c使用的内部函数声明处
void SecAdd1(uint8_t *p);
void SecSub1(uint8_t *p);
void SysTick_Handler()
{
//printf("***\n");
static uint8_t SysTickCount = 0;
SysTickCount++; //Tick单元+1
wdog_feed(); //看门狗“喂狗”
if (SysTickCount >= 100)
{
SysTickCount = 0;
//SecAdd1(gTime);
SecSub1(gTime);
}
}
void SecAdd1(uint8_t *p)
{
*(p+2)+=1; //秒+1
if(*(p+2)>=60) //秒溢出
{
*(p+2)=0; //清秒
*(p+1)+=1; //分+1
if(*(p+1)>=60) //分溢出
{
*(p+1)=0; //清分
*p+=1; //时+1
if(*p>=24) //时溢出
{
*p=0; //清时
}
}
}
}
void SecSub1(uint8_t *p)
{
if (*(p+2) == 0) // 如果秒为0
{
*(p+2) = 59; // 设置秒为59
if (*(p+1) == 0) // 如果分为0
{
*(p+1) = 59; // 设置分为59
if (*p == 0) // 如果时为0
{
*p = 23; // 设置时为23
}
else
{
*p -= 1; // 时减1
}
}
else
{
*(p+1) -= 1; // 分减1
}
}
else
{
*(p+2) -= 1; // 秒减1
}
}
2、利用RTC显示日期(年月日、时分秒),每秒更新。并设置某个时间的闹钟。闹钟时间到时,屏幕上显示有你的姓名的文字,并点亮绿灯。
main.c:
#define GLOBLE_VAR
#include "includes.h" //包含总头文件
int main(void)
{
//(1.1)声明main函数使用的局部变量
uint32_t mMainLoopCount; //主循环次数变量
//(1.2)【不变】关总中断
DISABLE_INTERRUPTS;
//(1.3)给主函数使用的局部变量赋初值
mMainLoopCount=0; //主循环次数变量
//(1.4)给全局变量赋初值
g_RTC_Flag=0;
//(1.5)用户外设模块初始化
uart_init(UART_User,115200);
RTC_Init(); //RTC初始化
RTC_Set_Time(12,0,