打印
[STM8]

【转】STM8L101F3P6串口查询发送

[复制链接]
787|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
南国先生|  楼主 | 2016-11-1 20:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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


[cpp] view plain copy


  • 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标志是“发送数据寄存器空标志位”。



沙发
南国先生|  楼主 | 2016-11-1 20:31 | 只看该作者
上边就是我要哆嗦的话。本篇日志贴出查询发送一个字节的程序,如下:


[cpp] view plain copy 在CODE上查看代码片派生到我的代码片
/******************************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);  
   
}  
/******************************************************************************/  
/* 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的问题,还没有解决,有时间再研究一下。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

68

主题

160

帖子

3

粉丝