第四章嵌入式|作业

文章讲述了在嵌入式系统编程中,通过CH04示例学习了如何使用直接地址编程方式控制GPIO,实现红绿蓝灯的轮流闪烁,以及通过调用构件方法实现八种颜色组合的闪烁。作者强调了理解基础构件的重要性,如GPIO、UART等,作为应用编程的基础。
摘要由CSDN通过智能技术生成

1、学习CH04示例程序,包括gpio.c和4个工程中的main.c

2、给出 gpio set(LIGHT RED,LGHT OFF);语句中,LIGHT RED和LIGHT OFF的值是多少?贴出每一步的查找截图。

一个简单的主循环程序:实现了一个循环计数器 `mMainLoopCount` 和一个灯的控制逻辑。

1. 主循环次数变量增加:
主循环次数变量 `mMainLoopCount` 会增加一次。这个变量用来记录主循环的执行次数。

2. 检查主循环次数是否达到设定值


 3. 灯的亮暗处理:
   如果达到设定的主循环次数,会执行以下步骤:
   清除循环次数变量 `mMainLoopCount`,重置为0,以重新开始计数。
    检查灯的状态标志 `mFlag`,如果为 `'L'`,则表示灯状态为“亮”,执行以下操作:
       - 增加灯的闪烁次数 `mLightCount`。
       - 输出当前灯的闪烁次数到串口。
       - 将灯的状态标志 `mFlag` 改为 `'A'`,表示下一次循环将灯状态设为“暗”。
       - 控制灯的状态为“亮”,并输出到串口。
  如果灯状态标志 `mFlag` 为 `'A'`,则表示灯状态为“暗”,执行以下操作:
       - 将灯的状态标志 `mFlag` 改为 `'L'`,表示下一次循环将灯状态设为“亮”。
       - 控制灯的状态为“暗”,并输出到串口。

在每次主循环执行完指定次数后,会使灯交替地从亮到暗,然后再从暗到亮进行闪烁,并在每次闪烁时计数并输出到串口。

编译成功:

运行信息:

3、用直接地址编程方式,实现红绿蓝三灯轮流闪烁

代码如下:
 

#define GLOBLE_VAR
#include "includes.h"      //包含总头文件

int main(void)
{
    uint32_t mMainLoopCount;
    uint8_t mFlag;
    
    DISABLE_INTERRUPTS;
    
    mMainLoopCount = 0;
    mFlag = 'B';
    
    volatile uint32_t* RCC_AHB2;
    volatile uint32_t* gpio_ptr;
    volatile uint32_t* gpio_mode;
    volatile uint32_t* gpio_bsrr;
    volatile uint32_t* gpio_brr;
    
    RCC_AHB2 = (uint32_t*)0x4002104C;
    gpio_ptr = (uint32_t*)0x48000400;
    gpio_mode = gpio_ptr;
    gpio_bsrr = gpio_ptr + 6;
    gpio_brr = gpio_ptr + 10;
    
    *RCC_AHB2 |= (1 << 1);
    *gpio_mode &= ~(3 << 18);
    *gpio_mode |= (1 << 18);
   
    ENABLE_INTERRUPTS;
    
    printf("-----------------------------------------------------\r\n"); 
    printf("金葫芦提示:直接地址方式进行GPIO输出\r\n"); 
    printf("    这个编程有点难以看懂,使用构件编程就简单多了,\r\n");
    printf("    但是构件制作要经过这一关,因此,我们把构件制作与\r\n");
    printf("    基于构件的编程分成不同过程。学习嵌入式系统,\r\n");
    printf("    以理解GPIO、UART、定时器、Flash、ADC、...\r\n");
    printf("    知识要素为出发点,学会正确运用构件进行应用编程,\r\n");
    printf("    理解和掌握2~3个简单构件的制作方法即可。\r\n");
    printf("----------------------------------------------------\r\n"); 
    
    for(;;)
    {
        mMainLoopCount++;
        
        if (mMainLoopCount <= 6556677) continue;
        
        mMainLoopCount = 0;
        
        if (mFlag == 'B')
        {
            *gpio_bsrr |= (1 << 7);
            *gpio_brr |= (1 << 9);
            
            printf("蓝灯:亮\r\n");
            mFlag = 'G';
        }
        else if(mFlag == 'G')
        {
            *gpio_bsrr |= (1 << 9);
            *gpio_brr |= (1 << 8);
            
            printf("绿灯:亮\r\n");
            mFlag = 'R';
        }	
        else
        {
            *gpio_bsrr |= (1 << 8);
            *gpio_brr |= (1 << 7);
            
            printf("红灯:亮\r\n");
            mFlag = 'B';
        }
    }
}

4、用调用构件方式,实现红绿蓝的八种组合轮流闪烁

代码如下:

#define GLOBLE_VAR
#include "includes.h"      //包含总头文件

int main(void)
{
    uint32_t mMainLoopCount;  //主循环次数变量
    uint8_t mFlag;             //灯的状态标志
    
    DISABLE_INTERRUPTS;
    
    mMainLoopCount = 0;
    mFlag = 'B';
    
    gpio_init(LIGHT_BLUE, GPIO_OUTPUT, LIGHT_ON);    //初始化蓝灯
    
    ENABLE_INTERRUPTS;
    
    printf("------------------------------------------------------\n");   
    printf("金葫芦提示:构件法输出控制小灯亮暗   \n");
    printf("    第一次用构件方法点亮的蓝色发光二极管,\n");
    printf("    这是进行应用编程的第一步,可以在此基础上,\n");
    printf("   “照葫芦画瓢”地继续学习实践。\n");
    printf("    例如:改为绿灯;调整闪烁频率等。\n");
    printf("------------------------------------------------------\n"); 

    for (;;)
    {
        mMainLoopCount++;
        
        if (mMainLoopCount <= 12888999)
            continue;
        
        mMainLoopCount = 0;
        
        if (mFlag == 'R')
        {
            mFlag = 'G';
            gpio_set(LIGHT_RED, LIGHT_ON);
            printf("红灯: ON\n");
        }
        else if (mFlag == 'G')
        {
            mFlag = 'B';
            gpio_set(LIGHT_RED, LIGHT_OFF);
            gpio_set(LIGHT_GREEN, LIGHT_ON);
            printf("绿灯: ON\n");
        }
        else if (mFlag == 'B')
        {
            mFlag = 'Y';
            gpio_set(LIGHT_GREEN, LIGHT_OFF);
            gpio_set(LIGHT_BLUE, LIGHT_ON);
            printf("蓝灯: ON\n");
        }
        else if (mFlag == 'Y')
        {
            mFlag = 'P';
            gpio_set(LIGHT_RED, LIGHT_ON);
            gpio_set(LIGHT_BLUE, LIGHT_OFF);
            gpio_set(LIGHT_GREEN, LIGHT_ON);
            printf("黄灯: ON\n");
        }
        else if (mFlag == 'P')
        {
            mFlag = 'C';
            gpio_set(LIGHT_RED, LIGHT_ON);
            gpio_set(LIGHT_GREEN, LIGHT_OFF);
            gpio_set(LIGHT_BLUE, LIGHT_ON);
            printf("紫灯: ON\n");
        }
        else if (mFlag == 'C')
        {
            mFlag = 'W';
            gpio_set(LIGHT_BLUE, LIGHT_ON);
            gpio_set(LIGHT_RED, LIGHT_OFF);
            gpio_set(LIGHT_GREEN, LIGHT_ON);
            printf("青灯: ON\n");
        }
        else if (mFlag == 'W')
        {
            mFlag = 'D';
            gpio_set(LIGHT_BLUE, LIGHT_ON);
            gpio_set(LIGHT_GREEN, LIGHT_ON);
            gpio_set(LIGHT_RED, LIGHT_ON);
            printf("白灯: ON\n");
        }
        else if (mFlag == 'D')
        {
            mFlag = 'R';
            gpio_set(LIGHT_BLUE, LIGHT_OFF);
            gpio_set(LIGHT_GREEN, LIGHT_OFF);
            gpio_set(LIGHT_RED, LIGHT_OFF);
            printf("暗灯: OFF\n");
        }
    }
}
  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值