前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >stm32h7串口dma发送_串口通信流程

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

作者头像
全栈程序员站长
发布2022-09-21 10:18:27
1.1K0
发布2022-09-21 10:18:27
举报

大家好,又见面了,我是你们的朋友全栈君。

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

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

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

调试过程中使用的文件:

代码语言:javascript
复制
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行左右的位置,我们可以发现如下代码:

代码语言:javascript
复制
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
};

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

代码语言:javascript
复制
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串口初始化启动,相当于使能。

代码语言:javascript
复制
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

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档