历史上的今天
返回首页

历史上的今天

今天是:2025年02月08日(星期六)

正在发生

2020年02月08日 | STM8L的USART1串口通信详解 含例程

2020-02-08 来源:eefocus

STM8L除了可以进行串口通信,还可支持红外通信,智能卡协议,这些功能后续会开发,发布程序源码。STM8L还可以使用DMA缓存数据,减少CPU负担,为了简单起见,本文没有用到DMA功能。


只需要简单的配置发送的字长度,停止位数,波特率,打开发送接收,就可以进行串口数据收发。下图为串口发送数据流程。


对于串口发送数据,需要注意的是,打开发送后,数据发送完成,如果不关闭中断,程序会一直进入中断。所以在确保数据发送完成后,需关闭中断,退出发送数据。


本文通过周期性(500ms)的向上位机发送一组数据,来演示STM8L的串口通信。串口接收部分程序也已经调试好,只需把while循环中的程序注释掉,设置断点,查看上位机发送来的数据即可。

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

*开发环境:IAR for stm8 v1.40.1

*硬件平台:STM8L-DISCOVERY

*功能说明:每隔500ms通过PC3引脚向上位机发送一组数据。串口配置为:波特为9600,8个数据位,1个停止位,无奇偶校验。

*作    者:茗风

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

#include"iostm8l152c6.h"

 

#include"stdbool.h"

 

#include"stdint.h"

 

 

#define TXBUF_SIZE 9

 

#define RXBUF_SIZE 25

 

bool bTX_finished=false;

 

bool bRX_finished=false;//串口接收完一帧数据标志位

 

uint8_t ui8TX_number = 0;

 

uint8_t ui8RX_counter=0;

 

uint8_t ui8TX_buffer[TXBUF_SIZE]={0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99};

 

uint8_t ui8RX_buffer[RXBUF_SIZE];

 

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

*  名    称:void delay_10ms(uint8_t x_ms)

*  功    能:延时10ms

*  入口参数:无

*  出口参数:无

*  说    明:

*  范    例:无

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

 

void delay_100ms(void)

 

{

 

  uint8_t i,j;

 

  for(i=0;i<255;i++)//2*255个指令周期

 

    for(j=0;j<255;j++);//2*255个指令周期

 

  //delay_10ms共消耗 x_ms*2*255+2*x_ms个指令周期  

 

  //255*2*255+2*255=130610us=130ms

 

  //此延时函数,延时时间为130ms

 

  //16M/8/2=1M 一个指令周期为1us

 

}

 

 

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

* 名             称:void UART_Init(void)

* 功            能:UART定时器初始化系统

* 入口   参数:无

* 出口   参数:无

* 说       明:UART初始化为 9600 1 8 n

* 范      例:无

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

 

void UART_Init(void)

 

{

 

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

 

    PC_DDR_DDR2 =0;//输入

 

    PC_CR1_C12  =1;//上拉输入

 

    PC_CR2_C22 =0;

 

    

 

    PC_ODR_ODR3 =1;

 

    PC_CR1_C13  =1;//推挽输出

 

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

 

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

 

    

 

 

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

 

    

 

    //开启引脚的UART功能

 

    //00: USART1_TX on PC3 and USART1_RX on PC2

 

    //01: USART1_TX on PA2 and USART1_RX on PA3

 

    //10: USART1_TX on PC5 and USART1_RX on PC6

 

    SYSCFG_RMPCR1_USART1TR_REMAP =0;//PC2,PC3

 

    //如果需要使用其他引脚作为串口发送接收引脚,请在这里选择

 

    

 

    

 

    //设置串口工作方式

 

    USART1_CR1_M =0;//1 start bit,8 data bit,n stop bit

 

    USART1_CR3_STOP0=0;USART1_CR3_STOP1=0;//1 stop bit

 

    //设置波特率

 

    //波特率设置为9600

 

    // 2000000/9600=208    //2000000是此时系统的主时钟频率,默认8分频,16M/8=2M

 

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

 

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

 

    USART1_BRR1 =0x0D;

 

 

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

 

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

 

    USART1_CR2_REN=1;//使能接收

 

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

 

}

 

void main(void)

 

{

 

//  GPIO_Init();

 

  UART_Init();

 

  asm("rim");               //enable interrupts

 

  while(1)

 

  {

 

    ui8TX_number=9;

 

    USART1_CR2_TEN=1;//打开发送

 

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

 

    delay_100ms();

 

    delay_100ms();

 

    delay_100ms();

 

    delay_100ms();

 

//    asm("wfi");

 

  }

 

}

 

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

* 名 称: UART_OnTx()

* 功 能: UART的Tx事件处理函数

* 入口参数:无

* 出口参数:无

* 说 明:发送ui8TX_buffer数组中的数据,发送完成后,置位bTX_finished标志位,下一次进入中断后关闭发送

* 范 例:无

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

 

 

#pragma vector=USART_T_TXE_vector

 

__interrupt void USART_TX_ISR (void)

 

{

 

  static uint8_t cnts=0;

 

  if(bTX_finished && USART1_SR_TC==1)

 

  {

 

    bTX_finished=false;

 

    USART1_CR2_TIEN=0;//关闭发送中断

 

    USART1_CR2_TEN=0;//关闭发送

 

  }

 

  else if(USART1_SR_TC==1)

 

  {

 

    USART1_DR=ui8TX_buffer[cnts++];

 

    if(cnts==ui8TX_number)

 

    {

 

      cnts=0;

 

      bTX_finished=true;

 

    }

 

  }

 

}

 

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

* 名               称: UART_OnRx()

* 功         能: UART的Tx事件处理函数

* 入口           参数:无

* 出口           参数:无

* 说               明: 

* 范              例:无

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

 

#pragma vector=USART_R_RXNE_vector

 

__interrupt void USART_RX_ISR(void)

 

{

 

  static uint8_t ui8RX_temp=0;

 

  if(USART1_SR_RXNE==1)

 

  {

 

    ui8RX_temp = USART1_DR;

 

  }

 

}


推荐阅读

史海拾趣

Amkor公司的发展小趣事

Amkor Technology是一家全球领先的半导体封装和测试服务提供商。以下是关于Amkor公司发展的五个相关故事:

  1. 成立与早期发展:Amkor Technology成立于1968年,总部位于美国亚利桑那州的钱德勒市。公司最初是一家小型半导体封装服务提供商,专注于为集成电路制造商提供先进的封装解决方案。在成立初期,Amkor致力于技术创新和质量控制,赢得了客户的信任和认可。

  2. 技术创新与产品多样化:随着电子行业的发展和技术的进步,Amkor不断进行技术创新,并扩展了产品线。公司推出了一系列新的封装技术和解决方案,包括先进的3D封装、薄型封装、系统封装等。这些技术创新和产品多样化使得Amkor能够满足不同客户的需求,并保持在市场竞争中的领先地位。

  3. 全球布局与生产基地建设:为了更好地服务全球客户,Amkor在全球范围内建立了多个生产基地和分销中心。除了在美国的设施外,公司还在亚洲、欧洲和其他地区建立了生产工厂和研发中心。这种全球布局有助于降低生产成本、提高生产效率,并加强了在全球市场的竞争力。

  4. 合作伙伴关系与客户服务:Amkor与全球各种半导体制造商建立了紧密的合作伙伴关系,共同推动技术创新和产品发展。公司致力于为客户提供优质的封装和测试解决方案,并与客户密切合作,开发定制化的解决方案。Amkor的客户服务团队提供全方位的技术支持和服务,确保客户的满意度和业务成功。

  5. 持续发展与业绩表现:Amkor持续实现了稳健的增长和良好的业绩表现。公司不断投入研发,并提升生产效率和管理水平,以提高盈利能力和市场竞争力。Amkor的业绩稳步增长,为股东创造了可观的价值,并使得公司成为半导体封装和测试服务领域的领先企业之一。

这些故事展示了Amkor Technology从成立初期到如今在技术创新、产品多样化、全球布局、合作伙伴关系建设和持续发展等方面取得的重要进展。

Alpha Wire公司的发展小趣事

Alpha Wire公司是一家在电子行业中知名的制造商,专注于生产高性能电线、电缆和线束。虽然我无法提供准确的发展故事,但我可以向你介绍一些关于Alpha Wire公司的背景和其在行业中的重要性。

  1. 公司成立:Alpha Wire公司成立于1922年,总部位于美国新泽西州。创始人是一位名叫韦尔纳·布雷德的工程师,他创立了Alpha Wire公司,旨在为不同领域的电子设备提供高质量的电线和电缆。

  2. 技术创新:Alpha Wire公司在其发展历程中一直致力于技术创新和产品质量的提升。公司不断投资于研发,并采用最新的材料和生产工艺,以确保其产品在性能和可靠性方面处于行业领先地位。

  3. 产品线扩展:随着时间的推移,Alpha Wire公司不断扩展其产品线,以满足不断变化的市场需求。除了标准的电线和电缆产品外,公司还开发了各种特种电线和线束,如耐高温、耐化学腐蚀、防火等特性的产品,以满足不同行业和应用的需求。

  4. 全球市场拓展:Alpha Wire公司在其发展过程中不断拓展其市场份额,通过建立全球分销网络和合作伙伴关系,将其产品销往世界各地。公司不仅在北美市场占据重要地位,还在欧洲、亚洲和其他地区建立了业务和生产基地,以更好地服务全球客户。

  5. 质量和可靠性:作为一家具有悠久历史的公司,Alpha Wire始终将质量和可靠性视为其产品的核心竞争力。公司严格遵循国际标准和质量管理体系,对原材料进行严格筛选和检验,并采用先进的生产工艺和严格的质量控制程序,以确保产品的稳定性和一致性。

以上是关于Alpha Wire公司的一些基本信息,虽然我无法提供具体的发展故事,但希望这些信息能够帮助你了解该公司在电子行业中的重要性和影响力。

AAC [American Accurate Components]公司的发展小趣事

近年来,AAC公司一直致力于技术创新和产品研发。在声学、光学、触感、传感器及半导体等领域,AAC积累了近三十年的技术经验。这些技术积累使得AAC能够不断推出具有创新性和竞争力的新产品。例如,AAC在某次创新峰会上发布了超宽频音质的Opera高低音分频方案、旗舰级体验大众化的声学触觉一体化Combo方案以及安卓触感“天花板级”的仿生振感马达等三大技术新品。这些新品的发布不仅彰显了AAC在电声元器件领域的技术实力,也为智能手机等消费电子行业注入了新的活力。

这五个故事只是AAC公司发展历程中的一部分,但它们足以展现AAC在电子行业中的不断进取和创新精神。从一个合资企业起步,到如今成为全球著名的电声元器件制造商之一,AAC凭借敏锐的市场洞察、坚定的发展决心以及持续的技术创新,在电子行业书写了自己的传奇篇章。

请注意,以上内容仅是基于参考文章的事实性描述,并未涉及对AAC公司的任何评价或判断。同时,由于我无法获取AAC公司的实时信息,因此以上内容可能与AAC公司的最新发展情况有所出入。如需了解更多关于AAC公司的最新信息,建议查阅相关新闻或访问AAC公司官方网站。

Hirosugi-Keiki公司的发展小趣事

近年来,AAC公司一直致力于技术创新和产品研发。在声学、光学、触感、传感器及半导体等领域,AAC积累了近三十年的技术经验。这些技术积累使得AAC能够不断推出具有创新性和竞争力的新产品。例如,AAC在某次创新峰会上发布了超宽频音质的Opera高低音分频方案、旗舰级体验大众化的声学触觉一体化Combo方案以及安卓触感“天花板级”的仿生振感马达等三大技术新品。这些新品的发布不仅彰显了AAC在电声元器件领域的技术实力,也为智能手机等消费电子行业注入了新的活力。

这五个故事只是AAC公司发展历程中的一部分,但它们足以展现AAC在电子行业中的不断进取和创新精神。从一个合资企业起步,到如今成为全球著名的电声元器件制造商之一,AAC凭借敏锐的市场洞察、坚定的发展决心以及持续的技术创新,在电子行业书写了自己的传奇篇章。

请注意,以上内容仅是基于参考文章的事实性描述,并未涉及对AAC公司的任何评价或判断。同时,由于我无法获取AAC公司的实时信息,因此以上内容可能与AAC公司的最新发展情况有所出入。如需了解更多关于AAC公司的最新信息,建议查阅相关新闻或访问AAC公司官方网站。

上海超致公司的发展小趣事

在电子产品行业,品质控制和质量保证是企业生存和发展的关键。上海超致始终将品质放在首位,建立了严格的质量管理体系,从原材料采购到生产制造、产品检测等各个环节都严格把控品质。公司还引进了先进的生产设备和检测仪器,确保产品的可靠性和稳定性。这种对品质的执着追求使得上海超致的产品在市场上获得了良好的口碑和广泛的认可。

FRONTIER公司的发展小趣事

背景:假设FRONTIER公司也涉足绿色能源领域。

发展故事:面对全球气候变化和环境问题的日益严峻,FRONTIER公司积极响应可持续发展号召,开始布局绿色能源产业。公司通过引进先进的光伏技术、储能技术和智能电网技术,成功打造了一系列绿色能源解决方案。这些解决方案不仅有效降低了企业的能耗和碳排放量,还为全球能源转型和环境保护做出了积极贡献。FRONTIER的绿色转型不仅赢得了市场的认可和支持,也为公司未来的可持续发展奠定了坚实基础。

问答坊 | AI 解惑

msp430串口收发程序

现在想用msp430的串口进行收发程序开发,但不知道对方一次发送过来多少数据?如何才能完整接收呢?我感觉使用中断的方式一次只能接收一个字节的数据,不能把对方发送的完整数据全部接收!请问有什么解决办法?谢谢! 另外,使用串口通信,一方是ms ...…

查看全部问答>

wince下读写IC卡速度问题

在pc下测试,串口读写只要3s 在wince下测试,居然10s啊,怎么解决?? 怎么办 ?? 救命 …

查看全部问答>

有一套串口通信协议需要分析破解,寻求达人帮助

有一套串口通信协议需要分析破解,寻求达人帮助! 谢谢! to:hawking20001981(东东VC++Primer) 请速和我联系! QQ:652650436…

查看全部问答>

为什么RTC计数器有时会清零?

                                 请教:用STM32F101的RTC作时历时钟时,在有后备电池的情况下,发现偶尔时钟会清零,好像发生在断电或加电后,有办法 ...…

查看全部问答>

【原创】:关于42x0TA问题

我用ta做pwm输出,设置如下: void init_timer_a(void) { TACTL = TASSEL1 +TACLR + MC_1; //选择SMCLK为时钟,定时器清空,选择up模式,中断允许 TACCTL0 = CCIE; //将CCR0设为比较模式,中断允许+ TAIE TACCR0 = 1 ...…

查看全部问答>

stm32F101死机,手动复位无效,只能上电复位

stm32F101死机,手动复位无效,只能上电复位,我应该检查什么地方?…

查看全部问答>

新手求解答 AD软件中 DB9的原理图后面怎么会有两条线

AD软件中 DB9的原理图后面怎么会有两条线 如图所示正常DB9不是没有吗 怎么去掉??新手求解答…

查看全部问答>

稳压电源中的芯片可以选择LM2576吗?

刚开始接触电源模块,想要自己做一个输出12V/25W的电源,给功放供电,初步方案是220V交流经过24V/30W变压器,然后通过桥堆和一大一小2个滤波电容,再经过LM2576-ADJ开关稳压芯片,最终输出12V,25w的电源,可我看到上大部分线性稳压电源的稳压芯片 ...…

查看全部问答>