STM32学习笔记六——GPIO模拟USART

0、摘要

在实际开发当中会遇到串口不够的情况,此时我们可以通过GPIO模拟USART。

    IO口模拟串口的思路也比较简单,一切按照串口协议进行操作即可。
    对于发送,计算好不同波特率对应的延时时间进行数据发送。
    对于接收,稍微复杂。通过外部中断检测接收管脚的下降沿,检测到起始信号后开启定时器,定时器按照波特率
设定好时间,每隔一段时间进入定时器中断接收数据,完成一个字节后关闭定时器。

1、新建工程,勾选相应的库

 选中:CMSIS>CORE;Device>Startup;>StdPeriph Drivers>EXTI;>Framework;>GPIO;>RCC;>TIM;等

2、程序分析

IO口初始化配置

//输出管脚配置
void GPIO_Configuration(void)
{
   GPIO_InitTypeDef GPIO_InitStructure;
   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
   GPIO_Init(GPIOA, &GPIO_InitStructure);
}
//输入管脚及中断配置
void GPIO_Configuration(void)
{
   GPIO_InitTypeDef GPIO_InitStructure;
   EXTI_InitTypeDef EXTI_InitStruct;
   NVIC_InitTypeDef NVIC_InitStructure;

   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;    //上拉输入 ,IO口默认是高电平
   GPIO_Init(GPIOA, &GPIO_InitStructure);
   GPIO_SetBits(GPIOA,GPIO_Pin_10);//保持高电平

   EXTI_InitStruct.EXTI_Line=EXTI_Line10; 
   EXTI_InitStruct.EXTI_Mode=EXTI_Mode_Interrupt;
   EXTI_InitStruct.EXTI_Trigger=EXTI_Trigger_Falling;    //下降沿中断
   EXTI_InitStruct.EXTI_LineCmd=ENABLE;
   EXTI_Init(&EXTI_InitStruct);
   NVIC_InitStructure.NVIC_IRQChannel=EXTI15_10_IRQn; //外部中断,边沿触发
   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
   NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
   NVIC_Init(&NVIC_InitStructure);
}

发送函数

//发送1个字节
void IO_TXD(u8 ch)
{
   u8 i = 0; 
   GPIO_ResetBits(GPIOC,GPIO_Pin_9);
   delay_us(BuadRate_9600);
   for(i = 0; i < 8; i++)
   {
     if(ch&0x01)
       GPIO_SetBits(GPIOC,GPIO_Pin_9); 
     else 
       GPIO_ResetBits(GPIOC,GPIO_Pin_9);
    delay_us(BuadRate_9600);
    ch = ch>>1;
   }
   GPIO_SetBits(GPIOC,GPIO_Pin_9); 
   delay_us(BuadRate_9600);
}

//发送字符串
void USART_Send(u8 *buf, u8 len)
{
   u8 t;
   for(t = 0; t < len; t++)
   {
     IO_TXD(buf[t]);
   }
}

设置枚举变量,这里考虑到USART共有10个bit数据。

enum{
 COM_START_BIT, //起始位
 COM_D0_BIT,
 COM_D1_BIT,
 COM_D2_BIT,
 COM_D3_BIT,
 COM_D4_BIT,
 COM_D5_BIT,
 COM_D6_BIT,
 COM_D7_BIT,
 COM_STOP_BIT, //结束位
};

接收程序可以使用软件延时的方式(但是不推荐),也可使用定时器的方式进行接收。

  • 软件延时方式
void EXTI15_10_IRQHandler(void) 
{
	enum stat recvStat = COM_STOP_BIT; //定义初始为停止位
	if(EXTI_GetITStatus(EXTI_Line10)!=RESET)   //检查外部中断是否产生了
	{ 
		if(!GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_10)) //检测引脚高低电平,如果是低电平,则说明检测到起始位
		{
		Delay(0x33A); //延时 0x432 约等于104us
		if(recvStat == COM_STOP_BIT)
		{
			recvStat = COM_START_BIT; //此时的状态是起始
			while(recvStat!= COM_STOP_BIT) // 循环到停止位
			{
				recvStat++; // 改变状态
				if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_10)) //‘1’
				{
					recvData |= (1 <<(recvStat -1));
				}
				else
				{
					recvData &= ~(1 << (recvStat -1));
				} 
				Delay(0x33A);
			}
		}
	}
	EXTI_ClearITPendingBit(EXTI_Line10); //清除EXTI_Line10中断挂起标志位
	} 
}
  • 定时器方式
void EXTI15_10_IRQHandler(void)
{	
	if(EXTI_GetFlagStatus(EXTI_Line14) != RESET)	
	{		
		if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_10) == 0) 		
		{			
			if(recvStat == COM_STOP_BIT)			
			{				
				recvStat = COM_START_BIT;				
				TIM_Cmd(TIM4, ENABLE);			
			}		
		}	
	EXTI_ClearITPendingBit(EXTI_Line14);	
	}
} 

void TIM4_IRQHandler(void)
{
	if(TIM_GetFlagStatus(TIM4, TIM_FLAG_Update) != RESET)	
  	{		
  		TIM_ClearITPendingBit(TIM4, TIM_FLAG_Update);			 
  		recvStat++;		
  		if(recvStat == COM_STOP_BIT)		
  		{			
  			TIM_Cmd(TIM4, DISABLE);			
  			USART_buf[len++] = recvData;				
  			return;		
  		}		
  		if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_10))	//接收为高电平	
  		{			
  			recvData |= (1 << (recvStat - 1));		
  		}
  		else
  		{			
  			recvData &= ~(1 << (recvStat - 1));		
  		}	  
  	}		
 }

3、参考链接

USART简介

USART模拟

  • 2
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 《STM32自学笔记第3版》是一本关于STM32微控制器的自学教程。该书深入介绍了STM32微控制器的原理、应用和编程方法。 本书第3版增加了最新的STM32系列微控制器的内容,包括了更多实际应用的案例和项目。读者通过该书可以学习到如何使用STM32微控制器进行各种应用开发,如控制系统、嵌入式系统、通讯系统等。 本书首先对STM32微控制器的硬件结构进行了详细的介绍,包括了芯片的内部结构、引脚的功能和特性。然后,通过具体的实验项目,教授了STM32的基本编程方法和技巧。读者可以通过这些实验,了解STM32的各种功能模块的使用方法,如ADC、USART、SPI等。同时,还介绍了如何使用STM32CubeMX和Keil MDK等常用的开发工具进行项目开发。 此外,本书还对STM32的外设扩展进行了介绍,如通过I2C总线连接外部设备,通过CAN总线实现通讯等。读者可以学习到如何通过外设扩展,实现更复杂的应用系统。 总的来说,《STM32自学笔记第3版》是一本系统、全面的STM32自学教程。通过学习该书,读者可以深入了解STM32微控制器,并掌握其在各种应用领域的开发方法。无论是初学者还是有一定STM32开发经验的人都可以从中获益。 ### 回答2: 《STM32自学笔记 第3版》是一本适合自学STM32开发板的参考书籍。本书以STM32微控制器为基础,详细介绍了STM32的硬件结构和软件开发环境。作者结合自身经验和实际案例,将复杂的知识点以简洁明了的方式呈现,使读者能够快速入门。 第3版的内容相比前两版有所扩充和更新。首先,在硬件方面,本书详细介绍了STM32的引脚布局和外设接口,包括GPIOUSART、I2C、SPI等,使读者能够充分了解STM32的基本硬件结构和功能。 其次,在软件方面,本书提供了详细的开发环境配置和编程指南。包括了Keil MDK开发环境的安装和使用、编译、调试和下载等操作步骤,并且给出了一些常见问题的解决方法。同时,作者还介绍了如何使用STM32的标准外设库进行编程,包括GPIO控制、中断处理、定时器、串口通信等。 除此之外,本书还介绍了一些实际应用案例,以帮助读者更好地理解和应用所学知识。例如,如何使用STM32控制LED灯、驱动液晶显示屏、读取温度传感器数据等。 总体而言,本书是一本系统全面的STM32自学教程。通过学习本书,读者可以了解STM32的基本原理和应用,掌握STM32的硬件配置和软件开发,从而能够独立完成STM32的项目开发。无论是初学者还是有一定基础的开发者都可以从本书中获得很大的收益。 ### 回答3: 《STM32自学笔记第3版》是一本专门介绍如何自学STM32开发的书籍。本书主要针对初学者,通过详细的讲解和实践项目的演示,帮助读者快速上手STM32开发。 书中首先介绍了STM32系列微控制器的基本知识,包括硬件架构、外设功能和寄存器的使用等。对于没有接触过STM32的读者来说,这一部分对于理解后面的内容非常重要。 接着,书中从简单的LED控制开始,逐步引导读者学习各种外设的使用,如GPIO、定时器、UART等。同时,每个外设的使用都配有具体的实例代码和详细的注解,方便读者理解和实践。 书中还介绍了STM32开发中常用的开发工具和环境配置方法。从芯片选择、开发板选购到软件安装和项目配置,都有详细的指导。同时,书中还提供了一些调试技巧和常见问题的解答,帮助读者避开一些容易遇到的坑。 最后,书中还介绍了一些常用的外设应用案例,如按键控制、LCD显示、温湿度传感器等。通过这些案例,读者可以更好地理解STM32的应用场景和开发思路,提升自己的技能水平。 总的来说,《STM32自学笔记第3版》是一本适合学习STM32开发的入门书籍。通过系统完整的内容和实例演示,读者可以快速掌握STM32的基本知识和开发技巧。无论是初学者还是有一定经验的开发者,都可以从中获得实际的帮助和启示。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值