所用单片机型号:MSP432P401r
今日继续我的MSP432电赛速成之路,今日学习的是:
串口收发
因为KEIL仿真需要占用一个串口,所以此处学习多路的串口收发,
以达到既能仿真,又不影响MSP432向上位机发送串口数据。
串口通讯对于对于单片机的调试运行也有着非常重要的作用,
通过UART可以实现多设备的通讯,实现更复杂功能的实现。
UART的基本原理在此不作过多的赘述.
此文章主要围绕欲实现的功能是:
向上位机用 串口A2 收发上位机传来的数据,同时还能用 KEIL在另一个 串口A0 进行仿真。
用到的绿色盒子是 USB转RS232/RS485/TTL UART通信模块
芯片型号:MSP432P401R
https://download.csdn.net/download/qq_64257614/87793549?spm=1001.2014.3001.5503
串口 | RXD | TXD |
---|---|---|
EUSCI_A0_BASE | P1^2 | P1^3 |
EUSCI_A1_BASE | P2^2 | P2^3 |
EUSCI_A2_BASE | P3^2 | P3^3 |
EUSCI_A3_BASE | P9^6 | P9^7 |
查阅芯片原理图发现 EUSCI_A0_BASE 串口是通过跳线帽连接到调试器的:
所以我们不能再去 使用 A0串口来向上位机发送我们的数据了,因为A0是要被KEIL仿真占用的。
此处我将 USB转RS232/RS485/TTL UART通信模块 连接了
EUSCI_A2_BASE串口的 TXD与RXD
此处有一接线方式的注意点十分重要:
USB转RS232/RS485/TTL UART通信模块 的 TXD 要接串口的 RXD
USB转RS232/RS485/TTL UART通信模块的 RXD 要接串口的 TXD
1~5在uart.h库文件中,6~7在interrupt.h库文件中.
如需使用,请勿忘记调用添加头文件
1.初始化串口模块:
uart_inintModule(EUSCI_Ax_BASE,&uartConfig);
2.串口使能模块:
UART_enableModule(EUSCI_Ax_BASE);
3.开启串口相关中断:
UART_enableinterrupt(EUSCI_Ax_BASE,EUSCI_x_INTERRUPT);
4.获取数据:
UART_receiveData(EUSCI_Ax_BASE);
5.发送数据:
UART_transmitData(EUSCI_Ax_BASE,Data_8bit);
6.开启串口端口中断:
interrupt_enableinterrupt(INT_EUSCIAx);
7.开启总中断:
interrupt_enableMaster(void);
0.配置时钟
1.配置GPIO复用
2.配置结构体
3.初始化串口
4.开启串口
5.开启串口相关中断
6.开启串口端口中断
7.开启总中断
8.编写UART ISR
PS: 程序在读取寄存器后会自动清除中断标志位。
我们先新建打开一个空项目,空项目例程在此获取:
https://download.csdn.net/download/qq_64257614/87781382?spm=1001.2014.3001.5503
如若这个链接获取不了例程
就从bilibili的mRNA的视频去获取,这里贴出视频传送门,以及空项目工程路径:
(新)1-1 课程资料获取 配置开发环境_哔哩哔哩_bilibili
找到了空项目复制到别处并改名,就可以自己进行编程了;
1.首先把例程的usart.c中的 串口配置函数完整复制下来:
复制整个void uart_inint(uint32_t baudRate )
这个函数括号中的参数 uint32_t baudRate 表示的是要设置的波特率
2.粘贴在同一头文件下,并改名:
我改成了 void uart2_init(uint32_t baudRate)
表示对串口A2进行得初始化.
3.别忘了对其在usart.h文件进行声明:
不声明就没法调用哦!
对刚才复制的函数是用来初始化A0的,为了将其改为初始化A2的函数,
我们还需要进行如下一些参数设置的更改:
波特率设置为115200,初始化的引脚改为A2串口的引脚,开启A2串口引脚的复用
为此我们还要按以下步骤来配置串口结构体:
4.首先需要计算配置数:
就是这些蓝色框出来的四个参数,它们是需要根据时钟频率和我要的波特率来计算的。
此处时钟48Mhz,波特率115200
5.于是我们先找到TI官方提供的方便计算的网站:
说明:这个网址是在官方SDK库下的例程代码文件夹里找到的,文件路径如下(很长):
(下面我会贴网址直接传送就好了,此处我只是介绍这是哪里来的):
此网址我会在下面贴出来,各位看官可以不去找他。
D:\MSP432_SDK\
simplelink_msp432p4_sdk_3_40_01_02\
examples\
nortos\
MSP_EXP432P401R\
driverlib\
uart_loopback_24mhz_brclk
就在这个c文件中的注释里可以找到这个网址
此处直接贴出来传送:
MSP430 USCI/EUSCI UART Baudrate Calculator
6.如此设置好后再点击计算就可以了:
7.将刚才计算好的数值填充进我们最开始复制改名的串口函数:
8.修改函数里面的GPIO复用,开启相关中断:
9.以下配置都加在最开始复制改名的串口函数里面就行了:
此步的所有语句我是放在函数的最后几行的
//开启端口复用
MAP_GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P3, GPIO_PIN2 | GPIO_PIN3, GPIO_PRIMARY_MODULE_FUNCTION);
//初始化串口
MAP_UART_initModule(EUSCI_A2_BASE, &uartConfig);
//开启串口模块
MAP_UART_enableModule(EUSCI_A2_BASE);
//开启串口相关中断
MAP_UART_enableInterrupt(EUSCI_A2_BASE,EUSCI_A_UART_RECEIVE_INTERRUPT);
//开启串口端口中断
MAP_Interrupt_enableInterrupt(INT_EUSCIA2);
10编写串口服务函数:
这个函数要有声明,或者像我一样直接写在mian函数下面
//串口服务函数,把串口接收发回给电脑
void EUSCIA2_IRQHandler(void)
{
uint32_t status = UART_getEnabledInterruptStatus(EUSCI_A2_BASE);
if(status & EUSCI_A_UART_RECEIVE_INTERRUPT_FLAG) //接收中断
{
UART_transmitData(EUSCI_A2_BASE,MAP_UART_receiveData(EUSCI_A2_BASE));
}
}
11.对printf()这个函数,我们需要的话可以进行一些更改:
因为printf()函数调用的是fputc()函数,所以我们需要找到fputc()函数进行更改:
至于printf()函数在嵌入式的介绍,以及fputc()函数的关系,我在这篇文章有所探讨学习:
https://blog.csdn.net/qq_64257614/article/details/130723079?spm=1001.2014.3001.5502
12.更改fputc()函数,使其对应我们想要设置的串口:
测试串口程序编写效果:
选对端口号,插上后直接发现printf()函数能用串口A2进行输出了:
说明对Printf()函数的改动是有效的
随后由上位机发送数据进行对串口A2的测试
发现串口A2能正常 接——化——发
说明串口2可以正常使用:
最后希望各位看官点赞收藏支持一下!