第一部分
1.编写UART_2串口发送程序时,初始化需要设置哪些参数?
-
波特率(Baud Rate):指定串口的通信速率,即每秒钟传输的比特数。波特率需要与接收端设备的波特率相匹配,以确保正确的通信。
-
数据位数(Data Bits):指定每个字符传输的位数。通常为 8 位,但有时也可以是 7 或 9 位。
-
停止位数(Stop Bits):指定每个字符后停止位的数目。通常为 1 位或 2 位。
-
校验位(Parity Bit):用于检测数据传输过程中的错误。常见的校验位有奇校验、偶校验、无校验等。
-
流控制(Flow Control):可选的参数,用于控制数据流的传输。包括硬件流控制(如 RTS/CTS)和软件流控制(如 XON/XOFF)等。
-
串口模式(Mode):指定串口的工作模式,如同步模式或异步模式。
-
中断使能(Interrupt Enable):是否启用串口接收或发送中断,以便在数据可用时及时处理。
-
缓冲区设置:指定接收缓冲区和发送缓冲区的大小,以便存储接收到的数据和待发送的数据。
2.假设速度为115200,系统时钟为72MHz,波特率寄存器BRR中的值应该是多少?
对于 OVER8 模式:
usartdiv = (uint16_t)((SystemCoreClock / 115200) * 2);
此时波特率寄存器BRR的值为 usartdivz=1250
对于非 OVER8 模式:
usartdiv = (uint16_t)(SystemCoreClock / 115200);
此时波特率寄存器BRR的值为 usartdivz=625
3.中断向量表在哪个文件中?表中有多少项?给出部分截图
中断向量表在文件~\03_MCU\startup\startup_stm32l431rctx.s中,表中内容如下
一共有99项
4.以下是中断源使能函数,假设中断源为TIM6,将函数实例化(写出各项具体数值)
在查找/替换窗口查找TIM6,可以找到其IRQ号为54
然后根据中断使能函数计算得到:
寄存器索引位置:
寄存器索引 = IRQn >> 5UL = 54 >> 5 = 1
位偏移量:
将1左移22位,以得到一个数值,只有第22位为1,其他位为0:
(1UL << 22) = (0x1UL << 22) = 0x00400000UL
uint32_t index = ((uint32_t)TIM6_IRQn) >> 5UL; // 寄存器索引为1
uint32_t offset = ((uint32_t)TIM6_IRQn) & 0x1FUL; // 位偏移为22
5.假设将UART 2和TIM6交换其在中断向量表中的位置和IRQ号, UART 2可以正常中断吗?
在大多数情况下,即使将UART 2和TIM6在中断向量表中的位置和IRQ号进行交换,UART 2仍然可以正常中断。这是因为中断处理程序的执行是由中断向量表中的中断号来确定的,而不是由中断号对应的外设类型来确定的。
当一个中断被触发时,处理器会根据中断向量表中的相应位置跳转到对应的中断处理程序。因此,只要中断向量表中的相应位置被正确设置为UART 2的中断处理程序,即使IRQ号被重新映射到了TIM6,UART 2仍然可以正常中断。
然而,这种交换可能会导致代码的可读性和维护性下降,因为人们可能会期望在特定位置找到特定的中断处理程序。因此,除非有充分的理由需要这样做,否则最好保持中断向量表中的顺序不变。
第二部分
实现UART 2串口的接收程序,当收到字符时:
①在电脑的输出窗口显示下一个字符,如收到A显示B;
②亮灯:收到字符G,亮绿灯;收到字符R,亮红灯;收到字符B,亮蓝灯;收到其他字符,不亮灯。
要求:
1.用构件调用方式实现
2.UART部分用直接地址方式实现(即不调用uart.c中的函数,其他部分如GPIO、中断设置可调用函数)
先修改isr.c中输出的数据,即将原本的回发原本的字节修改为回发收到的字节加一,如下:
结果如下:
如图,发送‘A’输出‘B’,发送‘C’输出‘D’,实现了第一个功能要求
参考isr.c中的代码,将输入的字符提取出来,并进行识别,isr.c中代码如下:
实现代码如下:
最后加上几个判断语句,如果接收到‘R’就亮红灯,‘B’亮蓝灯,‘G’亮绿灯就完成了,最终结果如下: