STM32IO模拟串口接收发送(stm32f030)

一、串口时序图

在这里插入图片描述

二、代码-发送部分

/******************************************************
*函数名称:IR_SendByte
*备注:IO模拟串口发送1bit
*入口参数:val 发送的值 
*作者:han
******************************************************/
void IR_SendByte(uint8_t val)
{	
	uint8_t i;
	
	JC24B_Set_L;			//起始位,拉低电平
	delay_us(IO_UASRT_bound);	
	for(i = 0; i < 8; i++)		//8位数据位
	{
		if(val & 0x01)
		{
		 JC24B_Set_H;
		}
		else
		 JC24B_Set_L;
		
	 delay_us(IO_UASRT_bound);
		val >>= 1;
	}
	JC24B_Set_H;			//停止位,拉高电平
	delay_us(IO_UASRT_bound);
}
/******************************************************
*函数名称:IO_UASRT_Send
*备注:IO模拟串口发送一包数据
*入口参数:st 发送的数组 len 发送长度 
*作者:han
******************************************************/
void IO_UASRT_Send(uint8_t *st,uint16_t len)
{
    int i=0;
    while ((len--)!=0)
     {  
        IR_SendByte(st[i]);
         i++;
     }
}

三、代码-接收部分

①IO配置,中断接收

 /**********************IO模拟接收 PB11**************************/		
   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;			  //浮空输入
	 GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;	    		 
   GPIO_Init(GPIOB, &GPIO_InitStructure);	  				
   GPIO_SetBits(GPIOB,GPIO_Pin_11); 	
	 SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOB,EXTI_PinSource11);//映射

  	EXTI_InitStructure.EXTI_Line=EXTI_Line11;	
  	EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;	
  	EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;//下降沿
  	EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  	EXTI_Init(&EXTI_InitStructure);	 
		
	  NVIC_InitStructure.NVIC_IRQChannel = EXTI4_15_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;		
		NVIC_Init(&NVIC_InitStructure);
		EXTI_ClearITPendingBit(EXTI_Line11);//清楚中断标志位

②中断接收

/******************************************************
*函数名称:EXTI4_15_IRQHandler
*备注:IO模拟串口接收
*入口参数:
*作者:han
******************************************************/
uint8_t tmp;
uint8_t USART_RX_BUF[USART_REC_LEN]; 
uint16_t USART_RX_STA=0;
void EXTI4_15_IRQHandler(void)
{
   uint8_t i=9;
   if(EXTI_GetITStatus(EXTI_Line11) != RESET)
   {
     /* Disable the Selected IRQ Channels -------------------------------------*/
   	NVIC->ICER[EXTI4_15_IRQn >> 0x05] =(uint32_t)0x01 << (EXTI4_15_IRQn & (uint8_t)0x1F);
	  EXTI_ClearITPendingBit(EXTI_Line11);
	  delay_us(IO_UASRT_begin);
	  while(i--)
	  {
	  	tmp >>=1;
		if(GPIOB->IDR&GPIO_Pin_11) tmp |=0x80;
		 delay_us(IO_UASRT_bound);
	  }

	  USART_RX_BUF[USART_RX_STA++]=tmp ;

	  EXTI_ClearITPendingBit(EXTI_Line11);
	  NVIC->ISER[EXTI4_15_IRQn >> 0x05] =
	 (uint32_t)0x01 << (EXTI4_15_IRQn & (uint8_t)0x1F);
   }
}

③其他部分

#define USART_REC_LEN  		200  	//定义最大接收字节数 200
#define IO_UASRT_bound      104                 //波特率计算:(1/波特率)*1000000   9600:104    2400:416
#define IO_UASRT_begin      IO_UASRT_bound/2   //起始位采集点
  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值