(1)给出gpio_set(LIGHT_RED,LIGHT_OFF)语句中LIGHT_RED和LIGHT_OFF的值是多少?
我首先在第二个工程中找到了对应的语句
接着去头文件中查找
(2)用直接地址编程方式,实现红绿蓝三灯轮流闪烁
使用第四个工程的模板
主要代码逻辑:
用RGB三个字母分别代表灯亮,对应的小写字母代表灯暗,通过改变状态位实现三灯轮流闪烁。
#define GLOBLE_VAR
#include "includes.h" //包含总头文件
int main(void)
{
//(1)======启动部分(开头)==========================================
//(1.1)声明main函数使用的局部变量
uint32_t mMainLoopCount; //主循环使用的记录主循环次数变量
uint8_t mFlag; //主循环使用的临时变量
//(1.2)【不变】关总中断
DISABLE_INTERRUPTS;
//(1.3)给主函数使用的局部变量赋初值
mMainLoopCount = 0; //主循环使用的记录主循环次数变量
mFlag='R'; //主循环使用的临时变量:红灯状态标志
//(1.4)给全局变量赋初值
//(1.5)用户外设模块初始化
//(1.5.1)声明变量
volatile uint32_t* RCC_AHB2; //GPIO的B口时钟使能寄存器地址
volatile uint32_t* gpio_ptr; //GPIO的B口基地址
volatile uint32_t* gpio_mode; //引脚模式寄存器地址=口基地址
volatile uint32_t* gpio_bsrr; //置位/复位寄存器地址
volatile uint32_t* gpio_brr; //GPIO位复位寄存器
//(1.5.2)变量赋值
RCC_AHB2=(uint32_t*)0x4002104C; //GPIO的B口时钟使能寄存器地址
gpio_ptr=(uint32_t*)0x48000400; //GPIO的B口基地址
gpio_mode=gpio_ptr; //引脚模式寄存器地址=口基地址
gpio_bsrr=gpio_ptr+6; //置位/复位寄存器地址
gpio_brr=gpio_ptr+10; //GPIO位复位寄存器
//(1.5.3)GPIO初始化
//(1.5.3.1)使能相应GPIOB的时钟
*RCC_AHB2|=(1<<1); //GPIOB的B口时钟使能
//(1.5.3.1)定义B口9、8、7脚为输出引脚(令D19、D18=01)方法如下:
*gpio_mode &= ~(3<<18); //0b11111111111100111111111111111111;
*gpio_mode |=(1<<18); //0b00000000000001000000000000000000;
*gpio_mode &= ~(3<<16);
*gpio_mode |=(1<<16);
*gpio_mode &= ~(3<<14);
*gpio_mode |=(1<<14);
//(1.6)使能模块中断
//(1.7)【不变】开总中断
ENABLE_INTERRUPTS;
printf("-----------------------------------------------------\r\n");
printf("用直接地址编程方式,实现红绿蓝三灯轮流闪烁\r\n");
printf("广州大学--------------------------------------------\r\n");
printf("32106200026 GXY-------------------------------------\r\n");
printf("----------------------------------------------------\r\n");
for(;;) //for(;;)(开头)
{
//(2.1)主循环次数+1,并判断是否小于特定常数
mMainLoopCount++; //+1
if (mMainLoopCount<=6556677) continue; //如果小于特定常数,继续循环
//(2.2)主循环次数超过特定常数,灯状态进行切换(这样灯会闪烁)
mMainLoopCount=0; //清主循环次数
//切换灯状态
if (mFlag=='R') //若灯状态标志为'R'
{
*gpio_brr|=(1<<7); //设置红灯“亮”
printf("红灯:亮\r\n"); //通过调试串口输出灯的状态
mFlag='r'; //改变状态标志
}
else if(mFlag == 'r') //红灯暗
{
*gpio_bsrr|=(1<<7);
printf("红灯:暗\r\n"); //通过调试串口输出灯的状态
mFlag='G'; //改变状态标志
}
else if(mFlag == 'G') //若灯状态标志为'G'
{
*gpio_brr|=(1<<8);
printf("绿灯:亮\r\n"); //通过调试串口输出灯的状态
mFlag='g';
}
else if(mFlag == 'g') //绿灯暗
{
*gpio_bsrr|=(1<<8);
printf("绿灯:暗\r\n"); //通过调试串口输出灯的状态
mFlag='B'; //改变状态标志
}
else if(mFlag == 'B') //若灯状态标志为'B'
{
*gpio_brr|=(1<<9);
printf("蓝灯:亮\r\n"); //通过调试串口输出灯的状态
mFlag='b';
}
else if(mFlag == 'b') //蓝灯暗
{
*gpio_bsrr|=(1<<9);
printf("蓝灯:暗\r\n"); //通过调试串口输出灯的状态
mFlag='R'; //改变状态标志
}
} //for(;;)结尾
//(2)======主循环部分(结尾)========================================
}
结果:
VID_20240428_114756
(3)用调用构件方式,实现红绿蓝的八种组合轮流闪烁
使用第三个工程的模版
主要代码逻辑:
我使用数字标识灯的状态,RGB分别对应三位数,即八种灯的状态为000~111。每次循环判断当前位是否为1,为1则灯亮,每位独立判断。每次循环+1取模,避免数字超过范围。
#define GLOBLE_VAR
#include "includes.h" //包含总头文件
//----------------------------------------------------------------------
//主函数
int main(void)
{
//(1)======启动部分(开头)==========================================
//(1.1)声明main函数使用的局部变量
uint32_t mMainLoopCount; //主循环次数变量
uint8_t mFlag; //灯的状态标志
uint32_t mLightCount; //灯的状态切换次数
//(1.2)【不变】关总中断
DISABLE_INTERRUPTS;
//(1.3)给主函数使用的局部变量赋初值
mMainLoopCount=0; //主循环次数变量
mFlag=0; //灯的状态标志
mLightCount=0; //灯的闪烁次数
//(1.4)给全局变量赋初值
//(1.5)用户外设模块初始化
gpio_init(LIGHT_BLUE,GPIO_OUTPUT,LIGHT_OFF); //初始化蓝灯
gpio_init(LIGHT_RED,GPIO_OUTPUT,LIGHT_OFF); //初始化红灯
gpio_init(LIGHT_GREEN,GPIO_OUTPUT,LIGHT_OFF); //初始化绿灯
//(1.6)使能模块中断
//(1.7)【不变】开总中断
ENABLE_INTERRUPTS;
printf("广州大学----------------------------------------------\n");
printf("32106200026 GXY---------------------------------------\n");
printf("用调用构件方式,实现红绿蓝的八种组合轮流闪烁------------\n");
//(1)======启动部分(结尾)==========================================
//(2)======主循环部分(开头)========================================
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((mFlag &(1<<2))>0)
{
printf(" 红 ");
gpio_set(LIGHT_RED,LIGHT_ON);
}
else
{
gpio_set(LIGHT_RED,LIGHT_OFF);
}
if((mFlag &(1<<1))>0)
{
printf(" 绿 ");
gpio_set(LIGHT_GREEN,LIGHT_ON);
}
else
{
gpio_set(LIGHT_GREEN,LIGHT_OFF);
}
if((mFlag &1)>0)
{
printf(" 蓝 ");
gpio_set(LIGHT_BLUE,LIGHT_ON);
}
else
{
gpio_set(LIGHT_BLUE,LIGHT_OFF);
}
mFlag = (mFlag+1)&7;
mLightCount++;
printf("灯的闪烁次数 mLightCount = %d\n",mLightCount);
} //for(;;)结尾
} //main函数(结尾)
实验结果:
111