京微齐力M7 串口程序应用详解
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2.4 测试结果
通过 PC 端的串口助手,我们可以收到串口中断服务程序发送回来的数据,我们可以验证一下,数据是否一致。 串口助手收到的数据如下:
2.5 程序源码
2.5.1 Keil 部分的程序源码
#include <stdio.h> #include "cmem7_includes.h" #include "system_cmem7.h"
文件名称 cmem7_uart.c cmem7_uart.h
功能 UART 相关函数(驱动)程序文件 UART 相关函数的头文件
cmem7_uart_retarget.c
Printf 函数调用转换函数包含在这个文件里面
2.2 串口驱动使用方法:
1)定义 UART Type 变量 2)初始化 UART 端口 3)使能 UART 端口 // 发送数据 4)调用发送数据驱动(函数),发送数据。
备注: 不同的驱动库版本里面的该函数名称可能不同,比如有的版本里面该函数为 UART_Cmd
// 发送数据 // 由于我们已经引进了 文件,则可以直接调用 pintf 函数,进行串口的打印输出。
printf("\nSet ALL GPIO_OUT to High\n"); // 也可以通过 UART_Write 函数直接通过串口发送数据,如下:
// Enable UART INT UART_EnableInt(UART2, 0x020, TRUE); 然后编写串口中断服务程序 void UART2_IRQHandler(void) { unsigned char tmp; if(UART2->STATUS_b.RNE) {
tmp= (UART2->RX_BUF & 0x00FF); UART_Write(PRINT_UART,1,&tmp); } }
备注: 不同的驱动库版本里面的 UART Type 的结构体不同,主要区别在于 UART_LoopBack 等参数,如果编译不能 通过,则可以通过查看 Cmem7.h 文件中相应的结构体定义,做相应的修改即可。
// 使能 UART 端口,使能完成之后,该 UART 端口就具备了随时接收和发送数据的能力了。 UART_Enable(PRINT_UART, TRUE);
/* Enable the USART2 Interrupt */ NVIC_InitStructure.NVIC_IRQChannel = UART2_INT_IRQn; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; NVIC_InitStructure.NVIC_IRQChannelCmd = TRUE; NVIC_Init(&NVIC_InitStructure);
ch = “I”'; UART_Write(PRINT_UART, 1, &ch);
Hale Waihona Puke 2.3 串口中断接收数据首先需要初始化串口中断 NVIC_InitTypeDef NVIC_InitStructure; memset(&NVIC_InitStructure, 0, sizeof(NVIC_InitStructure)); /* Configure the NVIC Preemption Priority Bits */ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
2.5.1 Keil 部分的程序源码..................................................................................................................................................7 2.5.2 Fuxi 部分的源码....................................................................................................................................................... 10
1.1 串口概述................................................................................................................................................................................2 1.2 UART 硬件及配置.................................................................................................................................................................2 2. 串口程序的编写.............................................................................................................................................................................4 2.1 简介........................................................................................................................................................................................4 2.2 串口驱动使用方法:............................................................................................................................................................5 2.3 串口中断接收数据...............................................................................................................................................................6 2.4 测试结果...............................................................................................................................................................................6 2.5 程序源码...............................................................................................................................................................................7
1.2 UART 硬件及配置
M7 内置的 Cortex-M3 有三个串口,他们都是遵循同样的使用方法及原则设计的,所不同的是 UART2 的管脚是定义 死的,不可以配置,也不需要配置,其他两个 UART: UART0,UART1 是需要管脚配置的,这个需要用户根据实际的电 路图进行连接配置:
本文测试用例使用 京微齐力 M7 L144 开发板作为硬件开发平台。
版本 V1.0
撰写者 Jacky Xie
时间 2020-11-25
备注 初稿
1. UART 简单说明
1.1 串口概述
本文件适用范围: 京微齐力 M7 系列 FPGA。
串口是单片机类产品的基本配置,在计算机领域已经存在了很多年了,本文的串口指的是非标准串口,即简单的串 口(Vcc, GND, RX,TX 这种四线甚至是三线: GND, RX ,TX ),电平可以是 RS232 电平,也可以是 TLL 电平,这个具体看板 子上的电平处理部分,M7 输出的是 TLL 电平,而非标准的 RS232 电平,请注意,部分 MAX3232 芯片的输出是 RS422 电平或者说逻辑关系。有时会造成和 PC 通信不上的问题。
京微齐力使用自己的 EDA 工具 Fuxi (该软件可以自行从官网下载),参考程序如下: 定义连线: 连接到 CortexM3(例化)
I/O Editor 内容如下:
编译通过后硬件部分就算是完成,开发板需要通过 USB 接口连接到电脑,电脑端通过串口调试助手接收数据。 开发板上要通过短接线将 M7 的 TX 与 PC 的 RX 进行连接,图示如下:(类似的,将 M7.RX----PC.TX 连接)
串口主要用于和外部设备如:PC,其他嵌入式系统,其他板载系统,芯片通信;也可以用来做在线升级,系统调 试信息打印调试等功能,因此对于工程师来讲是必须要掌握的一个技能。
串口程序的实现 第一种就是轮询,通过软件不断的去查询 RX buf,然后把数据放到缓存里面去。 第二种就是利用中断服务程序,在中断服务里面处理串口数据的接收。 发送部分比较简单,直接调用发送函数,直接发送即可。
M7 串口程序应用详解
目录 1. UART 简单说明................................................................................................................................................................................ 2
在 TOP Module 里面需要定义输入/输出端口如下:
实际的电路图对应关系如下:
UART2 在 FPGA 内部已经连接好了固定的管脚,因此不可以更改,UART1,UART0 我们自己可以随意分配管脚(用 wire 将 Cortex-M3 的 UART0 及 UART1 相应输入输出与 PAD 管脚相连即可)
串口助手图示如下:
串口设置: 根据 Main.c 里面的串口设置进行配置,本处列出来串口的配置信息,供参考:
2. 串口程序的编写
2.1 简介
我们做完硬件部分的工作之后,就开始做软件部分的工作了 软件环境: Keil5 ,版本号:V5.26.2.0 (Keil-Help-About 即可查看) 硬件环境: 京微齐力 M7L144 EVB Board, 5V 电源, 京微齐力专用 JTAG 下载调试器。 首先介绍一下用到的相关文件,及其功能说明:
// 利用中断服务程序接收数据 5)编写串口中断程序 6)打开串口中断
下面结合程序做说明: // 定义 UART Type 变量 UART_InitTypeDef init; // 初始化 UART 端口,首先给 UART Type 结构体赋初值。 init.UART_BaudRate = 38400; init.UART_StopBits = UART_StopBits_1; init.UART_Parity = UART_Parity_None; init.UART_LoopBack = FALSE; init.UART_RxEn = TRUE; init.UART_CtsEn = FALSE; //调用初始化函数对相应的端口进行初始化 UART_Init(UART0, &init); //初始化 UART0
通过 PC 端的串口助手,我们可以收到串口中断服务程序发送回来的数据,我们可以验证一下,数据是否一致。 串口助手收到的数据如下:
2.5 程序源码
2.5.1 Keil 部分的程序源码
#include <stdio.h> #include "cmem7_includes.h" #include "system_cmem7.h"
文件名称 cmem7_uart.c cmem7_uart.h
功能 UART 相关函数(驱动)程序文件 UART 相关函数的头文件
cmem7_uart_retarget.c
Printf 函数调用转换函数包含在这个文件里面
2.2 串口驱动使用方法:
1)定义 UART Type 变量 2)初始化 UART 端口 3)使能 UART 端口 // 发送数据 4)调用发送数据驱动(函数),发送数据。
备注: 不同的驱动库版本里面的该函数名称可能不同,比如有的版本里面该函数为 UART_Cmd
// 发送数据 // 由于我们已经引进了 文件,则可以直接调用 pintf 函数,进行串口的打印输出。
printf("\nSet ALL GPIO_OUT to High\n"); // 也可以通过 UART_Write 函数直接通过串口发送数据,如下:
// Enable UART INT UART_EnableInt(UART2, 0x020, TRUE); 然后编写串口中断服务程序 void UART2_IRQHandler(void) { unsigned char tmp; if(UART2->STATUS_b.RNE) {
tmp= (UART2->RX_BUF & 0x00FF); UART_Write(PRINT_UART,1,&tmp); } }
备注: 不同的驱动库版本里面的 UART Type 的结构体不同,主要区别在于 UART_LoopBack 等参数,如果编译不能 通过,则可以通过查看 Cmem7.h 文件中相应的结构体定义,做相应的修改即可。
// 使能 UART 端口,使能完成之后,该 UART 端口就具备了随时接收和发送数据的能力了。 UART_Enable(PRINT_UART, TRUE);
/* Enable the USART2 Interrupt */ NVIC_InitStructure.NVIC_IRQChannel = UART2_INT_IRQn; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; NVIC_InitStructure.NVIC_IRQChannelCmd = TRUE; NVIC_Init(&NVIC_InitStructure);
ch = “I”'; UART_Write(PRINT_UART, 1, &ch);
Hale Waihona Puke 2.3 串口中断接收数据首先需要初始化串口中断 NVIC_InitTypeDef NVIC_InitStructure; memset(&NVIC_InitStructure, 0, sizeof(NVIC_InitStructure)); /* Configure the NVIC Preemption Priority Bits */ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
2.5.1 Keil 部分的程序源码..................................................................................................................................................7 2.5.2 Fuxi 部分的源码....................................................................................................................................................... 10
1.1 串口概述................................................................................................................................................................................2 1.2 UART 硬件及配置.................................................................................................................................................................2 2. 串口程序的编写.............................................................................................................................................................................4 2.1 简介........................................................................................................................................................................................4 2.2 串口驱动使用方法:............................................................................................................................................................5 2.3 串口中断接收数据...............................................................................................................................................................6 2.4 测试结果...............................................................................................................................................................................6 2.5 程序源码...............................................................................................................................................................................7
1.2 UART 硬件及配置
M7 内置的 Cortex-M3 有三个串口,他们都是遵循同样的使用方法及原则设计的,所不同的是 UART2 的管脚是定义 死的,不可以配置,也不需要配置,其他两个 UART: UART0,UART1 是需要管脚配置的,这个需要用户根据实际的电 路图进行连接配置:
本文测试用例使用 京微齐力 M7 L144 开发板作为硬件开发平台。
版本 V1.0
撰写者 Jacky Xie
时间 2020-11-25
备注 初稿
1. UART 简单说明
1.1 串口概述
本文件适用范围: 京微齐力 M7 系列 FPGA。
串口是单片机类产品的基本配置,在计算机领域已经存在了很多年了,本文的串口指的是非标准串口,即简单的串 口(Vcc, GND, RX,TX 这种四线甚至是三线: GND, RX ,TX ),电平可以是 RS232 电平,也可以是 TLL 电平,这个具体看板 子上的电平处理部分,M7 输出的是 TLL 电平,而非标准的 RS232 电平,请注意,部分 MAX3232 芯片的输出是 RS422 电平或者说逻辑关系。有时会造成和 PC 通信不上的问题。
京微齐力使用自己的 EDA 工具 Fuxi (该软件可以自行从官网下载),参考程序如下: 定义连线: 连接到 CortexM3(例化)
I/O Editor 内容如下:
编译通过后硬件部分就算是完成,开发板需要通过 USB 接口连接到电脑,电脑端通过串口调试助手接收数据。 开发板上要通过短接线将 M7 的 TX 与 PC 的 RX 进行连接,图示如下:(类似的,将 M7.RX----PC.TX 连接)
串口主要用于和外部设备如:PC,其他嵌入式系统,其他板载系统,芯片通信;也可以用来做在线升级,系统调 试信息打印调试等功能,因此对于工程师来讲是必须要掌握的一个技能。
串口程序的实现 第一种就是轮询,通过软件不断的去查询 RX buf,然后把数据放到缓存里面去。 第二种就是利用中断服务程序,在中断服务里面处理串口数据的接收。 发送部分比较简单,直接调用发送函数,直接发送即可。
M7 串口程序应用详解
目录 1. UART 简单说明................................................................................................................................................................................ 2
在 TOP Module 里面需要定义输入/输出端口如下:
实际的电路图对应关系如下:
UART2 在 FPGA 内部已经连接好了固定的管脚,因此不可以更改,UART1,UART0 我们自己可以随意分配管脚(用 wire 将 Cortex-M3 的 UART0 及 UART1 相应输入输出与 PAD 管脚相连即可)
串口助手图示如下:
串口设置: 根据 Main.c 里面的串口设置进行配置,本处列出来串口的配置信息,供参考:
2. 串口程序的编写
2.1 简介
我们做完硬件部分的工作之后,就开始做软件部分的工作了 软件环境: Keil5 ,版本号:V5.26.2.0 (Keil-Help-About 即可查看) 硬件环境: 京微齐力 M7L144 EVB Board, 5V 电源, 京微齐力专用 JTAG 下载调试器。 首先介绍一下用到的相关文件,及其功能说明:
// 利用中断服务程序接收数据 5)编写串口中断程序 6)打开串口中断
下面结合程序做说明: // 定义 UART Type 变量 UART_InitTypeDef init; // 初始化 UART 端口,首先给 UART Type 结构体赋初值。 init.UART_BaudRate = 38400; init.UART_StopBits = UART_StopBits_1; init.UART_Parity = UART_Parity_None; init.UART_LoopBack = FALSE; init.UART_RxEn = TRUE; init.UART_CtsEn = FALSE; //调用初始化函数对相应的端口进行初始化 UART_Init(UART0, &init); //初始化 UART0