历史上的今天
今天是: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 } /******************************************************************************/ /* 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 ; } } } #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,
史海拾趣
|
深圳赛格导航 深圳市赛格导航科技股份有限公司是国内GPS车载监控产品应用领域的开拓者,从 94年开始研究和应用GPS 技术,具有资深的行业经验。产品与服务包括面向国内和海外的汽车GPS定位监控系统设备、物流GPS监控、车 ...… 查看全部问答> |
|
为什么GPIO中有的Pin要设为Pull_Up/Pull_Down? 如题,其中有的pin为输入pin,有的pin为输出pin,但是为什么要设置一些pin的属性为pull up或者为pull down,pull up/pull down到底是干吗用的?根据什么来设的呢,聆听各位大虾的教诲!!… 查看全部问答> |
|
为什么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 ...… 查看全部问答> |
|
本帖最后由 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》的初级篇中的流水灯,根据他的步骤写完程序,烧进去,结果灯全亮,不闪,后来干脆不高延时,改成如下所示还是全亮; LED1( ON ); // 亮 LED1 ...… 查看全部问答> |




