目标:实现由PC的串口调试软件发一串任意长(小于512字节)的数据给STM8L051F3串口,然后STM8L051F3串口全部返回给PC串口调试软件.
所需软件: XCOM V2.2串口调试助手 IAR FOR STM8(3.10.2)
所需硬件:自己设计的STM8L051F3最小系统板,板上无外置晶振,使用内置HSI
由于初次接触IAR FOR STM8和 STM8L单片机,开始遇到几个问题纠缠了一段时间。
一
1 如果在程序中没有语句改写默认主频,那STM8L主频默认是HSI/8,如图:
在IAR中改写主频语句是
CLK_SYSCLKDivConfig(CLK_SYSCLKDiv_1);
其他参数还有:
2 由于串口接收是采用中断接收,所以对CPU主频有一定要求。开始为了验证TIM4定时器的溢出时间,我把主频设为默认,即2M,程序可以实现对波特率9600及以下的数据字节数计数,但对波特率115200的数据字节数无法正确计数。后来把主频改为不分频就可以了。经实践2分频也可以,但4分频会有问题。
3 STM8L 与STM8S的库存在较大差别,可以参考STM8S的例程但不能照搬.
二 串口接收超时中断机制的实现
需要开启TIM4
/************************************************
函数名称 : TIMER_Initializes
功 能 : 定时器初始化
参 数 : 无
返 回 值 : 无
作 者 : armxu
*************************************************/
void TIMER_Initializes(void)
{
//延时1ms
TIM4_TimeBaseInit(TIM4_Prescaler_64, 250);//16M/1/64=250000,250*(1/250000)=250*0.000004=0.001S=1MS,
TIM4_SetCounter(250);
TIM4_ITConfig(TIM4_IT_Update, ENABLE);//向上溢出中断,中断函数向量号为25
TIM4_Cmd(ENABLE);//使能
}
定时器中断函数:
INTERRUPT_HANDLER(TIM4_UPD_OVF_TRG_IRQHandler,25)
{
/* In order to detect unexpected events during development,
it is recommended to set a breakpoint on the following instruction.
*/
if(timeout>0)
{
timeout--;
}
else if(timeout == 0)
{
Rec_over_flag = 1; //接收完成标志位
lenRcved = length; //实际接收的字节数目
length = 0;
}
TIM4_ClearITPendingBit(TIM4_IT_Update);
}
串口接收中断函数:
INTERRUPT_HANDLER(USART1_RX_TIM5_CC_IRQHandler,28)
{
/* In order to detect unexpected events during development,
it is recommended to set a breakpoint on the following instruction.
*/
timeout = 5;
if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)
{
Rec_Block[length]=USART_ReceiveData8(USART1);//接收到的字节放入缓冲曲
length++;//数组索引加1
USART_ClearITPendingBit(USART1,USART_IT_RXNE); //清除中断标志
if(length>LEN)
{
length=0;
}
}
}
在中断stm8l15x_it.c文件中声明变量:
#include "stm8l15x_it.h"
#include "bsp.h"
#define LEN 512
uint16_t i=0,length=0,lenRcved=0,timeout;
uint8_t Rec_over_flag;
uint8_t Rec_Block[LEN];
main函数:
/*******************************************************************************
****入口参数:无
****出口参数:无
****函数备注:STM8L串口超时接收机制测试
*******************************************************************************/
int main( void )
{
System_Initializes();
LED_OFF;
UART1_Printf("STM8L串口超时接收机制测试\r\n"); //发送字符串,末尾换行
while(1)
{
if((Rec_over_flag==1)&&(lenRcved>0))
{
PrintLongInt(lenRcved);
UART1_Printf("个字节数据\r\n"); //发送字符串,末尾换行
UART1_Printf(Rec_Block);
UART1_Printf("\r\n-------------------------------------------------\r\n"); //发送字符串,末尾换行
LED_TOG;
Rec_over_flag=0;
memset(Rec_Block,'\0',512);//接收缓冲清零
}
}
}
实际运行效果:
另外在串口调试时开始使用的是STC-ISP,但接收汉字有乱码,开始以为是程序的问题,后来换了XCOM就没有乱码.
串口调试时可以不要局限一种软件.
armcsdn 发布了20 篇原创文章 · 获赞 6 · 访问量 7364 私信 关注