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;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM