STM8L101F3P6串口查询发送

发布者:CrystalBreeze最新更新时间:2020-03-28 来源: eefocus关键字: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)

{

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,

[1] [2]
关键字:STM8L101F3P6  串口查询  发送 引用地址:STM8L101F3P6串口查询发送

上一篇:STM8单片机STVD环境查看指令运行时间
下一篇:STVD中报can't open file crtsi0.sm8的问题

推荐阅读最新更新时间:2024-11-23 05:20

Iphostmonitor:如何向Telegram群组发送通知?
Q:每次执行警报时,我都需要向电报室发布消息。我怎样才能做到这一点? A:按照以下了解如何将IPHost Network Monitor 警报通知发布到leg 聊天。我们将为此目的创建一个,但只会使用机器人的令牌(不会实现任何响应处理)。下面的屏幕截图是使用 Telegram 的 客户端截取的。 01创建一个机器人 联系BotFather,开始与它聊天,并发出命令/newbot。为新机器人命名和您选择的用户名: 记下访问凭证。 02创建新的群聊或直接与机器人对话 创建一个新组并邀请您的机器人加入,或者只是通过名称找到它(这是上面的IPHost-demo;使用您自己选择的
[机器人]
51单片机串口通信的发送与接收 字符串
51单片机的串口,是个全双工的串口,发送数据的同时,还可以接收数据。 当串行发送完毕后,将在标志位 TI 置 1,同样,当收到了数据后,也会在 RI 置 1。 无论 RI 或 TI 出现了 1,只要串口中断处于开放状态,单片机都会进入串口中断处理程序。 在中断程序中,要区分出来究竟是发送引起的中断,还是接收引起的中断,然后分别进行处理。 看到过一些书籍和文章,在串口收、发数据的处理方法上,很多人都有不妥之处。 接收数据时,基本上都是使用 中断方式 ,这是正确合理的。 即:每当收到一个新数据,就在中断函数中,把 RI 清零,并用一个变量,通知主函数,收到了新数据。 发送数据时,很多的程序都是使用的 查询方式 ,就是执行 while(T
[单片机]
STM32 HAL库 串口DMA发送完成中断
近期使用STM32驱动MAX3485进行485通信,发现STM32F103C8并不自带硬件485首发功能,需要软件上控制IO高低来驱动MAX3485进行485接收、485发送。 根据MAX3485手册可得,进行485发送时给相应引脚高电平。其余时间为低电平进行485接收。因此需要找到串口DMA发送完成的回调函数,在发送完成后将引脚拉低。 在stm32f1xx_hal_uart.c中 /** @defgroup UART_Exported_Functions_Group2 IO operation functions * @brief UART Transmit and Receive functions * @verb
[单片机]
高速串行数据通信发送芯片CY7B923的原理及应用
    摘要: 文章介绍了CYPRESS半导体公司推出的一种用于点对点之间高速串行数据通信的发送芯片CY7B923的原理及应用。较详细的介绍了CY7B923的管脚功能、内部组成、工作原理及工作方式。同时给出了一个实际电路来说明其具体的应用方法。     关键词: 串行数据通信 CY7B923 IDT7200 基带传输 差分PECL输出 1 概述 CY7B923是CYPRESS半导体公司推出的一种用于点对点之间高速串行数据通信的发送芯片。CY7B923采用的是基带传输通信方式,并支持带电插拔(热接插)。其内部电路主要包括时钟产生器、输入寄存器、编码器、移位寄存器、三对差分PECL输出对以及测试逻辑等。该芯片
[工业控制]
OK6410裸机之串口发送中断
start.S源码: .globl _start _start: // 0 地址 b reset // 复位时,cpu跳到0地址 ldr pc, =undefined_instruction // cpu遇到不能识别的指令时 ldr pc, _vector_swi // 当执行swi指令时, 进入swi模 式 b halt @ldr pc, _prefetch_abort // 预取中止异常 b halt @ldr pc, _data_abort // 数据访问异常 b halt @ld
[单片机]
[nrf51822][SDK12.3] BLE分层设计 NUS 透传数据队列发送,提升带宽利用率
四、 透传服务,加入队列机制 /******************************************************************************** * @file biz_ble_nus.c * @author jianqiang.xue * @Version V1.0.0 * @Date 2022-03-16 * @brief ble数据透传服务(从机) https://blog.csdn.net/weixin_41572450/article/details/84036968 *****************************************
[单片机]
飞思卡尔将隐退2G,多核处理器跳过65nm直达45nm
1983年摩托罗拉推出了全球第一个蜂窝电话,摩托罗拉半导体在第一代、第二代蜂窝电话中独领风骚,中国厂商最早一波的手机中多半采用了摩托罗拉半导体的芯片。但如今,在2G/2.5G手机已变成一种Commodity的产品时,飞思卡尔半导体表示将隐退该市场,而主攻3G及后续市场。“目前,在2G/2.5G市场我们仅提供对传统产品的继续支持,不再开发新的产品,我们的研发已全部转向3G市场。”飞思卡尔首席技术官Lisa Su在日前FTF大会上对《国际电子商情》记者独家表示。虽然竞争对手TI、英飞凌、NXP等厂商仍在开发2G/2.5G和2.75G的高度集成产品,但是飞思卡尔已决定放弃这个激烈竞争的市场。“的确如你所述,这个市场利润已非常低。”她坦承道
[焦点新闻]
stm32串口通信用printf发送数据配置
  开发环境:Keil RVMDK   在STM32串口通信程序中使用printf发送数据,非常的方便。可在刚开始使用的时候总是遇到问题,常见的是硬件访真时无法进入main主函数,其实只要简单的配置一下就可以了。下面就说一下使用printf需要做哪些配置。   有两种配置方法:   一、对工程属性进行配置,详细步骤如下   1、首先要在你的main 文件中 包含“stdio.h” (标准输入输出头文件)。   [size=12.8000001907349px]2、在main文件中重定义《fputc》函数 如下   // 发送数据   int fputc(int ch, FILE *f)   {   USART_SendData
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved