
本帖最后由 黑溱郎 于 2015-1-7 10:54 编辑 下面是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; } } 贴子超长,接下页。 |
STM8自学笔记(推荐STM8很好的入门电子书)
基于STM8的DALI (数字可寻址调光协议)
分享STM8 风驰光盘的资料,是完整的(包括原理图+例程+PDF注释)
《无刷直流电机控制应用 基于STM8S系列单片机》
STM8S库函数中文参考 小软件
【资料分享】STM8L的智能手持血糖监测设备的源码
基于STM8S207工程模板
【培训资料】STM8系列PPT培训资料
STM8S 直流电机例程及相关资料
无刷直流电机控制应用+基于STM8S系列单片机---电子书
接上页。
步骤5、发送函数
static void Uart_Tx_Byte(void)
{
static bool SendFinish = 1; //发送完成标志
static u8 TxSampFreq = 0; //发送计数 采样4次
static u8 BitNum = 0; //位计数
static u8 ByteLock; //发送字节锁定(防止在发送途中 发送数字被改变)
static u8 TxIndex = 0; //当前发送索引
if(SendFinish)
{
SendFinish = 0;
RxSampFreq = 0;
BitNum = 0;
if(TxIndex < TxXKCnt) //控制发送的字节
{
ByteLock = UartTxBuff[TxIndex];
TxIndex++;
RxByteIndex = 0;
}
else if(TxIndex == TxXKCnt)
{
ByteLock = '\n';
TxIndex++;
RxByteIndex = 0;
}
else
{
flag_rxd_txd = 1;
SendFinish = 0;
TxIndex = 0;
}
}
if(++TxSampFreq > 3)
{
if(BitNum == 0) //起始位
{
Uart_TXD_Out_LOW();
BitNum++;
}
else if((BitNum >0) && (BitNum < 9)) //数据位
{
if(0x01 & (ByteLock >> (BitNum-1))) //先发低位
{
Uart_TXD_Out_HIGH();
}
else
{
Uart_TXD_Out_LOW();
}
BitNum++;
}
else if(BitNum == 9) //结束码
{
Uart_TXD_Out_HIGH();
SendFinish = 1;
BitNum = 0;
}
TxSampFreq = 0;
}
}
当然可以的,我还打了板的
能正常运行啊!