1、编写UART 2串口发送程序时,初始化需要设置哪些参数?
确定MCU串口号、所接MCU的引脚:
波特率(Baud Rate):确定数据传输速率的参数,必须与接收端相匹配。
停止位(Stop Bits):指定停止位的数量,通常为1位或2位。
校验位(Parity Bit):可选的奇偶校验位,用于数据的校验。
数据流控制(Flow Control):可选的硬件或软件流控制机制,用于控制数据传输的流量
使能UART功能:启用UART发送和接收功能。最后,开启UART功能使能位,使UART开始正常工作。
uart_cr1: UART控制寄存器1基地址,用于配置UART的工作模式和使能相关功能。
uart_brr: UART波特率寄存器地址,用于配置波特率。
uart_isr: UART中断和状态寄存器基地址,用于配置中断相关设置。
uart_cr2: UART控制寄存器2基地址,用于配置UART的工作模式。
uart_cr3: UART控制寄存器3基地址,用于配置UART的工作模式。
2、假设速度为115200,系统时钟为72MHz,波特率寄存器 BRR中的值应该是多少?
//配置波特率 if(*uart_cr1&(0x1UL<<15) == (0x1UL<<15))
usartdiv = (uint16_t)((SystemCoreClock/115200)*2);
else
usartdiv = (uint16_t)((SystemCoreClock/115200));
*uart_brr = usartdiv;
- 对于 OVER8 模式(系数为8):USARTDIV = 2*72MHz / 115200 = 1250
- 对于非 OVER8 模式(系数为16):USARTDIV = 72MHz / 115200 = 625
3、中断向量表在哪个文件中?表中有多少项?给出部分截图。
如图中断向量表在03_MCU里startup的第一个文件startup_stm321431rctx.s
从第141行到第239行,总共99项。前16个为内核中断,后面的为非内核中断。
4、以下是中断源使能函数,假设中断源为TIM6,将函数实例化(写出各项具体数值)。
查表,TIM6对应接受中断的IRQ号为54
· ISER[(((uint32_t)IRQn) >> 5UL)]函数内部实现将IRQ号值右移5位
54>>5=1 , 索引值为1
· (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)) 确定要设置的位数
54 & 0x1F = 22 , 第22位
即54除以32余22,所以将ISER[1]的第22位设置为1
5、假设将UART_2和TIM6交换其在中断向量表中的位置和IRQ号,UART_2可以正常中断吗?
交换UART_2和TIM6在中断向量表中的序号和IRQ号会导致中断处理函数的映射关系发生改变,这可能使得UART_2的中断无法正常执行。即便UART_2的中断向量指向其原始位置,实际触发的将是TIM6的中断处理程序,从而造成UART_2的中断无法被正确地识别或处理。
在这种情况下,UART_2原本的中断号38会变成54,而TIM6原本的中断号54则会变成38。为了确保UART_2的中断能够正常工作,中断向量表中UART_2的序号和IRQ号需要保持一致,因为中断号的变更并不影响NVIC中断控制器的设置,它只是更改了中断向量表中指向中断处理函数的地址。同时,中断处理程序也需要正确地配置。如果你打算交换这两个中断的位置,必须相应地调整中断向量表和中断处理程序的设置,以保证中断功能的正常运行。