波特率为38400波形图如下,可以看出,一个字节的脉宽为26us.
在72MHZ灵动微MCU上的代码为:
#define TXD_SET GPIO_SetBits(GPIOB,GPIO_Pin_3)
#define TXD_RESET GPIO_ResetBits(GPIOB,GPIO_Pin_3)
#define Delay_Simulator_Uart(n) do {volatile unsigned int vi=0,vj=0; for (vi=0; vi<n; vi++)__asm("nop");} while (0)
//往串口写一个字节
unsigned char UART_Simulator_SendByte(unsigned char ch)
{
TXD_RESET; //发送启始位
Delay_Simulator_Uart(85);//Delay2cp(39);
//发送8位数据位
for (u8 i=8; i; i--)
{
if (ch & 0x01)TXD_SET; else TXD_RESET; //先传低位
Delay_Simulator_Uart(85);//Delay2cp(36);
ch >>= 1;
}
//发送校验位(无)
TXD_SET; //发送结束位
Delay_Simulator_Uart(85);//Delay2cp(46);
Delay_Simulator_Uart(42); // 实际使用时,刚好一个停止位时,会不稳定,有时行,有时不行。
return ch;
}
115200时,为
256000时,为3.5us和4.0us之间跳变。
256000时的代码为:
#define TXD_SET GPIO_SetBits(GPIOB,GPIO_Pin_3)
#define TXD_RESET GPIO_ResetBits(GPIOB,GPIO_Pin_3)
#define Delay_Simulator_Uart(n) do {volatile unsigned int vi=0,vj=0; for (vi=0; vi<n; vi++)__asm("nop");} while (0)
unsigned char UART_Simulator_SendByte(unsigned char ch)
{
TXD_RESET; //发送启始位
Delay_Simulator_Uart(10);//Delay2cp(39);
//发送8位数据位
for (u8 i=8; i; i--)
{
if (ch & 0x01)TXD_SET; else TXD_RESET; //先传低位
Delay_Simulator_Uart(10);//Delay2cp(36);
ch >>= 1;
}
//发送校验位(无)
TXD_SET; //发送结束位
Delay_Simulator_Uart(10);//Delay2cp(46);
Delay_Simulator_Uart(5); // 实际使用时,刚好一个停止位时,会不稳定,有时行,有时不行。
return ch;
}
如果有重定向,刚这样写:
int fputc(int ch, FILE *f)
{
return UART_Simulator_SendByte(ch);
}