20140624-STM8L101F3P6串口查询发送

先说几句,一直都没有对STM8的串口应用进行总结,最近小结一下。STM8应用库来开发,在基本的串口的应用上,我自己的理解现在还很不到位。我本以为STM8的串口也会有查询发送、中断发送、查询接收、中断接收这样几种方法呢~!可事实上我现在对于中断发送这路模式还没太搞明白,与51单片机的串口工作还是有区别的。


STM8提供了发送中断和发送完中断,我自己的理解是,在发送时进入中断和发送一个字节完成时进行中断。这与我大脑中理解的串口中断还是不一样的,回头要继续把这里搞明白。


一般情况下,STM8的串口多数是用查询发送,中断接收,这样来做。使用串口前要如下几点:

1.配置TX和RX的GPIO管脚状态

2.初始化串口,这里要打开串口设备的时钟,配置串口工作模式,和关闭USART_IT_TXE、USART_IT_TC中断,打开USART_IT_RXNE中断。然后才可以正常使用串口。

3.发送一个字节要调用库函数USART_SendData8(),但调用之后一定要记着去查询标志位,编写USART_SendByte()如下

void USART_SendByte(uint8_t data)
{
<span style="white-space:pre">	</span>USART_SendData8((unsigned char)data);
  <span style="white-space:pre">	</span>/* Loop until the end of transmission */
  <span style="white-space:pre">	</span>while (USART_GetFlagStatus(USART_FLAG_TXE) == RESET);
}

注意看查询 USART_FLAG_TXE标志,即这个标志为0时,一直等待,直到为该标志为1时,发送完成,结束这个函数。 USART_FLAG_TXE标志是“发送数据寄存器空标志位”。


-------------------------------------------------------------

上边就是我要哆嗦的话。本篇日志贴出查询发送一个字节的程序,如下:

/******************************Copyright (c)***********************************/
/*																																						*/
/*														老李电子工作																		*/
/*																																						*/
/*------------------------------File Info-------------------------------------*/
/* File name:			main.c																											*/
/* Last modified Date:  2014-06-19																						*/
/* Last Version:		1.0																												*/
/* Descriptions:		STM8L103F3P6,内部时钟,16MHz,串口查询发送								*/
/*																																						*/
/* 硬件连接:																																	*/
/*									TX----PC3																									*/
/*									RX----PC2																									*/
/*																																						*/
/*----------------------------------------------------------------------------*/
/* Created by:			Li Xiang																									*/
/* Created date:		2014-06-19																								*/
/* Version:					1.0																												*/
/* Descriptions:		无																												*/
/*																																						*/
/******************************************************************************/

/* Includes ------------------------------------------------------------------*/
#include "stm8l10x.h"
#include "stm8l10x_usart.h"
/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
#define POWER_BD			GPIO_Pin_0
#define POWER_BT			GPIO_Pin_1
#define MSEL					GPIO_Pin_2
#define NRESET 				GPIO_Pin_3
#define BD_NRESET 		GPIO_Pin_4
#define RESETB				GPIO_Pin_5
#define SCL2					GPIO_Pin_6
#define SDA2					GPIO_Pin_7

#define SDA						GPIO_Pin_0
#define SCL						GPIO_Pin_1
#define SCREEN_CTRL		GPIO_Pin_4

#define POWER_WIFI		GPIO_Pin_0
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
static void BoardInit(void);
static void CLK_Init(void);
static void GPIO_Init_my(void);
static void USART_Config(void);
void USART_SendByte(uint8_t data);
void USART_SendString(uint8_t* Data,uint16_t len);
void Delay_ms(uint32_t nCount);
/* Private functions ---------------------------------------------------------*/

/******************************************************************************/
/* Function name:		main																											*/
/* Descriptions:		主函数																										*/
/* input parameters:    无																										*/
/* output parameters:   无																										*/
/* Returned value:      无																										*/
/******************************************************************************/
void main(void)
{
	BoardInit();

	while (1){
		USART_SendString("Hello world!\r\n",14);
		Delay_ms(1000);
		USART_SendByte('H');Delay_ms(200);
		USART_SendByte('e');Delay_ms(200);
		USART_SendByte('l');Delay_ms(200);
		USART_SendByte('l');Delay_ms(200);
		USART_SendByte('o');Delay_ms(200);
		USART_SendByte(' ');Delay_ms(200);
		USART_SendByte('w');Delay_ms(200);
		USART_SendByte('o');Delay_ms(200);
		USART_SendByte('r');Delay_ms(200);
		USART_SendByte('l');Delay_ms(200);
		USART_SendByte('d');Delay_ms(200);
		USART_SendByte('!');Delay_ms(200);
		USART_SendString("\r\n",2);Delay_ms(200);
		Delay_ms(1000);
	}
}

/******************************************************************************/
/* Function name:		BoardInit																									*/
/* Descriptions:		主函数																										*/
/* input parameters:    无																										*/
/* output parameters:   无																										*/
/* Returned value:      无																										*/
/******************************************************************************/
static void BoardInit(void)
{
	CLK_Init();	
	GPIO_Init_my();
	USART_Config();
}

/******************************************************************************/
/* Function name:		CLK_Init																									*/
/* Descriptions:		时钟初始化函数																						*/
/* input parameters:    无																										*/
/* output parameters:   无																										*/
/* Returned value:      无																										*/
/******************************************************************************/
static void CLK_Init(void)
{    
	CLK_DeInit();
  CLK_MasterPrescalerConfig(CLK_MasterPrescaler_HSIDiv1);
}

/******************************************************************************/
/* Function name:		GPIO_Init_my																							*/
/* Descriptions:		IO初始化函数																							*/
/* input parameters:    无																										*/
/* output parameters:   无																										*/
/* Returned value:      无																										*/
/******************************************************************************/
static void GPIO_Init_my(void) 
{
	GPIO_Init(GPIOA,GPIO_Pin_2|GPIO_Pin_3,GPIO_Mode_Out_PP_Low_Slow);	//悬空未用
	
	GPIO_Init(GPIOB,POWER_BD,GPIO_Mode_Out_PP_Low_Slow);							//默认断电
	GPIO_Init(GPIOB,POWER_BT,GPIO_Mode_Out_PP_Low_Slow);							//取消未用
	GPIO_Init(GPIOB,MSEL,GPIO_Mode_Out_PP_Low_Slow);									//取消未用,Wifi模式选择
	GPIO_Init(GPIOB,NRESET,GPIO_Mode_Out_PP_Low_Slow);								//取消未用,Wifi复位	
	GPIO_Init(GPIOB,BD_NRESET,GPIO_Mode_Out_PP_Low_Slow);							//北斗复位信号,默认复位状态
	GPIO_Init(GPIOB,RESETB,GPIO_Mode_Out_PP_Low_Slow);								//取消未用,蓝牙复位
	GPIO_Init(GPIOB,SDA2|SCL2,GPIO_Mode_Out_OD_HiZ_Slow);							//电池电量用
		
	GPIO_Init(GPIOC,SDA|SCL,GPIO_Mode_Out_OD_HiZ_Slow);								//温度传感器
	GPIO_Init(GPIOC,GPIO_Pin_2,GPIO_Mode_In_PU_No_IT);								//串口接收
	GPIO_Init(GPIOC,GPIO_Pin_3,GPIO_Mode_Out_PP_High_Slow);						//串口发送
	
	GPIO_Init(GPIOD,GPIO_Pin_All,GPIO_Mode_Out_PP_Low_Slow);					//取消未用,Wifi供电
}

/******************************************************************************/
/* Function name:		USART_Config																							*/
/* Descriptions:		串口初始化函数																						*/
/* input parameters:    无																										*/
/* output parameters:   无																										*/
/* Returned value:      无																										*/
/******************************************************************************/
static void USART_Config(void)
{
	CLK_PeripheralClockConfig(CLK_Peripheral_USART, ENABLE);	
	
	USART_DeInit();
	
	USART_Init((uint32_t)9600, USART_WordLength_8D, USART_StopBits_1,
						USART_Parity_No, (USART_Mode_TypeDef)(USART_Mode_Rx | USART_Mode_Tx));
						
	USART_Cmd(ENABLE);	
}

/******************************************************************************/
/* Function name:		UART1_SendByte																						*/
/* Descriptions:		发送单字节																								*/
/* input parameters:    data:待发送数据																				*/
/* output parameters:   无																										*/
/* Returned value:      无																										*/
/******************************************************************************/
void USART_SendByte(uint8_t data)
{
    USART_SendData8((unsigned char)data);
  /* Loop until the end of transmission */
  while (USART_GetFlagStatus(USART_FLAG_TXE) == RESET);
}

/******************************************************************************/
/* Function name:		UART1_SendString																					*/
/* Descriptions:		发送字符串																								*/
/* input parameters:    无																										*/
/* output parameters:   无																										*/
/* Returned value:      无																										*/
/******************************************************************************/
void USART_SendString(uint8_t* Data,uint16_t len)
{
  uint16_t i=0;
  for(;i<len;i++)
    USART_SendByte(Data[i]);
  
}
/******************************************************************************/
/* Function name:		Delay_ms																									*/
/* Descriptions:		延时函数																									*/
/* input parameters:    延时时间																							*/
/* output parameters:   无																										*/
/* Returned value:      无																										*/
/******************************************************************************/
void Delay_ms(uint32_t nCount)
{
	uint16_t i=0,j=0;;
	for(i=0;i<nCount;i++){
		for(j=0;j<1100;j++){
			;
		}
	}
}

#ifdef  USE_FULL_ASSERT

/**
  * @brief  Reports the name of the source file and the source line number
  *   where the assert_param error has occurred.
  * @param file: pointer to the source file name
  * @param line: assert_param error line source number
  * @retval : None
  */
void assert_failed(uint8_t* file, uint32_t line)
{
    /* User can add his own implementation to report the file name and line number,
       ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */

    /* Infinite loop */
    while (1)
    {
    }
}
#endif
 
/*********************************END OF FILE**********************************/

但这段程序存在第一个字符误发0x00r的问题,还没有解决,有时间再研究一下。


-----------------------------------------------------------------------------------------------------------

2014.06.24 09:26

于单位



评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值