编写UART 2串口发送程序时,初始化需要设置哪些参数?
波特率(Baud Rate):确定数据传输速率的参数,必须与接收端相匹配。
停止位(Stop Bits):指定停止位的数量,通常为1位或2位。
校验位(Parity Bit):可选的奇偶校验位,用于数据的校验。
数据流控制(Flow Control):可选的硬件或软件流控制机制,用于控制数据传输的流量
使能UART功能:启用UART发送和接收功能。最后,开启UART功能使能位,使UART开始正常工作。
UART相关寄存器地址。
2.假设速度为115200,系统时钟为72MHz,波特率寄存器BRR中的值应该是多少?
对于 OVER8 模式:
usartdiv = (uint16_t)((SystemCoreClock / 115200) * 2);
对于非 OVER8 模式:
usartdiv = (uint16_t)(SystemCoreClock / 115200);
波特率寄存器 BRR 中的值应分别为 1250(OVER8 模式)和 625(非 OVER8 模式)
3.中断向量表在哪个文件中?表中有多少项?给出部分截图。
存放在 ~\03_MCU\startup\startup_stm32|431rctx.s中。中断向量表总共98项。
4.以下是中断源使能函数,假设中断源为TIM6,将函数实例化(写出各项具体数值)。
函数传入参数为IRQn
ISER[(((uint32_t)IRQn) >> 5UL)]
(uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))
所以将ISER[1]的第22位设置为1
5.假设将UART_2和TIM6交换其在中断向量表中的位置和IRQ号,UART_2可以正常中断吗?
可以正常中断,因为中断的处理逻辑还依赖于硬件中断控制器的配置以及中断服务例程的正确实现。
6.实现UART 2串口的接收程序,当收到字符时:
在电脑的输出窗口显示下一个字符,如收到A显示B;
亮灯:收到字符G,亮绿灯;收到字符R,亮红灯;收到字符B,亮蓝灯;收到其他字符,不亮灯。
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){ //判断是否接收到数据
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);
if(rec == '-'){break;}
if(rec == 'R'){
gpio_set(LIGHT_RED,LIGHT_ON);
}else if(rec == 'G'){
gpio_set(LIGHT_GREEN,LIGHT_ON);
}else if(rec == 'B'){
gpio_set(LIGHT_BLUE,LIGHT_ON);
}
}
}
实验结果
7. UART部分用直接地址方式实现
gpio_init(LIGHT_BLUE,GPIO_OUTPUT,LIGHT_OFF); //初始化蓝灯
gpio_init(LIGHT_RED,GPIO_OUTPUT,LIGHT_OFF); //初始化红灯
gpio_init(LIGHT_GREEN,GPIO_OUTPUT,LIGHT_OFF); //初始化绿灯
for(;;)
{
// 接收缓冲区不满,接受字符
if (*uart_isr & (0x1UL << 5U)) {
// 读取接收到的字符
rec = (char)(*uart_tdr & 0xFF);
for (volatile uint32_t j=0;j<=100000;j++){
if (*uart_isr & (0x1UL<<7UL)){ //发送缓冲区为空则发送数据
*uart_tdr = rec + 1;
break;
}
}
// 接收到字符时的处理
if(rec == '-'){break;}
if(rec == 'R'){
gpio_set(LIGHT_GREEN,LIGHT_OFF);
gpio_set(LIGHT_BLUE,LIGHT_OFF);
gpio_set(LIGHT_RED,LIGHT_ON);
}else if(rec == 'G'){
gpio_set(LIGHT_RED,LIGHT_OFF);
gpio_set(LIGHT_BLUE,LIGHT_OFF);
gpio_set(LIGHT_GREEN,LIGHT_ON);
}else if(rec == 'B'){
gpio_set(LIGHT_RED,LIGHT_OFF);
gpio_set(LIGHT_GREEN,LIGHT_OFF);
gpio_set(LIGHT_BLUE,LIGHT_ON);
}else{
gpio_set(LIGHT_RED,LIGHT_OFF);
gpio_set(LIGHT_GREEN,LIGHT_OFF);
gpio_set(LIGHT_BLUE,LIGHT_OFF);
}
}
}