广大嵌入式作业四

一、给出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&lt;&lt;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;  // 更新状态标志,循环通过八种状态
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值