GPIO模拟串口发送,操作系统FREERTOS

#define GPIO_PORT_SIMULATE_UART_TX GPIOE
#define GPIO_PIN_SIMULATE_UART_TX GPIO_PIN_4
#define TX(n) gpio_bit_write(GPIO_PORT_SIMULATE_UART_TX,GPIO_PIN_SIMULATE_UART_TX,(bit_status)n)
#define BAUD_9600_US (104)
#define BAUD_115200_US (8)

void Drv_Simulate_Uart_Init(void)
{
  gpio_init(GPIO_PORT_SIMULATE_UART_TX,GPIO_MODE_OUT_PP,GPIO_OSPEED_50MHZ,GPIO_PIN_SIMULATE_UART_TX);
  TX(1);
}

void Drv_Simulate_Uart_SendByte(bs_uint8_t data)
{

  taskENTER_CRITICAL();//这里必须要,不然系统调度导致发送时序错误,从而产生乱码,且不要放在Drv_Simulate_Uart_SendString()函数里面,因为如果发送较长的buffer,会影响正常调度,因为里面用的是硬件延时

  bs_uint8_t i = 0;
  TX(0); //起始位
  DelayUs(BAUD_115200_US);
  for(i = 0; i < 8; i++)
  {
    if(data & 0x01)
    {
      TX(1);
    }
    else
    {
      TX(0);
    }
  DelayUs(BAUD_115200_US);
  data >>= 1;
  }
  TX(1); //停止位
  DelayUs(BAUD_115200_US);

  taskEXIT_CRITICAL();//这里必须要,不然系统调度导致发送时序错误,从而产生乱码

}

void Drv_Simulate_Uart_SendString(bs_uint8_t *p,bs_uint8_t len)
{
  
  while(len--)
  {
    Drv_Simulate_Uart_SendByte(*p);
    p++;
  }

  return;
}

原文地址:https://www.cnblogs.com/ycpkbql/p/13815951.html