最近一个应用场景是:使用串口完成FPGA与MCU通信,这里用到两个串口,分别是USART1和USART3,串口1与上位机通信,FPGA与MCU的串口3连接。
为了测试,设计了一个回环实验,即:串口1接收上位机发送的数据,串口3将接收的数据发出并通过串口3接收,串口1再发送给上位机。
需要注意的是,“串口3将接收的数据发出并通过串口3接收”,这一步是需要硬件上物理连接的。即串口3的RX与TX短接,这样数据可以使用。
测试使用的仅为一个F4的最小系统板
下面开始进行配置:
时钟配置:
由无源晶振提供时钟,所以都选择Crystal/Ceramic Resonator(若MCU的时钟是由FPGA的IO口提供时,需要选择BYPASS Clock Source有源时钟)。
SYS配置:

使用ST-LINK进行下载程序并调试,所以选择Serial Wire。
串口配置:


串口1与串口3的配置都是一样的,选择异步,波特率选择115200,并且打开串口中断,其他默认。
由于与FPGA连接的引脚是PD8与PD9,在这里还要对引脚进行更改(默认的不是这个引脚)
时钟树配置:

单击,选择串口功能,右上角会出现一个黑色钉子,代表完成配置。
代码部分:使用的是串口中断逻辑:首先在int main()函数里打开串口3的接收,这里串口1的接收可开启可不开启
解释以下这句话:这是开启串口的接收函数,有IT代表是中断接收
&huart3表示对象,这里指选择串口3进行配置
(uint8_t *)&tran_data:这个指针是串口接收时所存放的地方
1:表示接收到的数量
接下来就是重点的代码了

中断回环函数,即当某个串口完成了接收后,就会进入这个函数完成对应指令。我们的流程第一步是上位机通过串口1发送指令。当串口1接收到数据tran_data后,就会进入第一个if语句中,在这个语句里面,选择使用串口3发送tran_data;随后开启串口3的接收,放入rec_data中;在这个实验中,串口3的RX与TX是连接在一起的,所以串口3发送的数据也会被串口3接收,当串口3接收后进入第二个if语句中,这里选择将串口3接收的数据,通过串口1进行发送,串口1是与上位机连接的,所以最终可以在上位机看到接收的内容。实际的效果是,发送什么数据,上位机就显示什么数据。
注意:因为使用了串口回环函数后,串口就会关闭,所以在每一个if语句的最后,都需要重新打开串口,否则只能完成一次回环。
6575

被折叠的 条评论
为什么被折叠?



