【STM8学习笔记】STM8系列串口中断发送例程

发布者:中和子最新更新时间:2020-02-17 来源: eefocus关键字:STM8系列  串口  中断发送 手机看文章 扫描二维码
随时随地手机看文章

目标MCU:STM8L051F3


功能:串口中断发送。(区别于串口轮询发送)


drv_usart.c


/*****************************************************************************************

 * Confidential and Proprietary Information of xxx Corporation

 * (C) 2019 ,xxx Corporation . All rights reserved.

 * file :    drv_usart.c

 * brief :  .c files

 * History:    Author        Version          ChangeContent            Date

 *               xxx                             NewFile             2019.04.28

 *****************************************************************************************/

 

/**********************************************

* 头文件引用

**********************************************/

#include "drv_usart.h"

 

 

/**********************************************

 * 静态全局变量定义

**********************************************/

 

 

/**********************************************

 *全局变量定义

**********************************************/

drv_usart_s m_usart_s;

 

 

 

/**********************************************

 * 内部函数声明

 **********************************************/ 

static void Drv_USART_EndTransmit_IT(void);

static void Drv_USART_ParaInit(void);

static void Drv_USART_SendByte( u8 sendData );

 

 

/**********************************************

 * 全局函数实现体

 **********************************************/

 /****************************************************************************************

 * FunctionName   : drvUsart_init

 * Abstract       : Init Usart driver.

 * Argument1(in)  : void

 * Argument2(out) : 

 * Return Value   : void

 * Remarks        :

 * Create         : 2019/04/28 , DJWT_zhenggp  New

 * History        :

****************************************************************************************/

void drvUsart_init(void)

{

/*PA2 --> USART_TX

*PA3 --> USART_RX*/

// PA3 USART_RX config

PA_DDR_DDR3 = 0; //输入

PA_CR1_C13 = 1; //上拉输入

PA_CR2_C23 = 0;

// PA2 USART_TX config

PA_ODR_ODR2 = 1;

PA_CR1_C12 = 1; //推挽输出

PA_CR2_C22 = 1; //输出摆率10M   

PA_DDR_DDR2 = 1; //输出高电平,TX空闲状态为高电平,如果不设置,会莫名奇妙的发送0x00

 

/* USART2 --> PCKEN33, USART3 --> PCKEN34*/

CLK_PCKENR1_PCKEN15 = 1; //开启USART1外设时钟

 

//开启引脚的UART功能,功能复用为USART功能引脚

//00: USART1_TX on PC2 and USART1_RX on PC3

//01: USART1_TX on PA2 and USART1_RX on PA3

//10: USART1_TX on PC5 and USART1_RX on PC6

SYSCFG_RMPCR1_USART1TR_REMAP = 1; // system configuration PA2,PA3

 

//设置串口工作方式

USART1_CR1_M = 0; // 1 Start bit, 8 Data bits

USART1_CR3_STOP0 = 0; // 1 STOP bit

USART1_CR3_STOP1 = 0;

USART1_CR1_PCEN  = 0; /* No Parity : Parity control disabled */

 

//设置波特率

//波特率设置为9600

// 2000000/9600=208.333

//208.333(DEC)=00D0(HEX)

USART1_BRR2 = 0x00; //the BRR2 should be programmed before BRR1

USART1_BRR1 = 0x0D;

 

// USART1_CR2_TEN = 1; //使能发送

// USART1_CR2_TIEN=0; //打开发送中断

// USART1_CR2_TCIEN = 1; //打开发送完成中断

USART1_CR2_REN = 1; //使能接收

USART1_CR2_RIEN = 1; //打开接收中断

 

USART1_CR1_USARTD = 0; //Enable the USART peripheral

 

Drv_USART_ParaInit();

}

 

/****************************************************************************************

 * FunctionName   : Drv_USART_ParaInit

 * Abstract       : 

 * Argument1(in)  : void

 * Argument2(out) : 

 * Return Value   : void

 * Remarks        :

 * Create         : 2018/12/08 , DJWT_zhenggp  New

 * History        :

****************************************************************************************/

static void Drv_USART_ParaInit(void)

{

m_usart_s.sendBuf_p = NULL;

}

 

 

 /****************************************************************************************

 * FunctionName   : Drv_USART_Rx_IRQHandler

 * Abstract       : usart rx interrupt handler.

 * Argument1(in)  : void

 * Argument2(out) : 

 * Return Value   : void

 * Remarks        :

 * Create         : 2019/04/28 , DJWT_zhenggp  New

 * History        :

****************************************************************************************/

#pragma vector = USART_R_RXNE_vector

__interrupt void Drv_USART_Rx_IRQHandler(void)

{

if( 1 == USART1_SR_RXNE )

{

 

}

}

 

 /****************************************************************************************

 * FunctionName   : Drv_USART_Tx_IRQHandler

 * Abstract       : usart tx interrupt handler.

 * Argument1(in)  : void

 * Argument2(out) : 

 * Return Value   : void

 * Remarks        :

 * Create         : 2019/04/28 , DJWT_zhenggp  New

 * History        :

****************************************************************************************/

#pragma vector = USART_T_TC_vector

__interrupt void Drv_USART_Tx_IRQHandler(void)

{

if( (RESET != USART1_SR_TC) && (RESET != USART1_CR2_TCIEN) )

{

Drv_USART_EndTransmit_IT();

}

}

 

/****************************************************************************************

 * FunctionName   : Drv_USART_SendByte

 * Abstract       : usart send byte data.

 * Argument1(in)  : void

 * Argument2(out) : 

 * Return Value   : void

 * Remarks        :

 * Create         : 2018/12/18 , DJWT_zhenggp  New

 * History        :

****************************************************************************************/

static void Drv_USART_SendByte( u8 sendData )

{

USART1_DR = sendData;

}

 

/****************************************************************************************

 * FunctionName   : Drv_USART_EndTransmit_IT

 * Abstract       : Wrap up transmission in non-blocking mode.

 * Argument1(in)  : void

 * Argument2(out) : 

 * Return Value   : void

 * Remarks        :

 * Create         : 2018/12/18 , DJWT_zhenggp  New

 * History        :

****************************************************************************************/

static void Drv_USART_EndTransmit_IT(void)

{

static const u8* strEnd = "rn";

if( NULL != m_usart_s.sendBuf_p ){

if( '' == *m_usart_s.sendBuf_p ){

m_usart_s.sendBuf_p = (u8*)strEnd;

}

 

Drv_USART_SendByte(*(m_usart_s.sendBuf_p));

 

if( 'n' == *m_usart_s.sendBuf_p ){

m_usart_s.sendBuf_p = NULL;

}else{

m_usart_s.sendBuf_p++;

}

}else{

/*关闭发送使能*/

USART1_CR2_TEN = DISABLE;

/* 关闭发送完成中断 */

USART1_CR2_TCIEN = DISABLE;

}

}

 

/****************************************************************************************

 * FunctionName   : Drv_USART_EndTransmit_IT

 * Abstract       : Wrap up transmission in non-blocking mode.

 * Argument1(in)  : void

 * Argument2(out) : 

 * Return Value   : void

 * Remarks        :

 * Create         : 2018/12/18 , DJWT_zhenggp  New

 * History        :

****************************************************************************************/

void Drv_USART_TransmitData(u8* StrData_p)

{

if( NULL == StrData_p ){

return;

}

m_usart_s.sendBuf_p = StrData_p;

 

/* 打开发送完成中断 */

USART1_CR2_TCIEN = ENABLE;

Drv_USART_SendByte(*(m_usart_s.sendBuf_p++));

 

/* 使能发送 */

USART1_CR2_TEN = ENABLE;

}

 

drv_usart.h


/*****************************************************************************************

 * Confidential and Proprietary Information of xxx Corporation

 * (C) 2019 ,xxx Corporation . All rights reserved.

 * file :    drv_usart.h

 * brief :  .h files

 * History:    Author        Version          ChangeContent            Date

 *               zhenggp                                 NewFile             2019.04.28

 *****************************************************************************************/

 

#ifndef __DRV_USART_H__

#define __DRV_USART_H__

 

/**********************************************

* 头文件引用

**********************************************/

#include "../typedef.h"

 

/**********************************************

 * 宏定义

**********************************************/

 

 

 

/**********************************************

 * 枚举型定义

**********************************************/

 

 

/**********************************************

 *结构体类型定义

**********************************************/

typedef struct __DRV_USART_S__{

u8* sendBuf_p;

}drv_usart_s;

 

 

/**********************************************

 * 全局函数声明

**********************************************/

extern void drvUsart_init(void);

extern void Drv_USART_TransmitData(u8* StrData_p);

 

#endif

关键字:STM8系列  串口  中断发送 引用地址:【STM8学习笔记】STM8系列串口中断发送例程

上一篇:stm8s003中串口中断问题
下一篇:STM8S处理串口中断注意

推荐阅读最新更新时间:2024-11-07 10:52

RS232串口驱动(C51)
/* RS232 driver */ //#include D:\Design\Programming\RS232.h /*引用地址*/ #include reg51.h #define uchar unsigned char #define uint unsigned int ////////////////////////用户接口/////////////////////////// void RS232_ini(/*uint speed*/); void RS232_send(uchar word); uchar RS232_rec_buffer; //数据接收变量 bit RS232_rec_flag;
[单片机]
单片机串口设置问题
最近测试涉及到底层串口代码的修改。经过这次修改,突然发现其实自己对于串口的一些特性以前并不是十分清楚。 首先遇到的一些问题: 1)在使用IO的数据位的时候,没有考虑校验位所占的位数。 2)在设置串口输入的时候,使用悬空输入。 关于1),在一次使用 STM32 串口参数9600,N,8,1与另一个 8051MCU通信的时候发现偶校验没有问题,但是无校验通信就出现异常。但是,当将 STM32 与电脑通信的时候,偶校验与无校验通信又完全都是正确的。8051MCU单独与电脑通信也都是完全正确的。查看代码,还真不知道有什么不对劲的。因为这段代码,用了很长时间了。后来一个同事看代码后,提醒说对于数据位的设置,偶校验和无校验是一致的,既然没有数
[单片机]
RS232串口通信篇
大家好, 通过前一期的学习, 我们已经对ICD2 仿真烧写器和增强型PIC 实验板的使用方法及学习方式有所了解与熟悉,学会了如何用单片机来控制发光管、继电器、蜂鸣器、按键、数码管等资源,体会到了学习板的易用性与易学性,看了前几期实例,大部分都是基于单片机端口操作原理呢?   大家是否觉得这样一个单片机系统似乎缺少点什么呢?不错,本期我们将介绍单片机与电脑通讯,使单片机与PC 机能够联机工作。   单片机除了需要控制外围器件完成特定的功能外,在很多应用中还要完成单片机和单片机之间、单片机和外围器件之间,以及单片机和微机之间的数据交换和指令的传输,这就是单片机的通信。单片机的通信方式可以分为并行通信和串行通信。并行方式传送一个字节的
[嵌入式]
串口光纤通信的组网方式
  由于光纤并不能够象电线一样简单地进行直接连接,光纤的每个分叉、集合都必须经过专门的光纤转换器,所以光纤通信网络的组网方式取决于光纤转换器的功能。本文首先介绍了简单的一对一的光纤通信,然后详细介绍了以波仕电子产品为代表的三种串口光纤通信的组网方式:总线式、星形、双环冗余型。用户可以根据现场的串口设备的分布地方或者可靠性要求来选择。通信软件都是一样的,与普通的RS-485总线多机通信一样。可靠性是以双环冗余的网络最高。 一、简单的一对一串口光纤通信方式    最简单的光纤通信就是一对一的通信。两头的接口可以是RS-232、RS-485,也可以是USB、以太网等。 波士电子的RS-232/光纤转换器、RS-485/42
[嵌入式]
PIC串口通信程序(3)发送字符
#include pic.h __CONFIG(XT&WDTDIS&LVPDIS); main() { SPBRG=25; SYNC=0;//选择异步模式 BRGH=1;//高波特率方式 TXEN=1;//发送使能 TX9=0;//不发送第9位 SPEN=1;//USART使能 //以上可替代语句RCSTA=0b10000000,TXSTA=0b00100100 TXREG='A'; while(1) { if(TRMT==1)//如果TSR空,说明发送完毕,发下个数据 { TXREG='A';//再次填充TXREG,USART模块会继续自动发送 } } }
[单片机]
PIC<font color='red'>串口</font>通信程序(3)<font color='red'>发送</font>字符
串口显示乱码的原因总结
1.USB转串口的问题 解决方法:我曾用一个12块钱的那种U转串,出现过乱码,换一个好的就没事了 2.波特率不同步的问题 解决方法:两边设置的波特率的一样,会导致这样的问题 3.在通信波特率为 38400 时,通信正常,arm 板上解受到的数据(ascII码)显示正常。 但是当波特率为 115200 时,解受到的数据就出现乱码的现象! 真的不知道,原因出现在哪里! 希望高手们,大虾们,帮我解决下这个问题! 谢谢…… 解决方法:暂无 4.用ARM2103 给电脑发送信息,用串口高度精灵看,一直接收的都是错误码 解决方法: 我用的44b0曾经出现过显示乱码的问题,在超级终端上显示的; 后来才发现是在boot汇编
[单片机]
<font color='red'>串口</font>显示乱码的原因总结
基于VB6.0的MSP430单片机与PC机串口通信设计
  串行通信已经成为计算机与其他设备进行数据交换最广泛的通信手段。主要介绍了利用MSP430 单片机的串口通信模块和VB6.0 提供的串行通信控件MSComm 实现PC 机与MSP430 单片机的串行通信,并着重阐述了在VB6.0 环境下实现的主要过程。   1 引言   随着计算机技术的不断发展,计算机应用在其发展过程中逐步形成两大分支,一是通用计算机,PC 机为代表,着眼于高速数值运算和数据处理,但实时测控能力较弱。二是嵌入式微机,以单片机为代表,着重发展测控技术,但其数值运算和数据处理能力较弱。目前,在 工业控制 以及数据采集和数据处理的大型系统中,由于PC 机软件资源丰富,人机交互方便等优点。以PC 机作为上位机,以单
[单片机]
基于VB6.0的MSP430单片机与PC机<font color='red'>串口</font>通信设计
友善2440开发板开启串口输出调试信息
2440开发板,WINCE6.0系统,系统启动时发现串口工具没有输出任何信息,Google一下,原来是友善把它屏蔽了。 解决方法: 1、修改Debug.c文件,增加#define BSP_DEBUG_UART0,如下所示 // Function: OEMInitDebugSerial // // Initializes the debug serial port // #if defined(KITL_SERIAL_UART0) #define BSP_DEBUG_UART0 #elif defined(KITL_SERIAL_UART1) #define BSP_DEBUG_UART1 #en
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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