stm32h7串口dma发送_串口通信流程

stm32h7串口dma发送_串口通信流程我们知道DM368有两个串口,UART0和UART1。但是UART0默认为调试串口,也就是说一般不用这个作为通信串口,此刻UART1就成为了DM368和上位机通信的唯一选择。官方文档表明,UART0和UART1都已经配置好了,并且不需要修改任何代码就可以直接使用,但是实际操作过程中,保证通信程序完全没有问题的情况下,并不能完成通信。这就让我不得不怀疑,UART1是不是确确实实的使能了?到底是可

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

我们知道DM368有两个串口,UART0和UART1。但是UART0默认为调试串口,也就是说一般不用这个作为通信串口,此刻UART1就成为了DM368和上位机通信的唯一选择。

官方文档表明,UART0和UART1都已经配置好了,并且不需要修改任何代码就可以直接使用,但是实际操作过程中,保证通信程序完全没有问题的情况下,并不能完成通信。这就让我不得不怀疑,UART1是不是确确实实的使能了?到底是可以收到数据而不能发送数据?还是可以发送数据不能接收数据?于是,我在硬件工程师(项目组里面另一个资深工程师,我就是一个菜鸟)的指导下,开始从IO管脚寻找问题所在

我使用的平台:
Ubuntu10.04 + ti-dvsdk_dm368-evm_4_02_00_06 + dm368_EVM

调试过程中使用的文件:

1.TMS320DM36x Digital Media System-on-Chip(DMSoC) ARM Subsystem.pdf
2. ti-dvsdk_dm368-evm_4_02_00_06/psp/linux-2.6.32.17-psp03.01.01.39/arch/arm/mach-davinci/dm365.c
3. ti-dvsdk_dm368-evm_4_02_00_06/psp/linux-2.6.32.17-psp03.01.01.39/arch/arm/mach-davinci/board-dm365-evm.c

具体操作:
1 . 查看上述PDF文件,搜索PINMUX3。这里的PINMUX代表管脚复用意思,dm368里面一共有4个管脚复用设置寄存器。但是,我们只需要修改PINMUX3这个寄存器即可。想必现在大家已经猜到了,UART1通信失败的原因了,其实就是管脚复用没有设置,导致UART1所用的引脚处于其他功能之下。
这里写图片描述
我们可以明显的看到,UART0和1都在这个寄存器设置。红色的框框看一下有利于后面的设置。

2 . 在这个寄存器中寻找到UART1所使用的具体管脚。
这里写图片描述
IO口16-15管UART1的发送数据;IO口18-17管UART1的接受数据。同时第三列代表PINMUX3的这一位需要设置的值。两个value都必须设置为2.

3.接下来就是在dm356.c文件里面修改我们刚刚寻找到的值。
大概在483行左右的位置,我们可以发现如下代码:

static const struct mux_config dm365_pins[] = {
#ifdef CONFIG_DAVINCI_MUX
MUX_CFG(DM365,	MMCSD0,	0,   24,     1,	  0,	 false)
MUX_CFG(DM365,	SD1_CLK,	0,   16,    3,	  1,	 false)
MUX_CFG(DM365,	SD1_CMD,	4,   30,    3,	  1,	 false)
MUX_CFG(DM365,	SD1_DATA3,	4,   28,    3,	  1,	 false)
MUX_CFG(DM365,	SD1_DATA2,	4,   26,    3,	  1,	 false)
MUX_CFG(DM365,	SD1_DATA1,	4,   24,    3,	  1,	 false)
MUX_CFG(DM365,	SD1_DATA0,	4,   22,    3,	  1,	 false)
MUX_CFG(DM365,	I2C_SDA,	3,   23,    3,	  2,	 false)
MUX_CFG(DM365,	I2C_SCL,	3,   21,    3,	  2,	 false)
MUX_CFG(DM365,	AEMIF_AR,	2,   0,     3,	  1,	 false)
MUX_CFG(DM365,	AEMIF_A3,	2,   2,     3,	  1,	 false)
MUX_CFG(DM365,	AEMIF_A7,	2,   4,     3,	  1,	 false)
MUX_CFG(DM365,	AEMIF_D15_8,	2,   6,     1,	  1,	 false)
MUX_CFG(DM365,	AEMIF_CE0,	2,   7,     1,	  0,	 false)
MUX_CFG(DM365,	MCBSP0_BDX,	0,   23,    1,	  1,	 false)
MUX_CFG(DM365,	MCBSP0_X,	0,   22,    1,	  1,	 false)
MUX_CFG(DM365,	MCBSP0_BFSX,	0,   21,    1,	  1,	 false)
MUX_CFG(DM365,	MCBSP0_BDR,	0,   20,    1,	  1,	 false)
MUX_CFG(DM365,	MCBSP0_R,	0,   19,    1,	  1,	 false)
MUX_CFG(DM365,	MCBSP0_BFSR,	0,   18,    1,	  1,	 false)
MUX_CFG(DM365,	SPI0_SCLK,	3,   28,    1,    1,	 false)
MUX_CFG(DM365,	SPI0_SDI,	3,   26,    3,    1,	 false)
MUX_CFG(DM365,	SPI0_SDO,	3,   25,    1,    1,	 false)
MUX_CFG(DM365,	SPI0_SDENA0,	3,   29,    3,    1,	 false)
MUX_CFG(DM365,	SPI0_SDENA1,	3,   26,    3,    2,	 false)
MUX_CFG(DM365,	UART0_RXD,	3,   20,    1,    1,	 false)
MUX_CFG(DM365,	UART0_TXD,	3,   19,    1,    1,	 false)
//下面两行本来是红色背景的,网页上不能显示XXXXXX
MUX_CFG(DM365,	UART1_RXD,	3,   17,    3,    2,	 false)
MUX_CFG(DM365,     UART1_TXD,    3,   15,    3,    2,  false)
//上面两行本来是红色背景的,网页上不能显示XXXXXXXXX
//MUX_CFG(DM365,	UART1_TXD,	3,   15,    3,    2,	 false)
//MUX_CFG(DM365,	UART1_RTS,	3,   23,    3,    1,	 false)
//MUX_CFG(DM365,	UART1_CTS,	3,   21,    3,    1,	 false)
//MUX_CFG(DM365,  EMAC_TX_EN,	3,   17,    3,    1,  false)
//MUX_CFG(DM365,  EMAC_TX_CLK,	3,   15,    3,    1,  false)
MUX_CFG(DM365,  EMAC_COL,	3,   14,    1,    1,     false)
MUX_CFG(DM365,  EMAC_TXD3,	3,   13,    1,    1,     false)
MUX_CFG(DM365,  EMAC_TXD2,	3,   12,    1,    1,     false)
MUX_CFG(DM365,  EMAC_TXD1,	3,   11,    1,    1,     false)
MUX_CFG(DM365,  EMAC_TXD0,	3,   10,    1,    1,     false)
MUX_CFG(DM365,  EMAC_RXD3,	3,   9,     1,    1,     false)
MUX_CFG(DM365,  EMAC_RXD2,	3,   8,     1,    1,     false)
MUX_CFG(DM365,  EMAC_RXD1,	3,   7,     1,    1,     false)
MUX_CFG(DM365,  EMAC_RXD0,	3,   6,     1,    1,     false)
MUX_CFG(DM365,  EMAC_RX_CLK,	3,   5,     1,    1, false)
MUX_CFG(DM365,  EMAC_RX_DV,	3,   4,     1,    1,     false)
MUX_CFG(DM365,  EMAC_RX_ER,	3,   3,     1,    1,     false)
MUX_CFG(DM365,  EMAC_CRS,	3,   2,     1,    1,     false)
MUX_CFG(DM365,  EMAC_MDIO,	3,   1,     1,    1,     false)
MUX_CFG(DM365,  EMAC_MDCLK,	3,   0,     1,    1, false)
MUX_CFG(DM365,	KEYSCAN,	2,   0,     0x3f, 0x3f,  false)
MUX_CFG(DM365,	PWM0,		1,   0,     3,    2,     false)
MUX_CFG(DM365,	PWM0_G23,	3,   26,    3,    3,     false)
MUX_CFG(DM365,	PWM1,		1,   2,     3,    2,     false)
//MUX_CFG(DM365,	PWM1_G25,	3,   29,    3,    2,     false)
MUX_CFG(DM365,	PWM2_G87,	1,   10,    3,    2,     false)
MUX_CFG(DM365,	PWM2_G88,	1,   8,     3,    2,     false)
MUX_CFG(DM365,	PWM2_G89,	1,   6,     3,    2,     false)
MUX_CFG(DM365,	PWM2_G90,	1,   4,     3,    2,     false)
MUX_CFG(DM365,	PWM3_G80,	1,   20,    3,    3,     false)
MUX_CFG(DM365,	PWM3_G81,	1,   18,    3,    3,     false)
MUX_CFG(DM365,	PWM3_G85,	1,   14,    3,    2,     false)
MUX_CFG(DM365,	PWM3_G86,	1,   12,    3,    2,     false)
MUX_CFG(DM365,	SPI1_SCLK,	4,   2,     3,    1,	 false)
MUX_CFG(DM365,	SPI1_SDI,	3,   31,    1,    1,	 false)
MUX_CFG(DM365,	SPI1_SDO,	4,   0,     3,    1,	 false)
MUX_CFG(DM365,	SPI1_SDENA0,	4,   4,     3,    1,	 false)
MUX_CFG(DM365,	SPI1_SDENA1,	4,   0,     3,    2,	 false)
MUX_CFG(DM365,	SPI2_SCLK,	4,   10,    3,    1,	 false)
MUX_CFG(DM365,	SPI2_SDI,	4,   6,     3,    1,	 false)
MUX_CFG(DM365,	SPI2_SDO,	4,   8,     3,    1,	 false)
MUX_CFG(DM365,	SPI2_SDENA0,	4,   12,    3,    1,	 false)
MUX_CFG(DM365,	SPI2_SDENA1,	4,   8,     3,    2,	 false)
MUX_CFG(DM365,	SPI3_SCLK,	0,   0,	    3,    2,	 false)
MUX_CFG(DM365,	SPI3_SDI,	0,   2,     3,    2,	 false)
MUX_CFG(DM365,	SPI3_SDO,	0,   6,     3,    2,	 false)
MUX_CFG(DM365,	SPI3_SDENA0,	0,   4,     3,    2,	 false)
MUX_CFG(DM365,	SPI3_SDENA1,	0,   6,     3,    3,	 false)
MUX_CFG(DM365,	SPI4_SCLK,	4,   18,    3,    1,	 false)
MUX_CFG(DM365,	SPI4_SDI,	4,   14,    3,    1,	 false)
MUX_CFG(DM365,	SPI4_SDO,	4,   16,    3,    1,	 false)
MUX_CFG(DM365,	SPI4_SDENA0,	4,   20,    3,    1,	 false)
MUX_CFG(DM365,	SPI4_SDENA1,	4,   16,    3,    2,	 false)
/*MUX_CFG(DM365,	GPIO20,		3,   21,    3,    0,	 false)*/
/*  I2C_SCL for camera interface*/
MUX_CFG(DM365,	GPIO31,		4,   8,    3,	  0,	 false)
MUX_CFG(DM365,	GPIO33,		4,   12,    3,	  0,	 false)
MUX_CFG(DM365,	GPIO36,		4,   18,    3,	  0,	 false)
/*MUX_CFG(DM365,	GPIO40,		4,   26,    3,	  0,	 false)*/
MUX_CFG(DM365,  GPIO66,   2,   0,     3,    0,     false)
//MUX_CFG(DM365,	GPIO80,		1,   20,    3,	  1,	 false)
MUX_CFG(DM365,	GPIO82,		1,   17,    1,    1,     false)
MUX_CFG(DM365,	VCLK,		1,   22,    1,    0,     false)
MUX_CFG(DM365,  CLKOUT1,        4,   16,    3,    3,     false)
MUX_CFG(DM365,  VOUT_B0,        4,   0,     3,    3,     false)
MUX_CFG(DM365,  VOUT_B1,        4,   2,     3,    3,     false)
MUX_CFG(DM365,  VOUT_B2,        1,   20,    3,    2,     false)
MUX_CFG(DM365,  VOUT_G0,        4,   4,     3,    3,     false)
MUX_CFG(DM365,  VOUT_G1,        4,   6,     3,    3,     false)
MUX_CFG(DM365,  VOUT_R0,        4,   10,    3,    3,     false)
MUX_CFG(DM365,  VOUT_R1,        4,   12,    3,    3,     false)
MUX_CFG(DM365,  VOUT_R2,        1,   18,    3,    2,     false)
MUX_CFG(DM365,  VOUT_LCD_OE,    1,   17,    1,    0,     false)
MUX_CFG(DM365,  VOUT_FIELD,     1,   18,    3,    1,     false)
MUX_CFG(DM365,  VOUT_FIELD_G81, 1,   18,    3,    0,     false)
MUX_CFG(DM365,  VOUT_HVSYNC,    1,   16,    1,    0,     false)
MUX_CFG(DM365,  VOUT_COUTL_EN,  1,   0,     0xff, 0x55,  false)
MUX_CFG(DM365,  VOUT_COUTH_EN,  1,   8,     0xff, 0x55,  false)
MUX_CFG(DM365,  VIN_CAM_WEN,    0,   14,    3,    0,     false)
MUX_CFG(DM365,  VIN_CAM_VD,     0,   13,    1,    0,     false)
MUX_CFG(DM365,  VIN_CAM_HD,     0,   12,    1,    0,     false)
MUX_CFG(DM365,  VIN_YIN4_7_EN,  0,   0,     0xff, 0,     false)
MUX_CFG(DM365,  VIN_YIN0_3_EN,  0,   8,     0xf,  0,     false)
INT_CFG(DM365,  INT_EDMA_CC,         2,     1,    1,     false)
INT_CFG(DM365,  INT_EDMA_TC0_ERR,    3,     1,    1,     false)
INT_CFG(DM365,  INT_EDMA_TC1_ERR,    4,     1,    1,     false)
INT_CFG(DM365,  INT_EDMA_TC2_ERR,    22,    1,    1,     false)
INT_CFG(DM365,  INT_EDMA_TC3_ERR,    23,    1,    1,     false)
INT_CFG(DM365,  INT_PRTCSS,          10,    1,    1,     false)
INT_CFG(DM365,  INT_EMAC_RXTHRESH,   14,    1,    1,     false)
INT_CFG(DM365,  INT_EMAC_RXPULSE,    15,    1,    1,     false)
INT_CFG(DM365,  INT_EMAC_TXPULSE,    16,    1,    1,     false)
INT_CFG(DM365,  INT_EMAC_MISCPULSE,  17,    1,    1,     false)
INT_CFG(DM365,  INT_IMX0_ENABLE,     0,     1,    0,     false)
INT_CFG(DM365,  INT_IMX0_DISABLE,    0,     1,    1,     false)
INT_CFG(DM365,  INT_HDVICP_ENABLE,   0,     1,    1,     false)
INT_CFG(DM365,  INT_HDVICP_DISABLE,  0,     1,    0,     false)
INT_CFG(DM365,  INT_IMX1_ENABLE,     24,    1,    1,     false)
INT_CFG(DM365,  INT_IMX1_DISABLE,    24,    1,    0,     false)
INT_CFG(DM365,  INT_NSF_ENABLE,      25,    1,    1,     false)
INT_CFG(DM365,  INT_NSF_DISABLE,     25,    1,    0,     false)
EVT_CFG(DM365,	EVT2_ASP_TX,         0,     1,    0,     false)
EVT_CFG(DM365,	EVT3_ASP_RX,         1,     1,    0,     false)
#endif
};

在这里解释一下上面每一列所代表的意思,其实也是在另外的文件里面使用架构体定义的:

struct mux_config {
	const char *name;   //平台名字
	const char *mux_reg_name;   // 复用寄存器名字
	const unsigned char mux_reg;   // 使用第几个寄存器
	const unsigned char mask_offset;  // 使用寄存器第几位
	const unsigned char mask;   // 使用多少位来表示
	const unsigned char mode;  // 这里就是我们需要设置的值
	bool debug;   // 是否是调试模式
};

找到我上面标红色的两行,添加!!!然后删除掉同样使用了第三个复用寄存器的15-16,17-18四位的所有语句,就完成了所有的存起修改。

注意:如果你是一个新手,并且对这个过程完全不理解,那么有一条捷径,那就是直接把我上面的结构体代码覆盖你自己的代码。。。

4 . 打开board-dm365-evm.c文件,大概在960行附近,我们可以看到这个函数,在开头位置添加标红的两行。这两行的是意思就是UART1串口初始化启动,相当于使能。

static __init void dm365_evm_init(void)
{
	evm_init_i2c();
	davinci_cfg_reg(DM365_UART1_TXD);
	davinci_cfg_reg(DM365_UART1_RXD);
	davinci_serial_init(&uart_config);
…………
};

5 . 最后一步,回到ti-dvsdk_dm368-evm_4_02_00_06,然后执行make,或者是进入到psp目录下面执行make linux,就可以完成内核的重新编译。…
6 . 剩下的就是制作sd卡启动,在开发板上面测试结果。

zheg

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/170209.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • servu搭建ftp服务器教程_ftp端口映射

    servu搭建ftp服务器教程_ftp端口映射映口映射的功能主要就是实际互联网可以访问当前进行映射的电脑,首先我们要进行路由器的端口映射,常见的开放端口有80,21,3389等,80是网站常用端口,21是FTP服务器常用端口,3389是远程桌面连接端口。下面为大家详细讲解端口映射的具体方法!1,首先我们要了解路由器的配置介面的IP地址,常用的是192.168.0.1或192.168.1.1,假如你不知道自己的路由器的配置页面的IP

  • 程序驱动的环境需求

    程序驱动的环境需求

  • 零拷贝原理详解_多路复用的基本原理是什么

    零拷贝原理详解_多路复用的基本原理是什么引言传统的Linux操作系统的标准I/O接口是基于数据拷贝操作的,即I/O操作会导致数据在操作系统内核地址空间的缓冲区和应用程序地址空间定义的缓冲区之间进行传输。这样做最大的好处是可以减少磁盘I/O的操作,因为如果所请求的数据已经存放在操作系统的高速缓冲存储器中,那么就不需要再进行实际的物理磁盘I/O操作。但是数据传输过程中的数据拷贝操作却导致了极大的CPU开销,限制了操…

  • Python range() 函数用法

    Python range() 函数用法Python内置函数pythonrange()函数可创建一个整数列表,一般用在for循环中。函数语法参数说明:start:计数从start开始。默认是从0开始。例如rang

  • 给intellij IDEA设置背景颜色[通俗易懂]

    设置背景颜色有两种方法,接下来我给大家介绍一下第一种方法:先打开intellijIDEA之后在File再点Settings(如图)

  • pthreads php 安装全过程(二)

    pthreads php 安装全过程(二)

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号