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

2022-09-21 10:18:27 浏览数 (1)

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

我们知道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

0 人点赞