一、利用SysTick定时器编写倒计时程序,如初始设置为2分30秒,每秒在屏幕上输出一次时间,倒计时为0后,红灯亮,停止屏幕输出,并关闭SysTick定时器的中断。
//(1.4)给全局变量赋初值
//"时分秒"缓存初始化(00:02:30)
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为150ms中断
printf("%d:%d:%d\n",gTime[0],gTime[1],gTime[2]);
//切换灯状态
if (gTime[0] == 0 && gTime[1] == 0 && gTime[2] == 0) //若灯状态标志为'A'
{
gpio_set(LIGHT_RED,LIGHT_ON); //设置灯“亮”
printf("计时结束,时间到\n");
//改变状态标志
break;
}
isr.c文件:
void SecAdd1(uint8_t *p)
{
if (*(p + 2) > 0)
{
(*(p + 2))--;// 秒-1
}
else
{
// 秒为0时,处理分和时
if (*(p + 1) > 0)
{
(*(p + 1))--; // 分-1
*(p + 2) = 59; // 秒置为59
}
else
{
// 分为0时,处理时
if (*p > 0)
{
(*p)--; // 时-1
*(p + 1) = 59; // 分置为59
*(p + 2) = 59; // 秒置为59
}
}
}
}
二、利用RTC显示日期(年月日、时分秒),每秒更新。并设置某个时间的闹钟。闹钟时间到时,屏幕上显示有你的姓名的文字,并点亮绿灯。
//(1.4)给全局变量赋初值
g_RTC_Flag=0;
//(1.5)用户外设模块初始化
//gpio_init(LIGHT_BLUE,GPIO_OUTPUT,LIGHT_ON); //初始化蓝灯
uart_init(UART_User,115200);
RTC_Init(); //RTC初始化
RTC_Set_Time(2,21,0); //设置时间为0:2:21
RTC_Set_Date(24,6,9,7); //设置日期
//(1.6)使能模块中断
RTC_PeriodWKUP_Enable_Int(); //使能唤醒中断
uart_enable_re_int(UART_User);
RTC_Alarm_Enable_Int(0); // 使能闹钟A中断
RTC_Set_Alarm(0, 7, 2, 21, 11); // 设置闹钟A的时间
//(1.7)【不变】开总中断
ENABLE_INTERRUPTS;
RTC_Set_PeriodWakeUp(1);
//配置WAKE UP中断,每秒中断一次
isr.c文件
void RTC_Alarm_IRQHandler(void)
{
if(RTC_Alarm_Get_Int(A)) //闹钟A的中断标志位
{
RTC_Alarm_Clear(A); //清闹钟A的中断标志位
gpio_set(LIGHT_GREEN, LIGHT_ON);
printf("lyy的闹钟响了\n");
}
}
三、利用PWM脉宽调制,交替显示红灯的5个短闪和5个长闪。
//(1.3)给主函数使用的局部变量赋初值
Flag=1;
mFlag=0; //灯的状态标志
//(1.4)给全局变量赋初值
countShortFlash = 0;
countLongFlash = 0;
//(1.5)用户外设模块初始化
gpio_init(LIGHT_RED,GPIO_OUTPUT,LIGHT_OFF); //初始化蓝灯
pwm_init(PWM_USER,1500,1000,10.0,PWM_CENTER,PWM_MINUS); //PWM输出初始化
while (1)
{
m_K = 0;
m_duty = 20.0;
for (m_i = 0; m_i < 20; m_i++)
{
if (m_i < 10) // 五次短闪
{
if ((m_i % 2) == 1)
{
countShortFlash++;
printf("第%d次为:短\n", countShortFlash);
}
m_duty = 10.0;
}
else // 五次长闪
{
if ((m_i % 2) == 1)
{
countLongFlash++;
printf("第%d次为:长\n", countLongFlash);
}
m_duty = 90.0;
}
pwm_update(PWM_USER, m_duty); // 调节占空比
m_K = 0;
do
{
mFlag = gpio_get(PWM_USER);
if ((mFlag == 1) && (Flag == 1)) // 高电平,红灯亮
{
printf("高\n");
Flag = 0;
m_K++;
gpio_reverse(LIGHT_RED); // 反转红灯状态
}
else if ((mFlag == 0) && (Flag == 0)) // 低电平,红灯灭
{
printf("低\n");
Flag = 1;
m_K++;
gpio_reverse(LIGHT_RED);
}
} while (m_K < 1);
}
}
4、GEC39定义为输出引脚,GEC10定义为输入引脚,用杜邦线将两个引脚相连,验证捕捉实验程序Incapture-Outcmp-20211110,观察输出的时间间隔。
输出间隔是5s,用时越来越短,闪烁的频率越来越快了。