历史上的今天
返回首页

历史上的今天

今天是:2025年03月28日(星期五)

正在发生

2020年03月28日 | STM8L101F3P6串口查询发送

2020-03-28 来源:eefocus

先说几句,一直都没有对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)

{

USART_SendData8((unsigned char)data);

  /* Loop until the end of transmission */

  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!rn",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("rn",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    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 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,

推荐阅读

史海拾趣

HellermannTyton公司的发展小趣事

面对全球经济波动和行业竞争加剧的挑战,Heimann Optoelectronics Gmbh果断实施转型升级战略。公司加大在物联网、人工智能等新兴技术领域的研发投入,成功开发出了一系列智能光电传感器和解决方案。这些产品能够实时监测环境变化、智能控制设备运行,为智慧城市、智能家居等领域提供了强有力的支持。通过转型升级,公司不仅巩固了传统市场的领先地位,还成功开拓了新的增长点。

Anritsu公司的发展小趣事

面对全球经济波动和行业竞争加剧的挑战,Heimann Optoelectronics Gmbh果断实施转型升级战略。公司加大在物联网、人工智能等新兴技术领域的研发投入,成功开发出了一系列智能光电传感器和解决方案。这些产品能够实时监测环境变化、智能控制设备运行,为智慧城市、智能家居等领域提供了强有力的支持。通过转型升级,公司不仅巩固了传统市场的领先地位,还成功开拓了新的增长点。

GCi Technologies公司的发展小趣事
如手机、平板电脑、移动电源等。
ERGOBAHCO公司的发展小趣事

为了进一步提升公司的竞争力,ERGOBAHCO公司开始积极拓展国际市场。公司组建了一支专业的国际业务团队,参加了多场国际展会,并与多家国际知名企业建立了合作关系。通过不断努力,ERGOBAHCO公司的产品成功打入了欧美、东南亚等国家和地区的市场,公司的国际化程度得到了显著提升。

上海晶岳(AFSEMI)公司的发展小趣事

随着移动互联网的快速发展,晶岳电子敏锐地捕捉到了移动终端支付芯片市场的潜力。2016年,公司推出了具有自主知识产权的移动终端支付芯片,以及过压保护芯片和充电管理IC系列产品。这一创新举措不仅使晶岳电子成功拓展了新的市场领域,也进一步提升了公司在行业内的知名度和影响力。同时,公司还加强了与移动支付平台的合作,共同推动移动支付技术的发展和应用。

Connector City公司的发展小趣事

Connector City公司成立于XX世纪初,当时电子连接器市场正处于快速发展的阶段。作为初创企业,Connector City面临着资金短缺、技术落后和市场竞争激烈的挑战。然而,公司创始人凭借对行业的深刻理解和敏锐的市场洞察力,成功捕捉到了市场机遇。他们积极寻求投资,加强与科研机构的合作,不断提升产品性能和质量。同时,公司还注重市场营销和品牌建设,通过参加行业展会、举办产品发布会等方式,提高了品牌知名度和市场占有率。

问答坊 | AI 解惑

国内十大GPS车载终端品牌介绍

深圳赛格导航       深圳市赛格导航科技股份有限公司是国内GPS车载监控产品应用领域的开拓者,从 94年开始研究和应用GPS 技术,具有资深的行业经验。产品与服务包括面向国内和海外的汽车GPS定位监控系统设备、物流GPS监控、车 ...…

查看全部问答>

DM12232A(C框LED).pdf

本帖最后由 paulhyde 于 2014-9-15 09:22 编辑 DM12232A(C框LED).pdf  …

查看全部问答>

mips64 如何映射32位物理地址

  各位高手,我用mips是octeon 64位的,而地址总线是32位的,请问VM,PA之间如何映射???   先谢谢啊!…

查看全部问答>

为什么GPIO中有的Pin要设为Pull_Up/Pull_Down?

如题,其中有的pin为输入pin,有的pin为输出pin,但是为什么要设置一些pin的属性为pull up或者为pull down,pull up/pull down到底是干吗用的?根据什么来设的呢,聆听各位大虾的教诲!!…

查看全部问答>

CE下控件显示问题?

我建了个工程,发现有好多控件显示不出来为什么那怎么办那?…

查看全部问答>

为什么VS2005开发Win CE程序连接Access数据库,可是却没有System.Data.OleDb类库?

我用VS2005开发Win CE程序,连接Access数据库,可是却没有System.Data.OleDb类库,只有System.Data.Common System.Data.SqlTypes 这两个类库,怎么回事啊???? 只好用System.Data.Common.DbConnection连接,可是出现一下问题: DbConnection myCo ...…

查看全部问答>

波特率的问题请教

我对硬件不怎么了解,想问一下如果发送的硬件的波特率是19200,接收的波特率是9600,这之间可以进行准确通信么,就是19200的向9600的发送数据,后者可以识别发送的具体是什么么? 谢谢…

查看全部问答>

UCC39002的均流问题

本帖最后由 dontium 于 2015-1-23 13:19 编辑 我准备使用UCC39002与三个D/C D/C模块实现均流,可是TI官方给出的PDF中没有的实际应用,只是告诉参考资料为TI文献NO.SLUA270中UCC39002与PH-100S4 模块,可是PH-100S4又没法网络上查 ...…

查看全部问答>

也学“下载到FLASH”里------------F28035 C2000

我的F28035在RAM中运行正常,下到FLASH里就不运行了。   慢慢再看它的资料吧       [ 本帖最后由 dontium 于 2012-2-14 16:26 编辑 ]…

查看全部问答>

新手求助STM32的流水灯问题

看《零死角玩转STM32》的初级篇中的流水灯,根据他的步骤写完程序,烧进去,结果灯全亮,不闪,后来干脆不高延时,改成如下所示还是全亮; LED1( ON );     // 亮             LED1 ...…

查看全部问答>