一种串口拓展方式、使用CH438芯片做并口转八串口

引言

最近在做一个智能垃圾桶的项目,小区用的那种不是家里面的那种哈,由于需要四个垃圾桶,所以挂载多个模组就是一个比较麻烦的事情,一般STM32的芯片最多就只有八个串口,所以选择拓展串口的方式来做。

主题

使用的是CH438Q串口拓展芯片,芯片是QFP44元引脚的封装,座板也比较好做,或者买一个 同样封装的芯片夹具也可以使用。这里贴一下原理图

因为我这里用的是地址与数据复用模式所以A0          ~A6没用
因为我这里用的是地址与数据复用模式所以A0~A6没用

在这里插入图片描述
这里要注意RST引脚是低电平复位,所以需要上拉 不要悬空

代码部分

我这里使用的是用IO口模拟 当然你也可以用FSMC去做

代码思路
CH438_Init();        //初始化你的引脚
CH438_ResetSeril(5); //复位你的串口
CH438_Uart_Init(5,4800); //配置你的串口
OK进入主题
#include "CH485.h"
#include "delay.h"
#include "usart.h"
  #include "stm32f4xx_hal_eth.h"
#include "string.h"
	#include "sys.h"
#define Fpclk    	    1843200//666600       /* 定义内部时钟频率,默认外部晶振的12分频    */
#define MaxRecvLen    50         	  /* 接收缓冲区大小    */
#define CH438_CONL_PORT    GPIOB
#define CH438_DATA_PORT    GPIOB
#define CH438_DATA_PORT1    GPIO
#define CH438_DATA_PIN     ((uint16_t)0x00FF)	    //数据地址引脚  PB0-7


const unsigned char offsetadd[] = {0x00,0x10,0x20,0x30,0x08,0x18,0x28,0x38,};		/* 串口号的偏移地址 */
const unsigned char Interruptnum[] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,};	/* SSR寄存器中断号对应值 */
 
unsigned char Revbuff[MaxRecvLen];		/* 接收缓存区 */
unsigned char RevLen;					/* 接收计数 */
 
void SetOutPut(uint16_t GPIO_Pin)  //IO输出模式
{
	GPIO_InitTypeDef CH438_gpio;
	
	CH438_gpio.Pin   = GPIO_Pin;
	CH438_gpio.Speed = GPIO_SPEED_HIGH;
	CH438_gpio.Mode  = GPIO_MODE_OUTPUT_PP;	//推挽输出
	HAL_GPIO_Init(CH438_DATA_PORT, &CH438_gpio);
 
}
void SetInPut(uint16_t GPIO_Pin)//IO输入模式
{
	GPIO_InitTypeDef CH438_gpio;
	
	CH438_gpio.Pin   = GPIO_Pin;
	CH438_gpio.Speed = GPIO_SPEED_HIGH;
	CH438_gpio.Mode  = GPIO_MODE_INPUT;		//上拉输入
	HAL_GPIO_Init(CH438_DATA_PORT, &CH438_gpio);
}
void CH438_Init() //IO口中断等初始化
{
  	GPIO_InitTypeDef GPIO_InitStructure;

   __HAL_RCC_GPIOB_CLK_ENABLE();           //开启GPIOB时钟
	 __HAL_RCC_GPIOD_CLK_ENABLE();           //开启GPIOB时钟

	GPIO_InitStructure.Mode  = GPIO_MODE_OUTPUT_PP;
	GPIO_InitStructure.Pin   = 0X00FF;
	GPIO_InitStructure.Speed = GPIO_SPEED_MEDIUM;
	HAL_GPIO_Init(CH438_DATA_PORT,&GPIO_InitStructure);
	
	
	GPIO_InitStructure.Pin  = GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7;
	HAL_GPIO_Init(GPIOD,&GPIO_InitStructure);
	
	GPIO_InitStructure.Mode = GPIO_MODE_IT_FALLING;	
	GPIO_InitStructure.Pin  = GPIO_PIN_2;
	HAL_GPIO_Init(GPIOD,&GPIO_InitStructure);
	
	HAL_NVIC_SetPriority(EXTI2_IRQn,2,1);       //抢占优先级为2,子优先级为1
  HAL_NVIC_EnableIRQ(EXTI2_IRQn);             //使能中断线2

    AMOD = 1;
 
}
 
//中断服务函数
void EXTI2_IRQHandler(void)
{
    HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_2);//调用中断处理公用函数
}
//中断服务程序中需要做的事情
//在HAL库中所有的外部中断服务函数都会调用此函数
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
    if(GPIO_Pin == GPIO_PIN_2)
		{
			u8 gInterruptStatus;
			u8 InterruptStatus;
			u8 i;
		
					gInterruptStatus = CH438ReadReg( REG_SSR_ADDR );
					//printf("\r\nSSR: %02x\r\n",gInterruptStatus );
					if(!gInterruptStatus)
					{ 
						__HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin);
						return ;
					}				
						for(i=0; i<8; i++)
					{
						if( gInterruptStatus & Interruptnum[i] )    /* 检测哪个串口发生中断 */
						{
							InterruptStatus = CH438ReadReg( offsetadd[i] | REG_IIR_ADDR ) & 0x0f;    /* 读串口的中断状态 */	
								//printf("\r\nInterruptStatus: %02x\r\n",InterruptStatus );
							switch( InterruptStatus )
							{
								case INT_NOINT:			/* 没有中断 */					
									break;
								case INT_THR_EMPTY:		/* THR空中断 */						
									break;
								case INT_RCV_OVERTIME:	/* 接收超时中断 */
								
									RevLen = CH438_RecvDatas(i, Revbuff);					
									CH438_SendDatas(i, Revbuff, RevLen);
									
								printf("USART:%d ->",i);
								 printf("DATA:%s\r\n",Revbuff );
								 memset(Revbuff,0,RevLen);
									break;
								case INT_RCV_SUCCESS:	/* 接收数据可用中断 */
									RevLen = CH438_RecvDatas(i, Revbuff);
									CH438_SendDatas(i, Revbuff, RevLen);
									break;
								case INT_RCV_LINES:		/* 接收线路状态中断 */
									CH438ReadReg( offsetadd[i] | REG_LSR_ADDR );
									break;
								case INT_MODEM_CHANGE:	/* MODEM输入变化中断 */
									CH438ReadReg( offsetadd[i] | REG_MSR_ADDR );
									break;
								default:
									break;
		 
							}
						}
					}
												
		}
	
}
void CH438WriteReg(u8 add,u8 data)  //写一个字节到寄存器
{
	
	//CH438_DATA_PORT->ODR = (CH438_DATA_PORT->ODR&0XFF00);

	CS = 1;
	WR = 1;
	RD = 1;
	SetOutPut(CH438_DATA_PIN);
	CH438_DATA_PORT->ODR = (CH438_DATA_PORT->ODR&0XFF00)|add; //低八位十数据位确保高八位数据不变  写寄存器地址 
	CS = 0;
	ALE =1;
	delay_us(1);
	ALE = 0;
	
	CH438_DATA_PORT->ODR = (CH438_DATA_PORT->ODR&0XFF00)|data; //写数据
	WR =0 ;
	delay_us(1);
	WR =1;
	CS =1;
}
 
 
u8 CH438ReadReg(u8 add) //读取一个字节
{
	u8 value;
	
	CS = 1;
	WR =1;
	RD =1;
	SetOutPut(CH438_DATA_PIN);   //
	CS = 0;
	ALE =1;

	CH438_DATA_PORT->ODR = (CH438_DATA_PORT->ODR&0XFF00)|add;
	ALE = 0;
	SetInPut(CH438_DATA_PIN);
	RD = 0;
	value = (uint8_t)CH438_DATA_PORT->IDR;
	
 
	RD =1;
	CS =1;
	//printf("value: %02x\r\n",value);
	return value;
}
 
unsigned char CH438_CheckIIR(unsigned char num)
{
	unsigned char value;
	
	value = CH438ReadReg( offsetadd[num] | REG_IIR_ADDR );
	return value;
}
void CH438_CloseSeril(unsigned char num) //关闭某位串口
{
	CH438WriteReg(offsetadd[num]|REG_IER_ADDR, BIT_IER_LOWPOWER);
}
 
void CH438_CloseALLSeril(void) //关闭所有串口
{
	CH438WriteReg(offsetadd[0]|REG_IER_ADDR, BIT_IER_LOWPOWER|BIT_IER_SLP);
}
void CH438_ResetSeril(unsigned char num) //复位串口
{
	CH438WriteReg(offsetadd[num]|REG_IER_ADDR, BIT_IER_RESET);
}
void CH438_SetBandrate(unsigned char num, unsigned long value)//设置波特率 未使用此函数
{

	uint16_t bandspeed;
	
	bandspeed = Fpclk/16/value;
  CH438WriteReg(offsetadd[num]|REG_LCR_ADDR, BIT_LCR_DLAB );  
	CH438WriteReg(offsetadd[num]|REG_DLL_ADDR, (uint8_t)bandspeed);
	CH438WriteReg(offsetadd[num]|REG_DLM_ADDR, (uint8_t)(bandspeed>>8));
	
 
	printf("bandrate: %d\r\n", bandspeed);
	printf("DLM: %d\r\n", CH438ReadReg(offsetadd[num]|REG_DLM_ADDR));
	printf("DLL: %d\r\n", CH438ReadReg(offsetadd[num]|REG_DLL_ADDR));
 
}
void CH438_UARTInit(unsigned char num)//初始化  未使用到
{
	CH438_SetBandrate(num, 9600);	/* CH438串口1波特率设置 */
	CH438_TranConfig(num); 			/* CH438串口1数据格式配置及FIFO大小 */	
}
//发送数据
 
void CH438_SendDatas(unsigned char num, unsigned char* sendbuff,unsigned char len)
{

	while(len)
	{		
		if((CH438ReadReg(offsetadd[num]|REG_LSR_ADDR)&BIT_LSR_TEMT))	    //LSR->THRE==1  保持寄存器空
		{
			CH438WriteReg(offsetadd[num]|REG_THR_ADDR, *sendbuff++);
			len--;
		}
	}
	
}
//接收数据
 
unsigned char CH438_RecvDatas(unsigned char num, unsigned char* revbuff)
{
	uint8_t len=0;
	uint8_t *p_rev;
	
	p_rev = revbuff;
 
	while( ( CH438ReadReg( offsetadd[num]|REG_LSR_ADDR ) & BIT_LSR_DATARDY ) == 0 );    /*等待数据准备好 */
	while((CH438ReadReg(offsetadd[num]|REG_LSR_ADDR)&BIT_LSR_DATARDY))	//LSR->DATARDY==1
	{
		*p_rev = CH438ReadReg(offsetadd[num]|REG_RBR_ADDR);
		p_rev++;
		len++;
	}
	return len;
}
void CH438_TranConfig(unsigned char num)
{	
	/* 发送数据格式:8位数据,无校验,1个停止位  */
	CH438WriteReg(offsetadd[num]|REG_LCR_ADDR, BIT_LCR_WORDSZ1 | BIT_LCR_WORDSZ0);
	/* 设置FIFO模式,触发点为112字节 */
	CH438WriteReg(offsetadd[num]|REG_FCR_ADDR, BIT_FCR_RECVTG1 | BIT_FCR_RECVTG0 | BIT_FCR_FIFOEN);	
	CH438WriteReg(offsetadd[num]|REG_FCR_ADDR,CH438ReadReg(offsetadd[num]|REG_FCR_ADDR)| BIT_FCR_TFIFORST|BIT_FCR_RFIFORST);
}
 
void CH438_INTConfig(unsigned char num)
{	
	/* 注意: CH438打开BIT_IER_IETHRE中断(0->1),会产生一个发生空中断 */	
	CH438WriteReg(offsetadd[num]|REG_IER_ADDR,BIT_IER_IERECV );
	CH438_CheckIIR(num);
	CH438WriteReg(offsetadd[num]|REG_MCR_ADDR, BIT_MCR_OUT2);//    | BIT_MCR_RTS     | BIT_MCR_DTR);//可以产生一个实际的中断	
}
 
void CH438_AutoHFCtrl(unsigned char num)
{
    CH438WriteReg( offsetadd[num]|REG_MCR_ADDR, BIT_MCR_AFE | BIT_MCR_OUT2 | BIT_MCR_RTS );/* 设置MCR寄存器的AFE和RTS为1 */
}

void CH438_RegTEST(unsigned char num)//测试使用的函数
{
 
	printf("current test serilnum:  %02x \r\n",(unsigned short)offsetadd[num]);
	printf("IER: %02x\r\n",(unsigned short)CH438ReadReg(offsetadd[num] | REG_IER_ADDR));//?IER
	printf("IIR: %02x\r\n",(unsigned short)CH438ReadReg(offsetadd[num] | REG_IIR_ADDR));//?IIR
	printf("LCR: %02x\r\n",(unsigned short)CH438ReadReg(offsetadd[num] | REG_LCR_ADDR));//?LCR
	printf("MCR: %02x\r\n",(unsigned short)CH438ReadReg(offsetadd[num] | REG_MCR_ADDR));//?MCR
	printf("LSR: %02x\r\n",(unsigned short)CH438ReadReg(offsetadd[num] | REG_LSR_ADDR));//?LSR
	printf("MSR: %02x\r\n",(unsigned short)CH438ReadReg(offsetadd[num] | REG_MSR_ADDR));//?MSR
//	CH438WriteReg(offsetadd[num] | REG_SCR_ADDR, 0x78);
	printf("SCR: %02x\r\n",(unsigned short)CH438ReadReg(offsetadd[num] | REG_SCR_ADDR));//?SCR
	printf("FCR: %02x\r\n",(unsigned short)CH438ReadReg(offsetadd[num] | REG_FCR_ADDR));//?SCR
	//printf("SSR: %02x\r\n",(unsigned short)CH438ReadReg( offsetadd[num] | REG_SSR_ADDR ));//?SCR
}
//串口初始化函数 输入参数 串口号和波特率
void CH438_Uart_Init(unsigned char num,unsigned long value)
{
 
	uint8_t dlab=0;
	uint16_t bandspeed;
	dlab = CH438ReadReg(offsetadd[num]|REG_IER_ADDR);
	dlab &= 0xDF;
	CH438WriteReg(offsetadd[num]|REG_IER_ADDR, dlab);
	
	dlab = CH438ReadReg(offsetadd[num]|REG_LCR_ADDR);
	dlab |= 0x80;		//置LCR寄存器DLAB位为1
	CH438WriteReg(offsetadd[num]|REG_LCR_ADDR, dlab);
	
	bandspeed = Fpclk/16/value;
	CH438WriteReg(offsetadd[num]|REG_DLL_ADDR, (uint8_t)bandspeed);
	CH438WriteReg(offsetadd[num]|REG_DLM_ADDR, (uint8_t)(bandspeed>>8));
	dlab &= 0x7F;		//置IIR寄存器DLAB位为0
	CH438WriteReg(offsetadd[num]|REG_LCR_ADDR, dlab);
	CH438WriteReg(offsetadd[num]|REG_FCR_ADDR,BIT_FCR_RECVTG1 | BIT_FCR_RECVTG0 | BIT_FCR_FIFOEN );
	CH438WriteReg(offsetadd[num]|REG_LCR_ADDR,BIT_LCR_WORDSZ1 | BIT_LCR_WORDSZ0 );
	//CH438WriteReg(offsetadd[num]|REG_IER_ADDR,BIT_IER_IELINES | BIT_IER_IETHRE | BIT_IER_IERECV);
	//CH438WriteReg(offsetadd[num]|REG_MCR_ADDR,BIT_MCR_OUT2    | BIT_MCR_RTS     | BIT_MCR_DTR);
	CH438WriteReg(offsetadd[num]|REG_FCR_ADDR,CH438ReadReg(offsetadd[num]|REG_FCR_ADDR)| BIT_FCR_TFIFORST|BIT_FCR_RFIFORST);
 //CH438_TranConfig(num);
	CH438_INTConfig(num);
}

自己要注意看官方的文档来选择打开什么中断、我开始遇到问题为什么每次发送都进入中断,因为在初始化的时候开启了发送完成中断,如果初始化的时候只打开了接受中断、那么只有当接受的时候才会触发一次中断,然后我们进入中断去读取IIR寄存器去判断中断类型

#ifndef _CH485_H
#define _CH485_H
#include "sys.h"
#include "delay.h"
#define REG_RBR_ADDR        0x00      /* 串口0接收缓冲寄存器地址 */
#define REG_THR_ADDR        0x00      /* 串口0发送保持寄存器地址 */
#define REG_IER_ADDR        0x01      /* 串口0中断使能寄存器地址 */
#define REG_IIR_ADDR        0x02      /* 串口0中断识别寄存器地址 */
#define REG_FCR_ADDR        0x02      /* 串口0FIFO控制寄存器地址 */
#define REG_LCR_ADDR        0x03      /* 串口0线路控制寄存器地址 */
#define REG_MCR_ADDR        0x04      /* 串口0MODEM控制寄存器地址 */
#define REG_LSR_ADDR        0x05      /* 串口0线路状态寄存器地址 */
#define REG_MSR_ADDR        0x06      /* 串口0MODEM状态寄存器地址 */
#define REG_SCR_ADDR        0x07      /* 串口0用户可定义寄存器地址 */
#define REG_DLL_ADDR        0x00      /* 波特率除数锁存器低8位字节地址 */
#define REG_DLM_ADDR        0x01      /* 波特率除数锁存器高8位字节地址 */
 
/* CH438内部串口0~7 专用状态寄存器 */
 
#define REG_SSR_ADDR        0x4F       /* 专用状态寄存器地址 */
 
 
/* IER寄存器的位 */
 
#define BIT_IER_RESET       0x80      /* 该位置1则软复位该串口 */
#define BIT_IER_LOWPOWER    0x40      /* 该位为1则关闭该串口的内部基准时钟 */
#define BIT_IER_SLP         0x20      /* 串口0是SLP,为1则关闭时钟震荡器 */
#define BIT_IER1_CK2X       0x20      /* 串口1是CK2X,为1则强制将外部时钟信号2倍频后作为内部基准时钟 */
#define BIT_IER_IEMODEM     0x08      /* 该位为1允许MODEM输入状态变化中断 */
#define BIT_IER_IELINES     0x04      /* 该位为1允许接收线路状态中断 */
#define BIT_IER_IETHRE      0x02      /* 该位为1允许发送保持寄存器空中断 */
#define BIT_IER_IERECV      0x01      /* 该位为1允许接收到数据中断 */
 
/* IIR寄存器的位 */
 
#define BIT_IIR_FIFOENS1    0x80
#define BIT_IIR_FIFOENS0    0x40      /* 该2位为1表示起用FIFO */
 
/* 中断类型:0001没有中断,0110接收线路状态中断,0100接收数据可用中断,1100接收数据超时中断,0010THR寄存器空中断,0000MODEM输入变化中断 */
#define BIT_IIR_IID3        0x08
#define BIT_IIR_IID2        0x04	//接受数据可用
#define BIT_IIR_IID1        0x02	//THR寄存器空中断
#define BIT_IIR_NOINT       0x01
 
/* FCR寄存器的位 */
 
/* 触发点: 00对应1个字节,01对应16个字节,10对应64个字节,11对应112个字节 */
#define BIT_FCR_RECVTG1     0x80      /* 设置FIFO的中断和自动硬件流控制的触发点 */
#define BIT_FCR_RECVTG0     0x40      /* 设置FIFO的中断和自动硬件流控制的触发点 */
 
#define BIT_FCR_TFIFORST    0x04      /* 该位置1则清空发送FIFO中的数据 */
#define BIT_FCR_RFIFORST    0x02      /* 该位置1则清空接收FIFO中的数据 */
#define BIT_FCR_FIFOEN      0x01      /* 该位置1则起用FIFO,为0则禁用FIFO */
 
/* LCR寄存器的位 */
 
#define BIT_LCR_DLAB        0x80      /* 为1才能存取DLL,DLM,为0才能存取RBR/THR/IER */
#define BIT_LCR_BREAKEN     0x40      /* 为1则强制产生BREAK线路间隔*/
 
/* 设置校验格式:当PAREN为1时,00奇校验,01偶校验,10标志位(MARK,置1),11空白位(SPACE,清0) */
#define BIT_LCR_PARMODE1    0x20      /* 设置奇偶校验位格式 */
#define BIT_LCR_PARMODE0    0x10      /* 设置奇偶校验位格式 */
 
#define BIT_LCR_PAREN       0x08      /* 为1则允许发送时产生和接收校验奇偶校验位 */
#define BIT_LCR_STOPBIT     0x04      /* 为1则两个停止位,为0一个停止位 */
 
/* 设置字长度:00则5个数据位,01则6个数据位,10则7个数据位,11则8个数据位 */
#define BIT_LCR_WORDSZ1     0x02      /* 设置字长长度 */
#define BIT_LCR_WORDSZ0     0x01
 
/* MCR寄存器的位 */
 
#define BIT_MCR_AFE         0x20      /* 为1允许CTS和RTS硬件自动流控制 */
#define BIT_MCR_LOOP        0x10      /* 为1使能内部回路的测试模式 */
#define BIT_MCR_OUT2        0x08      /* 为1允许该串口的中断请求输出 */
#define BIT_MCR_OUT1        0x04      /* 为用户定义的MODEM控制位 */
#define BIT_MCR_RTS         0x02      /* 该位为1则RTS引脚输出有效 */
#define BIT_MCR_DTR         0x01      /* 该位为1则DTR引脚输出有效 */
 
/* LSR寄存器的位 */
 
#define BIT_LSR_RFIFOERR    0x80      /* 为1表示在接收FIFO中存在至少一个错误 */
#define BIT_LSR_TEMT        0x40      /* 为1表示THR和TSR全空 */
#define BIT_LSR_THRE        0x20      /* 为1表示THR空*/
#define BIT_LSR_BREAKINT    0x10      /* 该位为1表示检测到BREAK线路间隔 */
#define BIT_LSR_FRAMEERR    0x08      /* 该位为1表示读取数据帧错误 */
#define BIT_LSR_PARERR      0x04      /* 该位为1表示奇偶校验错误 */
#define BIT_LSR_OVERR       0x02      /* 为1表示接收FIFO缓冲区溢出 */
#define BIT_LSR_DATARDY     0x01      /* 该位为1表示接收FIFO中有接收到的数据 */
 
/* MSR寄存器的位 */
 
#define BIT_MSR_DCD         0x80      /* 该位为1表示DCD引脚有效 */
#define BIT_MSR_RI          0x40      /* 该位为1表示RI引脚有效 */
#define BIT_MSR_DSR         0x20      /* 该位为1表示DSR引脚有效 */
#define BIT_MSR_CTS         0x10      /* 该位为1表示CTS引脚有效 */
#define BIT_MSR_DDCD        0x08      /* 该位为1表示DCD引脚输入状态发生变化过 */
#define BIT_MSR_TERI        0x04      /* 该位为1表示RI引脚输入状态发生变化过 */
#define BIT_MSR_DDSR        0x02      /* 该位为1表示DSR引脚输入状态发生变化过 */
#define BIT_MSR_DCTS        0x01      /* 该位为1表示CTS引脚输入状态发生变化过 */
 
/* 中断状态码 */
 
#define INT_NOINT           0x01      /* 没有中断 */
#define INT_THR_EMPTY       0x02      /* THR空中断 */
#define INT_RCV_OVERTIME    0x0C      /* 接收超时中断 */
#define INT_RCV_SUCCESS     0x04      /* 接收数据可用中断 */
#define INT_RCV_LINES       0x06      /* 接收线路状态中断 */
#define INT_MODEM_CHANGE    0x00      /* MODEM输入变化中断 */
 
#define CH438_IIR_FIFOS_ENABLED 0xC0  /* 起用FIFO */
 
 
#define WR   PDout(3)
#define ALE  PDout(7)
#define RD   PDout(4)
#define CS   PDout(5)
#define AMOD PDout(6)
#define INT  PDout(1)
void SetOutPut(uint16_t GPIO_Pin);  //IO输出模式
void SetInPut(uint16_t GPIO_Pin);
void CH438_Init(void);
void CH438WriteReg(u8 add,u8 data);
u8 CH438ReadReg(u8 add);
unsigned char CH438_CheckIIR(unsigned char num);
void CH438_CloseSeril(unsigned char num);
void CH438_CloseALLSeril(void);
void CH438_ResetSeril(unsigned char num);
void CH438_SetBandrate(unsigned char num, unsigned long value);
void CH438_UARTInit(unsigned char num);
void CH438_SendDatas(unsigned char num, unsigned char* sendbuff,unsigned char len);
unsigned char CH438_RecvDatas(unsigned char num, unsigned char* revbuff);
void CH438_TranConfig(unsigned char num);
void CH438_INTConfig(unsigned char num);
void CH438_AutoHFCtrl(unsigned char num);
void CH438_RegTEST(unsigned char num);
void CH438_Uart_Init(unsigned char num,unsigned long value);
#endif

效果图

在这里插入图片描述
遇到问题自己多看文档
附上我的工程
https://download.csdn.net/download/qq_36369488/11762005

评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值