嵌入式第五次作业

1、编写UART_2串口发送程序时,初始化需要设置哪些参数

波特率(Baud Rate):确定数据传输速率。
数据位(Data Bits):指定每个字符的数据位数。
停止位(Stop Bits):指定每个字符之后停止位的位数。
校验位(Parity Bits):用于校验数据传输的正确性。
控制流(Flow Control):包括硬件流控和软件流控,用于控制数据的流动。
时钟使能(Clock Enable):确保UART模块有时钟信号运行。
引脚配置(Pin Configuration):配置UART的发送和接收引脚连接。
中断使能(Interrupt Enable):允许触发接收、发送和错误中断,以实现异步数据收发和错误处理。

2、假设速度为115200,系统时钟为72MHz,波特率寄存器BRR中的值应该是多少?

标志位为1时:

寄存器BRR的值为1250

标志位为0时:

寄存器BRR的值为625

3、中断向量表在哪个文件中?表中有多少项?

startup_stm32l431rctx.s文件中,具体路径为03_MCU\startup\startup_stm32l431rctx.s

表中一共有99项

4、以下是中断源使能函数,假设中断源为TIM6,将函数实例化(写出各项具体数值)。

5、假设将UART_2和TIM6交换其在中断向量表中的位置和IRQ号, UART_2可以正常中断吗?

在不交换的情况下,能成功地执行UART_2中断处理函数。

在中断向量表中交换UART_2和TIM6的位置和IRQ号后,UART_2仍然可以正常中断,但需要在代码中使用新的中断号来引用UART_2的中断。

1、用构件调用方式实现

uint8_t fp = 0;  
	char rec;	//保存接收的字符

//(1.5)用户外设模块初始化
	gpio_init(LIGHT_BLUE,GPIO_OUTPUT,LIGHT_OFF);	//初始化蓝灯
    gpio_init(LIGHT_GREEN,GPIO_OUTPUT,LIGHT_OFF);	//初始化绿灯
    gpio_init(LIGHT_RED,GPIO_OUTPUT,LIGHT_OFF);	//初始化红灯
    
	uart_init(UART_User,115200);                    //初始化串口模块   

		for (;;)
        {
         
          rec = (char) uart_re1(UART_User, &fp);
          if(fp){	//判断是否接收到数据
          	if(rec == 'R'){
          	gpio_set(LIGHT_GREEN,LIGHT_OFF);
          	gpio_set(LIGHT_BLUE,LIGHT_OFF); 
			gpio_set(LIGHT_RED,LIGHT_ON); 
			rec+=1;
          	uart_send1(UART_User,rec);
          }else if(rec == 'G'){
          	gpio_set(LIGHT_BLUE,LIGHT_OFF); 
			gpio_set(LIGHT_RED,LIGHT_OFF);  
			gpio_set(LIGHT_GREEN,LIGHT_ON);
			rec+=1;
          	uart_send1(UART_User,rec);
          }else if(rec == 'B'){
			gpio_set(LIGHT_RED,LIGHT_OFF);  
			gpio_set(LIGHT_GREEN,LIGHT_OFF);
			gpio_set(LIGHT_BLUE,LIGHT_ON); 
			rec+=1;
          	uart_send1(UART_User,rec);
          }else{
          	gpio_set(LIGHT_RED,LIGHT_OFF);  
			gpio_set(LIGHT_GREEN,LIGHT_OFF);
			gpio_set(LIGHT_BLUE,LIGHT_OFF); 
          	rec+=1;
          	uart_send1(UART_User,rec);
          	}
          }
          
        }

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

//uart寄存器相关地址
volatile uint32_t* uart_isr=0x4000441CUL;      // UART中断和状态寄存器基地址
volatile uint32_t* uart_tdr=0x40004428UL;      // UART发送数据寄存器
volatile uint32_t* uart_rdr=0x40004424UL;      // UART接收数据寄存器

void USART2_IRQHandler(void)
{
	uint8_t ch;
	uint8_t flag;
	uint32_t t1;
	uint32_t t2;
	DISABLE_INTERRUPTS;   //关总中断
	
	//接收一个字节的数据
	for (t1 = 0; t1 < 0xFBBB; t1++)//查询指定次数
	{
		//判断接收缓冲区是否满
		if((*uart_isr)&(1<<5))
		{
			ch=*uart_rdr;			//获取数据
			*uart_isr &= ~(1<<5);	//清接收中断位
			flag = 1;  //接收成功
			break;
		}
	}
	if(t1 >= 0xFBBB)
	{
		ch = 0xFF;
		flag = 0;    //未收到数据
	}
	
	if(flag)                       //有数据
	{
		for (t2 = 0; t2 < 0xFBBB; t2++)//查询指定次数
		{
			//发送缓冲区为空则发送数据,发送数据寄存器收到的字节+1
			if((*uart_isr)&(1<<7))		
			{
				*uart_tdr=ch+1;			
				break;
			}
		}
		if (t2 >= 0xFBBB)
			return 0; //发送超时,发送失败	
		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);
		}
		else //当接收非字符R、G、B时
		{
			//所有灯都暗
			gpio_set(LIGHT_RED,LIGHT_OFF);
			gpio_set(LIGHT_GREEN,LIGHT_OFF);
			gpio_set(LIGHT_BLUE,LIGHT_OFF);
		}
	}
	ENABLE_INTERRUPTS;    //开总中断
}

  • 10
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值