嵌入式第四章作业

(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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值