嵌入式作业4

实现UART_2串口的接收程序,当收到字符时:

①在电脑的输出窗口显示下一个字符,如收到A显示B;

②亮灯:收到字符G,亮绿灯;收到字符R,亮红灯;收到字符B,亮蓝灯;收到其他字符,不亮灯。

 

实现方式:

(1) 用构件调用方式实现;

(2) UART部分用直接地址方式实现(即不调用uart.c中的函数,其他部分如GPIO、中断设置可调用函数)。

 

1.

void UART_User_Handler(void)
{
	uint8_t ch;
	uint8_t flag;
	gpio_init(LIGHT_BLUE,GPIO_OUTPUT,LIGHT_ON);	//初始化蓝灯
	gpio_init(LIGHT_GREEN,GPIO_OUTPUT,LIGHT_ON);	//初始化绿灯
	gpio_init(LIGHT_RED,GPIO_OUTPUT,LIGHT_ON);		//初始化红灯
	DISABLE_INTERRUPTS;   //禁用中断,保持停止状态
	ch=uart_re1(UART_User,&flag);  
	if(flag)  //数据传入
	{
    	if(ch=='R')
     	{
			gpio_set(LIGHT_RED,LIGHT_ON);  //红灯亮起
    		gpio_set(LIGHT_GREEN,LIGHT_OFF);
    		gpio_set(LIGHT_BLUE,LIGHT_OFF);//蓝绿灯关闭
    		uart_send_string(UART_User,(uint8_t *)"字符为:");
    		uart_send1(UART_User,ch);//输出字符
    		uart_send_string(UART_User,(uint8_t *)",red,下一个字符为:");
    		uart_send1(UART_User,ch+1);//输出下一个字符
        }
        else if(ch=='G')
        {
			gpio_set(LIGHT_RED,LIGHT_OFF);
    		gpio_set(LIGHT_GREEN,LIGHT_ON);//绿灯亮起
    		gpio_set(LIGHT_BLUE,LIGHT_OFF);//红蓝灯关闭
    		uart_send_string(UART_User,(uint8_t *)"字符为:");
    		uart_send1(UART_User,ch);//输出字符
    		uart_send_string(UART_User,(uint8_t *)",green,下一个字符为:");
    		uart_send1(UART_User,ch+1);//输出下一个字符
        }
        else if(ch=='B')
        {
			gpio_set(LIGHT_RED,LIGHT_OFF);
    		gpio_set(LIGHT_GREEN,LIGHT_OFF);//红绿灯关闭
    		gpio_set(LIGHT_BLUE,LIGHT_ON);//蓝灯亮起
    		uart_send_string(UART_User,(uint8_t *)"字符为:");
    		uart_send1(UART_User,ch);//输出字符
    		uart_send_string(UART_User,(uint8_t *)",blue,下一个字符为:");
    		uart_send1(UART_User,ch+1);//输出下一个字符
        }
	}
	ENABLE_INTERRUPTS;    //开总中断
 }

 运行结果:

2. 

void Custom_UART_Handler(void)
{
    volatile uint32_t *uartStatusReg = (uint32_t *)0x4000441C;
    volatile uint32_t *uartSendReg = (uint32_t *)0x40004428;
    volatile uint32_t *uartReceiveReg = (uint32_t *)0x40004424;
    uint8_t receivedData;
    uint8_t dataFlag = 0;
    Init_LED(LIGHT_BLUE, LED_ON);
    Init_LED(LIGHT_GREEN, LED_ON);
    Init_LED(LIGHT_RED, LED_ON); // 初始化LED灯
    Disable_Global_Interrupts();//禁用中断,保持停止状态

    // 检查是否有接收到的数据
    if (*(uartStatusReg) & (1UL << 5))
    {
        receivedData = *(uartReceiveReg);
        dataFlag = 1;
    }

    if (dataFlag)
    {
            if(ch=='R')
     	{
        	gpio_set(LIGHT_RED,LIGHT_ON);
    		gpio_set(LIGHT_GREEN,LIGHT_OFF);
    		gpio_set(LIGHT_BLUE,LIGHT_OFF);
        }
        else if(ch=='G')
        {
           	gpio_set(LIGHT_RED,LIGHT_OFF);
    		gpio_set(LIGHT_GREEN,LIGHT_ON);
    		gpio_set(LIGHT_BLUE,LIGHT_OFF);
        }
        else if(ch=='B')
        {
            gpio_set(LIGHT_RED,LIGHT_OFF);
    		gpio_set(LIGHT_GREEN,LIGHT_OFF);
    		gpio_set(LIGHT_BLUE,LIGHT_ON);
        }             }

        // 发送数据
        *(uartSendReg) = receivedData + 1;
    }
}

运行结果:

 

  • 分析思考

需要学习编写UART-2程序初始化参数的地址,了解其中的用处,才可以比较好的完成,完成实验的过程中也有出现像是输入字符串不为一个或是rgb三色导致系统崩溃的情况,以后的实验需要注意这个情况。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值