问题2
给出gpio_set(LIGHT_RED,LIGHT_OFF);语句中,LIGHT_RED和LiGHT_OFF的值是多少?
此处所使用的LIGHT_RED和LiGHT_OFF是用户化的宏,它们在user.h中定义,需要进入CH04中,进入GPIO-BlueLight_20230328文件中的05_UserBoard,双击打开user.h文件,查看其定义如下:
分别为箭头所指的两个定义值,此处LIGHT_RED中还有一定义值PTB_NUM未知
在如下图箭头所示的路径中,找到该定义值
即PTB_NUM被定义为 0b 1 0000 0000,则LIGHT_RED被定义为0b 1 0000 0111
问题3
用GPIO端口的直接地址编程方式,实现红绿蓝三灯轮流闪烁。
//GZHU 32106100059 CKS
printf("GZHU CKS\r\n");
for(;;) //for(;;)(开头)
{
//(2.1)主循环次数+1,并判断是否小于特定常数
mMainLoopCount++; //+1
if (mMainLoopCount<=6556677) continue; //如果小于特定常数,继续循环
//(2.2)主循环次数超过特定常数,灯状态进行切换(这样灯会闪烁)
mMainLoopCount=0; //清主循环次数
mFlag=0;
if(mFlag==0)//红灯
{
//切换灯状态
*gpio_brr|=(1<<7); //设置灯“亮”
printf("红灯:亮\r\n"); //通过调试串口输出灯的状态
for(int i=0;i<10000000;i++)
{}
*gpio_bsrr|=(1<<7); //设置灯“暗”
printf("红灯:暗\r\n"); //通过调试串口输出灯的状态
for(int i=0;i<10000000;i++)
{}
mFlag=1;
}
if(mFlag==1)//绿灯
{
*gpio_brr|=(1<<8); //设置灯“亮”
printf("绿灯:亮\r\n"); //通过调试串口输出灯的状态
for(int i=0;i<10000000;i++)
{}
*gpio_bsrr|=(1<<8); //设置灯“暗”
printf("绿灯:暗\r\n"); //通过调试串口输出灯的状态
for(int i=0;i<10000000;i++)
{}
mFlag=2;
}
if(mFlag==2)//蓝灯
{
*gpio_brr|=(1<<9); //设置灯“亮”
printf("蓝灯:亮\r\n"); //通过调试串口输出灯的状态
for(int i=0;i<10000000;i++)
{}
*gpio_bsrr|=(1<<9); //设置灯“暗”
printf("蓝灯:暗\r\n"); //通过调试串口输出灯的状态
for(int i=0;i<10000000;i++)
{}
}
} //for(;;)结尾
此处将原有的mFlag变量改为数字0,1,2,分别代表红绿蓝三色。
结果如下:
问题4
直接依照原有例子进行改写,使用gpio进行灯光切换。
在开头加入如下定义
uint32_t Count; //灯的闪烁次数
uint32_t Color; //灯的颜色
Count=0; //灯的闪烁次数
Color=0; //灯的颜色
在主程序中写入如下内容
printf("GZHU,32106100059,CKS\n");
for(;;) //for(;;)(开头)
{
//(2.1)主循环次数变量+1
mMainLoopCount++;
//(2.2)未达到主循环次数设定值,继续循环
if (mMainLoopCount<=12888999) continue;
//(2.3)达到主循环次数设定值,执行下列语句,进行灯的亮暗处理
//(2.3.1)清除循环次数变量
mMainLoopCount=0;
//(2.3.2)如灯状态标志mFlag为'L',灯的闪烁次数+1并显示,改变灯状态及标志
if (Color==0) //判断灯的状态标志
{
Count++;
gpio_set(LIGHT_BLUE,LIGHT_ON); //蓝灯“亮”
gpio_set(LIGHT_GREEN,LIGHT_OFF);//绿灯“暗”
gpio_set(LIGHT_RED,LIGHT_OFF); //红灯“暗”
printf("灯的闪烁次数:%d\n",Count);
printf("蓝灯:亮,绿灯:暗,红灯:暗\n"); //串口输出灯的状态
Color++;
continue;
}
if (Color==1) //判断灯的状态标志
{
Count++;
gpio_set(LIGHT_BLUE,LIGHT_OFF); //蓝灯“暗”
gpio_set(LIGHT_GREEN,LIGHT_ON);//绿灯“亮”
gpio_set(LIGHT_RED,LIGHT_OFF); //红灯“暗”
printf("灯的闪烁次数:%d\n",Count);
printf(" 蓝灯:暗,绿灯:亮,红灯:暗\n"); //串口输出灯的状态
Color++;
continue;
}
if (Color==2) //判断灯的状态标志
{
Count++;
gpio_set(LIGHT_BLUE,LIGHT_ON); //蓝灯“亮”
gpio_set(LIGHT_GREEN,LIGHT_ON);//绿灯“亮”
gpio_set(LIGHT_RED,LIGHT_OFF); //红灯“暗”
printf("灯的闪烁次数:%d\n",Count);
printf(" 蓝灯:亮,绿灯:亮,红灯:暗\n"); //串口输出灯的状态
Color++;
continue;
}
if (Color==3) //判断灯的状态标志
{
Count++;
gpio_set(LIGHT_BLUE,LIGHT_OFF); //蓝灯“暗”
gpio_set(LIGHT_GREEN,LIGHT_OFF);//绿灯“暗”
gpio_set(LIGHT_RED,LIGHT_ON); //红灯“亮”
printf("灯的闪烁次数:%d\n",Count);
printf(" 蓝灯:暗,绿灯:暗,红灯:亮\n"); //串口输出灯的状态
Color++;
continue;
}
if (Color==4) //判断灯的状态标志
{
Count++;
gpio_set(LIGHT_BLUE,LIGHT_ON); //蓝灯“亮”
gpio_set(LIGHT_GREEN,LIGHT_OFF);//绿灯“暗”
gpio_set(LIGHT_RED,LIGHT_ON); //红灯“亮”
printf("灯的闪烁次数:%d\n",Count);
printf("蓝灯:亮,绿灯:暗,红灯:亮\n"); //串口输出灯的状态
Color++;
continue;
}
if (Color==5) //判断灯的状态标志
{
Count++;
gpio_set(LIGHT_BLUE,LIGHT_OFF); //蓝灯“暗”
gpio_set(LIGHT_GREEN,LIGHT_ON);//红灯“亮”
gpio_set(LIGHT_RED,LIGHT_ON); //绿灯“亮”
printf("灯的闪烁次数:\n",Count);
printf(" 蓝灯:暗,绿灯:亮,红灯:亮\n"); //串口输出灯的状态
Color++;
continue;
}
if (Color==6) //判断灯的状态标志
{
Count++;
gpio_set(LIGHT_BLUE,LIGHT_ON); //蓝灯“亮”
gpio_set(LIGHT_GREEN,LIGHT_ON);//红灯“亮”
gpio_set(LIGHT_RED,LIGHT_ON); //绿灯“亮”
printf("灯的闪烁次数: %d\n",Count);
printf(" 蓝灯:亮,绿灯:亮,红灯:亮\n"); //串口输出灯的状态
Color++;
continue;
}
if (Color==7) //判断灯的状态标志
{
Color=0;//灯光重置
gpio_set(LIGHT_BLUE,LIGHT_OFF); //蓝灯“暗”
gpio_set(LIGHT_GREEN,LIGHT_OFF);//红灯“暗”
gpio_set(LIGHT_RED,LIGHT_OFF); //绿灯“暗”
printf("蓝灯:暗,绿灯:暗,红灯:暗\n"); //串口输出灯的状态
}
} //for(;;)结尾
所得结果如下: