下面是STM8的模拟串口实验例子 实验工具:STM8S103FP6最小系统版, ST-linkV2, PL2303转串口模块
步骤1、算出定时初值, STM8内部晶振为16M, 采用8分频后震荡周期 =8/16 =0.5us,所以发送或接受以为数据的采样定时器初值应为48~52;
下面为定时器初始化代码:
void Tim2_Init(void)
{
TIM2_DeInit();
TIM2_TimeBaseInit(TIM2_PRESCALER_8, 48);
TIM2_ClearFlag(TIM2_FLAG_UPDATE);
TIM2_ITConfig(TIM2_IT_UPDATE, ENABLE);
TIM2_Cmd(ENABLE);
}
步骤2、RXD和TXD初始化,RXD为上拉输入,TXD位推挽输出高电平
#define Uart_RXD_Init() GPIO_Init(GPIOD,GPIO_PIN_6,GPIO_MODE_IN_PU_NO_IT)
#define Uart_RXD_Status() GPIO_ReadInputPin(GPIOD,GPIO_PIN_6)
#define Uart_TXD_Init() GPIO_Init(GPIOD,GPIO_PIN_5,GPIO_MODE_OUT_PP_HIGH_FAST)
#define Uart_TXD_Out_HIGH() GPIO_WriteHigh(GPIOD,GPIO_PIN_5)
#define Uart_TXD_Out_LOW() GPIO_WriteLow(GPIOD,GPIO_PIN_5)
步骤3、中断调用函数
void Uart_Interrupt(void)
{
uint8_t i;
if(1 == flag_rxd_finish)
{
flag_rxd_finish = 0;
flag_rxd_txd = 0;
for(i = 0;i < TxXKCnt; i++)
{
UartTxBuff= UartRxBuff;
}
}
if(1 == flag_rxd_txd) // 为1,接收
{
Uart_Rx_Byte();
}
else // 为0,发送
{
Uart_Tx_Byte();
}
}
步骤4、接收函数
static void Uart_Rx_Byte(void)
{
static uint8_t RxBitNum; //接收位计数
static uint8_t OverTime; //接收超时计时器
static uint8_t RxByteBuff; //一字节数据接收缓存
if(1 == Uart_RXD_Status())
{
OverTime++;
}
else
{
OverTime = 0;
}
if(OverTime > 44)
{
OverTime = 0;
RxByteIndex = 0;
RxBitNum = 0;
}
if((1 == Uart_RXD_Status()) && (0 == RxBitNum))
{
RxSampFreq = 0;
}
else
{
RxSampFreq++;
}
if(1 == RxSampFreq)
{
if(0 == RxBitNum)
{
if(0 == Uart_RXD_Status())
{
RxByteBuff = 0;
RxBitNum++;
}
}
else if((RxBitNum > 0) && (RxBitNum < 9))
{
if(1 == Uart_RXD_Status())
{
RxByteBuff = RxByteBuff | (1 << (RxBitNum - 1));
}
RxBitNum++;
}
else if(9 == RxBitNum)
{
if(1 == Uart_RXD_Status())
{
RxBitNum = 0;
if(0x0d != RxByteBuff && 0x0a != RxByteBuff)
{
UartRxBuff[RxByteIndex] = RxByteBuff;
RxByteIndex++;
if(RxByteIndex > 63)
{
RxByteIndex = 0;
}
}
else
{
TxXKCnt = RxByteIndex;
RxByteIndex = 0;
flag_rxd_finish = 1;
}
}
}
else
{
RxBitNum = 0;
}
}
else if(RxSampFreq > 3)
{
RxSampFreq = 0;
}
}
贴子超长,接下页。
|