一、给出gpio_set(LIGHT_RED,LIGHT_OFF);语句中LIGHT_RED和LIGHT_OFF的值是多少?贴出每一步的查找截图。
在user.h文件中
找到LIGHT_RED的值是(PTB_NUM|7)
LIGHT_OFF的值是1
在gpio.h文件中
找到(PTB_NUM)的偏移量宏定义为(1<<8)
根据提供的宏定义:
1.PTB_NUM 的值是 (1<<8),即 256。
2.LIGHT_RED 的值是 (PTB_NUM|7)。
所以,将 PTB_NUM 的值 256 和 7 进行按位或操作,即:
LIGHT_RED = (PTB_NUM | 7) = (256 | 7) = 263
因此,LIGHT_RED 的最终值是 263,LIGH_OFF的值为1。
二、用直接地址编程方式,实现红绿蓝三灯轮流闪烁。
//(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.1)使能相应GPIOB的时钟
*RCC_AHB2|=(1<<1); //GPIOB的B口时钟使能
//(1.5.3.1)定义B口9脚为输出引脚(令D19、D18=01)方法如下:
*gpio_mode &= ~(3<<18); //0b11111111111100111111111111111111;
*gpio_mode &= ~(3<<14); // 清除B口7脚模式位
*gpio_mode |= (1<<14); // 设置B口7脚为输出
*gpio_mode &= ~(3<<16); // 清除B口8脚模式位
*gpio_mode |= (1<<16); // 设置B口8脚为输出
*gpio_mode &= ~(3<<18); // 清除B口9脚模式位
*gpio_mode |= (1<<18); // 设置B口9脚为输出
for(;;) //for(;;)(开头)
{
//(2.1)主循环次数+1,并判断是否小于特定常数
mMainLoopCount++; //+1
if (mMainLoopCount <= 6556677) continue; //如果小于特定常数,继续循环
//(2.2)主循环次数超过特定常数,灯状态进行切换(这样灯会闪烁)
mMainLoopCount = 0; //清主循环次数
//切换灯状态
if (mFlag == 'R') //若灯状态标志为红灯
{
*gpio_brr |= (1 << 9); //设置蓝灯“亮”
*gpio_bsrr |= (1 << 8); //设置绿灯“暗”
*gpio_bsrr |= (1 << 7); //设置红灯“暗”
printf("蓝灯:亮\r\n"); //通过调试串口输出灯的状态
mFlag = 'B'; //改变状态标志
}
else if (mFlag == 'B') //若灯状态标志为蓝灯
{
*gpio_bsrr |= (1 << 9); //设置蓝灯“暗”
*gpio_brr |= (1 << 8); //设置绿灯“亮”
*gpio_bsrr |= (1 << 7); //设置红灯“暗”
printf("绿灯:亮\r\n"); //通过调试串口输出灯的状态
mFlag = 'G'; //改变状态标志
}
else if (mFlag == 'G') //若灯状态标志为绿灯
{
*gpio_bsrr |= (1 << 9); //设置蓝灯“暗”
*gpio_bsrr |= (1 << 8); //设置绿灯“暗”
*gpio_brr |= (1 << 7); //设置红灯“亮”
printf("红灯:亮\r\n"); //通过调试串口输出灯的状态
mFlag = 'R'; //改变状态标志
}
三、用调用构件方式,实现红绿蓝的八种组合轮流闪烁。
//(1.5.2)变量赋值
gpio_init(LIGHT_BLUE, GPIO_OUTPUT, LIGHT_OFF); //初始化蓝灯
gpio_init(LIGHT_RED, GPIO_OUTPUT, LIGHT_OFF); //初始化红灯
gpio_init(LIGHT_GREEN, GPIO_OUTPUT, LIGHT_OFF); //初始化绿灯
for(;;) //for(;;)(开头)
{
mMainLoopCount++;
if (mMainLoopCount <= 12888999) continue;
mMainLoopCount = 0;
// 切换灯的状态
switch (mFlag) {
case 0:
gpio_set(LIGHT_GREEN, LIGHT_ON);
gpio_set(LIGHT_RED, LIGHT_OFF);
gpio_set(LIGHT_BLUE, LIGHT_OFF);
printf("绿亮,绿\n"); // 输出当前状态
break;
case 1:
gpio_set(LIGHT_GREEN, LIGHT_OFF);
gpio_set(LIGHT_RED, LIGHT_ON);
gpio_set(LIGHT_BLUE, LIGHT_OFF);
printf("红亮,红\n"); // 输出当前状态
break;
case 2:
gpio_set(LIGHT_GREEN, LIGHT_OFF);
gpio_set(LIGHT_RED, LIGHT_OFF);
gpio_set(LIGHT_BLUE, LIGHT_ON);
printf("蓝亮,蓝\n"); // 输出当前状态
break;
case 3:
gpio_set(LIGHT_GREEN, LIGHT_ON);
gpio_set(LIGHT_RED, LIGHT_ON);
gpio_set(LIGHT_BLUE, LIGHT_OFF);
printf("绿红亮,黄\n"); // 输出当前状态
break;
case 4:
gpio_set(LIGHT_GREEN, LIGHT_ON);
gpio_set(LIGHT_RED, LIGHT_OFF);
gpio_set(LIGHT_BLUE, LIGHT_ON);
printf("绿蓝亮,青\n"); // 输出当前状态
break;
case 5:
gpio_set(LIGHT_GREEN, LIGHT_OFF);
gpio_set(LIGHT_RED, LIGHT_ON);
gpio_set(LIGHT_BLUE, LIGHT_ON);
printf("红蓝亮,紫\n"); // 输出当前状态
break;
case 6:
gpio_set(LIGHT_GREEN, LIGHT_ON);
gpio_set(LIGHT_RED, LIGHT_ON);
gpio_set(LIGHT_BLUE, LIGHT_ON);
printf("绿红蓝亮,白\n"); // 输出当前状态
break;
case 7:
gpio_set(LIGHT_GREEN, LIGHT_OFF);
gpio_set(LIGHT_RED, LIGHT_OFF);
gpio_set(LIGHT_BLUE, LIGHT_OFF);
printf("都不亮,暗\n"); // 输出当前状态
break;
}
mFlag = (mFlag + 1) % 8; // 更新状态标志,循环通过八种状态
}
}