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