1、利用SysTick定时器编写倒计时程序, 如初始设置为2分30秒,每秒在屏幕上输出一次时间,倒计时为0后,红灯亮,停止屏幕输出,并关闭SysTick定时器的中断。
Isr.c修改部分:
void SecMin1(uint8_t *p)
{
if (*(p+2) > 0) {
*(p+2)-=1; // 秒 -1
} else {
if (*(p+1) > 0) {
*(p+1)-=1; // 分 -1
*(p+2) = 59; // 秒 设为59
} else {
if (*(p) > 0) {
*(p)-=1; // 时 -1
*(p+1) = 59; // 分 设为59
*(p+2) = 59; // 秒 设为59
}
}
}
}
Main.c修改部分:
gTime[0] = 0; //时
gTime[1] = 2; //分
gTime[2] = 30; //秒
mSec=0; //记住当前秒
gpio_init(LIGHT_RED,GPIO_OUTPUT,LIGHT_OFF); //初始化红灯
systick_init(10);//10ms中断
for(;;) //for(;;)(开头)
{
if (gTime[2] == mSec) continue;
mSec=gTime[2];
if(gTime[0] != 0||gTime[1]!=0||gTime[2]!=0){
printf("%d:%d:%d\n",gTime[0],gTime[1],gTime[2]);
}else{
printf("倒计时结束\n");
gpio_set(LIGHT_RED,LIGHT_ON);
//关闭中断
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
break;
}
} //for(;;)结尾
2、利用RTC显示日期 (年月日、时分秒),每秒更新。并设置某个时间的闹钟。闹钟时间到时,屏幕上显示有你的姓名的文字,并点亮绿灯。
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("刘明委\n");
}
if(RTC_Alarm_Get_Int(B)) //闹钟A的中断标志位
{
RTC_Alarm_Clear(B); //清闹钟A的中断标志位
printf("This is ALARM_B!!!\n");
}
}
Main.c修改部分:
//(1.5)用户外设模块初始化
gpio_init(LIGHT_GREEN,GPIO_OUTPUT,LIGHT_OFF); //初始化绿灯
uart_init(UART_User,115200);
RTC_Init(); //RTC初始化
RTC_Set_Time(16,00,0); //设置时间为0:0:0
RTC_Set_Date(24,5,30,4); //设置日期
//(1.6)使能模块中断
RTC_PeriodWKUP_Enable_Int(); //使能唤醒中断
uart_enable_re_int(UART_User);
RTC_Alarm_Enable_Int(0); //开启0号闹钟
RTC_Set_Alarm(0,4,16,00,10); //闹钟设置(闹钟号,周数,时,分,秒)
3、利用PWM脉宽调制,交替显示红灯的5个短闪和5个长闪。
3.main.c修改部分:
gpio_init(LIGHT_RED,GPIO_OUTPUT,LIGHT_OFF); //初始化红灯
for(;;) //for(;;)(开头)
{
if (Flag == 1) // 交替闪烁短闪
{
m_duty = 30.0; // 设置短闪的占空比
}
else // 交替闪烁长闪
{
m_duty = 70.0; // 设置长闪的占空比
}
pwm_update(PWM_USER,m_duty); //调节占空比
m_K=0; //保证每次输出打印完整的PWM波,再进入下一个循环
do
{
mFlag=gpio_get(PWM_USER);
if ((mFlag==1)&&(Flag==1))
{
printf("短闪\n");
Flag=0;
m_K++;
}
else if ((mFlag==0)&&(Flag==0))
{
printf("长闪\n");
Flag=1;
m_K++;
}
}
while (m_K<1);
// 确保每种模式下完成5次闪烁
for (m_i = 0; m_i < 5; m_i++)
{
if (Flag == 0) // 短闪
{
gpio_set(LIGHT_RED, LIGHT_ON); // 点亮红灯
Delay_ms(300); // 短闪延时(保持红灯亮)
gpio_set(LIGHT_RED, LIGHT_OFF); // 关闭红灯
Delay_ms(300); // 短闪间隔
}
else // 长闪
{
gpio_set(LIGHT_RED, LIGHT_ON); // 点亮红灯
Delay_ms(700); // 长闪延时(保持红灯亮)
gpio_set(LIGHT_RED, LIGHT_OFF); // 关闭红灯
Delay_ms(700); // 长闪间隔
}
printf("%d\n", m_i + 1);
}
} //for(;;)结尾