历史上的今天
返回首页

历史上的今天

今天是:2025年02月17日(星期一)

正在发生

2020年02月17日 | 【STM8学习笔记】STM8系列串口中断发送例程

2020-02-17 来源:eefocus

目标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

推荐阅读

史海拾趣

Elec & Eltek公司的发展小趣事

在国内市场取得一定成绩后,Elec公司开始将目光投向国际市场。为了更好地适应国际市场的需求,Elec公司积极引进国际先进技术和管理经验,并加强与国际知名企业的合作。同时,Elec公司还加大了在海外市场的营销力度,通过参加国际展会、举办技术研讨会等方式提高品牌知名度。经过多年的努力,Elec公司的产品已远销欧美、东南亚等多个国家和地区,成为国际市场上具有竞争力的电子品牌。

Comchip Technology公司的发展小趣事

随着电子行业的快速发展,Comchip Technology不断追求技术创新和产品升级。公司通过大量研发投入,成功开发出了桥式整流器、高效快速整流器等一系列具有市场竞争力的产品。这些产品不仅提高了电子设备的性能,还降低了能耗,赢得了客户的广泛认可。

华润微(CRMICRO)公司的发展小趣事

2001年,华润微成立矽科公司,开始涉足芯片设计业务。这一举措使公司能够为客户提供更加完整的解决方案,并进一步提升其市场竞争力。同时,华润微也意识到封装测试在半导体产业链中的重要性,于是在2003年成立安盛公司,开始进入封装测试领域。通过建立6英寸产线,华润微进一步巩固了其在半导体产业链中的地位。

Global Mixed-Mode Technology Inc公司的发展小趣事
如果报警灯频繁误报或漏报,可能是由于电路中的元器件损坏、接触不良或设置不当等原因造成的。此时需要检查电路中的元器件是否完好、连接是否牢固以及设置参数是否正确等。如果发现问题需要及时修复或更换损坏的元器件并重新调整设置参数以确保电路的正常工作。同时还需要注意定期对电路进行维护和保养以延长其使用寿命并提高其可靠性。
EDAL公司的发展小趣事

EDAL公司成立于XXXX年,由一群富有远见和创新精神的电子工程师创立。公司初期专注于电子设计自动化(EDA)工具的研发,致力于提升集成电路设计的效率和质量。EDAL公司凭借其独特的算法和高效的设计工具,在EDA领域崭露头角,吸引了众多客户的关注。

DESIGNERSYSTEMS公司的发展小趣事

DESIGNERSYSTEMS公司非常注重人才的培养和引进。他们建立了一套完善的人才培养机制,通过内部培训、外部交流等多种方式不断提升员工的综合素质和专业能力。同时,DESIGNERSYSTEMS还积极引进国内外优秀人才,为公司的发展注入新的活力和创新力。这种对人才的重视和投入使得DESIGNERSYSTEMS在电子行业中保持了持续的创新力和竞争力。

问答坊 | AI 解惑

测量并抑制存储器件中的软误差

  软误差是半导体器件中无法有意再生的“干扰”(即数据丢失)。它是由那些不受设计师控制的外部因素所引起的,包括α粒子、宇宙射线和热中子。许多系统能够容忍一定程度的软误差。例如,如果为音频、视频或静止成像系统设计一个预压缩捕获缓冲 ...…

查看全部问答>

关于写wince6的spi应用,如何配置deviceiocontrol来初始呢?急求!!!

小弟最近在写wince6一些设备的测试应用, createfile打开spi设备后,该如何初始化spi的基本配置呢? 用deviceiocontrol吗?但是不知道设置哪些参数来初始化 请各位帮帮忙!…

查看全部问答>

诚心救助?帮忙看一下!

各位嵌入式爱好者网友:     我先说一下,我今年27了,一直在做vb的开发,老感觉待不下去了,想去做一些事情,例如创业。我一直是搞技术的,希望通过技术开发一款产品,这点我可以找合作伙伴一起做。 后来就找到了嵌入式开发这里。我要 ...…

查看全部问答>

c#用playsound函数为什么没声音

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; namespace soundpdatest {     public partial class Form ...…

查看全部问答>

宏里面再定义宏可以嘛?可以举一个例子?

宏里面再定义宏可以嘛?可以举一个例子? …

查看全部问答>

急!西南电子业行情如何?XDJM们给点建议啊

9月初的(成都)电子展的规模据说近五百家,我们的两个主要的竞争对手都第一次参加了,我们老大想参加,但实际上我们目前在西南的客户很少。不太了解那边的状况(我们公司提供电子生产制造中用的一种高精度测试设备,目前的主要客户在沿海地区)。 ...…

查看全部问答>

STM32BootMode几个问题

1 最高波特率是多少?手册上说:1.5.2 Maximum baud rateBHigh is the highest baud rate for which the deviation still does not exceed the&n ...…

查看全部问答>

2440启动代码疑惑

2440启动代码中有段代码设置大小端如下: ASSERT :DEF:ENDIAN_CHANGE [ ENDIAN_CHANGE ASSERT :DEF:ENTRY_BUS_WIDTH [ ENTRY_BUS_WIDTH=32 b ChangeBigEndian ;DCD 0xea000007 ] [ ENTRY_BUS_WIDTH=16 andeq r14,r7,r0,lsl #20 ;DCD 0x0007 ...…

查看全部问答>

功率MOSFET的温度系数

http://bbs.21dianyuan.com/45741.html …

查看全部问答>

大家会在什么情况下去看TI给的源代码?

最开始的时候是手册看的没感觉,就去看代码(发现更没感觉),主要是寄存器定义不清楚,后来对着User Guide看代码就轻松很多。 后来是要用到某个模块,就图简单,从范例里面把设置代码抄过来。…

查看全部问答>