GPIO模拟串口

波特率为38400波形图如下,可以看出,一个字节的脉宽为26us.

在72MHZ灵动微MCU上的代码为:

#define TXD_SET		GPIO_SetBits(GPIOB,GPIO_Pin_3)
#define TXD_RESET	GPIO_ResetBits(GPIOB,GPIO_Pin_3)
#define Delay_Simulator_Uart(n) do {volatile unsigned int vi=0,vj=0; for (vi=0; vi<n; vi++)__asm("nop");} while (0)
//往串口写一个字节
unsigned char UART_Simulator_SendByte(unsigned char ch)
{
	TXD_RESET; //发送启始位
	Delay_Simulator_Uart(85);//Delay2cp(39);
	//发送8位数据位
	for (u8 i=8; i; i--)
	{
		if (ch & 0x01)TXD_SET; else TXD_RESET; //先传低位
		Delay_Simulator_Uart(85);//Delay2cp(36);
		ch >>= 1;
	}
	//发送校验位(无)
	TXD_SET; //发送结束位
	Delay_Simulator_Uart(85);//Delay2cp(46);
        Delay_Simulator_Uart(42); // 实际使用时,刚好一个停止位时,会不稳定,有时行,有时不行。
	return ch;
}

代码参考自:《51单片机模拟串口的三种方法》https://blog.csdn.net/abin_gha/article/details/5834254?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-5.control&dist_request_id=&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-5.control

115200时,为

256000时,为3.5us和4.0us之间跳变。

256000时的代码为:

#define TXD_SET		GPIO_SetBits(GPIOB,GPIO_Pin_3)
#define TXD_RESET	GPIO_ResetBits(GPIOB,GPIO_Pin_3)
#define Delay_Simulator_Uart(n) do {volatile unsigned int vi=0,vj=0; for (vi=0; vi<n; vi++)__asm("nop");} while (0)
unsigned char UART_Simulator_SendByte(unsigned char ch)
{
	TXD_RESET; //发送启始位
	Delay_Simulator_Uart(10);//Delay2cp(39);
	//发送8位数据位
	for (u8 i=8; i; i--)
	{
		if (ch & 0x01)TXD_SET; else TXD_RESET; //先传低位
		Delay_Simulator_Uart(10);//Delay2cp(36);
		ch >>= 1;
	}
	//发送校验位(无)
	TXD_SET; //发送结束位
	Delay_Simulator_Uart(10);//Delay2cp(46);
	Delay_Simulator_Uart(5); // 实际使用时,刚好一个停止位时,会不稳定,有时行,有时不行。
	return ch;
}

 

如果有重定向,刚这样写:

int fputc(int ch, FILE *f)
{
	return UART_Simulator_SendByte(ch);
}

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值