历史上的今天
返回首页

历史上的今天

今天是:2024年12月04日(星期三)

正在发生

2019年12月04日 | 基于STM8的UART发送和中断接收

2019-12-04 来源:eefocus

1. 综述

UART的基础知识,通用异步收发传输器(Universal Asynchronous Receiver/Transmitter),通常称作UART,是一种异步收发传输器。


做软件开发的人都知道打印信息的重要,说到打印信息,我们就不得不说UART串口打印。做单片机开发的人,打印信息主要的来源就是UART串口打印。因此,UART会比较常用到,所以在此对UART串口进行一个说明。


2. 关于STM8S103手册的UART简介

3. UART初始化参数详细讲解


3.1 BaudRate(波特率)


所谓的波特率就是每秒钟传送的码元符号的个数,可以理解为串口的输出速率。可选的波特率有很多,常用的波特率有115200bps,9600bps等...


3.2 WordLength(数据长度)


即为传输的数据转成二进制后有多少位。可选的数据位数:8位、9位,常用的数据位数为8位。


3.3 StopBits(停止位)


即为数据帧的尾部传输停止位个数。可选的停止位:0.5位、1位、1.5位、2位,常用的停止位为1位。


3.4 Parity(奇偶校验)


即为输出结果是否经过奇偶校验,根据被传输的一组二进制代码的数位中“1”的个数是奇数或偶数来进行校验。可选的奇偶校验:奇校验、偶校验、不进行奇偶校验。常用的为不进行奇偶校验。


3.5 SyncMode(同步模式 )(本博客对此模式只进行一个粗略讲解,如想深入了解,请察看官方的手册。)


通信时双方是否有共同的时钟参考,能否通过时钟参考准确收发数据。可选择的模式有很多,常用的模式为 同步模式禁用,SLK PIN禁用。


3.6 Mode(UART模式)


可选的模式:接收使能、接收不使能、发送使能、发送不使能、发送接收都使能。常用的模式为发送接收都使能。

 

4. 例程


4.1 编译环境


我的编译环境是IAR,这款软件是现在STM8的主流平台,比较推荐。不过我打算等到STCubeMX更新出比较方便的版本后再去使用Keil5,因为我在用STM32的时候就是利用Keil5,的确很方便,你们也可以学着用一下。


4.2 主芯片


我的主芯片是STM8S系列中的103,其中STM8S的003、005、和103、105,配置一样(外设和CPU频率,FLASH),在代码相同的情况下均可进行烧写。


4.3 库文件的添加


我们的工程可以在IAR中的官方例程中复制,操作过程:打开STM8S_StdPeriph_Lib(这是一个官方的库文件,下载IAR STM8包的时候就携带,里面有库文件和相对应的例程),将Libraries文件复制到你工程所在的文件下,并将有关于ADC的库文件添加到你的工程列表当中。添加完成后,就可以开始编写代码了(如果你将全部的库文件都添加进来的话,编译程序后库文件还有红点报错的话,这是因为你选的芯片上没有该功能,你需要将其删掉才能不报错。)如图。

                

4.4 代码


4.4.1 UART初始化


我们所要用到的IO口和Uart都需要初始化,而IO的初始化就比较简单,具体步骤可以参考我上一篇博客,UART的初始化就需要到stm8s_uart1.c库文件中找到相对应的函数进行调用才能初始化成功。该库文件中的大部分函数都有一定意义和价值,大家可以根据需求进行调用,我这里就不进行一一细述了。


  下面是串口初始化的函数。


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

 * Function Name  : MX_UART1_Init

 * Description    : UART1_Init

 * Input          : None

 * Output         : None

 * Return         : None

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

 void MX_UART1_Init(void)

 {

   //初始化UART中的所有寄存器

   UART1_DeInit();

   

   //发送接收引角口初始化

   GPIO_Init(Uart_TX_GPIO_Port, Uart_TX, GPIO_MODE_OUT_PP_HIGH_FAST);

   GPIO_Init(Uart_RX_GPIO_Port, Uart_RX, GPIO_MODE_IN_PU_IT);  

   

   //UART的参数初始化

   UART1_Init(115200, UART1_WORDLENGTH_8D, UART1_STOPBITS_1, UART1_PARITY_NO, UART1_SYNCMODE_CLOCK_DISABLE, UART1_MODE_TXRX_ENABLE);

   

   //UART中断使能

   UART1_ITConfig(UART1_IT_RXNE_OR, ENABLE);

   

   //使能UART

   UART1_Cmd(ENABLE);

   

   //中断使能

   enableInterrupts(); 

   

 }

 

扩展一下基本知识就是:起始位 +数据(8位) +停止位(这里没有校验位)。

所以我们传输一个字节数据要用到10个位。这样算下来 115200/10 = 11520 字节/s。(即速度为11520 B/s)


通俗一点的说的话,KB是1024个B,11520 (B/S) / 1024 = 11.25KB/S就是我们这个功能所拥有的速度了。


这个是为了让你知道它的速度局限在哪里。因此来做一些它所力所能及的事情。


4.4.2 发送


我们使用的是unsigned char类型的数据,所以要在stm8s_uart1.c文件里找到UART1_SendData8(uint8_t Data)函数然后放在main函数里调用就行,然后发送字符串的话,我们需要用到此函数。此函数在库函数中没有,所以需要我们手动添加进去,不过也相当于该库文件的一个功能,我们可以直接将此函数放进库文件里面,位置就放在发送函数UART1_SendData8(uint8_t Data)的下面即可。


/*

 * @brief  Transmits 8 bit *data through the UART peripheral.

 * @param  Data: the data to transmit.

 * @retval None

 */

void UART1_SendWord(uint8_t *Data)

{

  while(*Data)

  {

      UART1_SendData8(*Data++);

      while(!UART1_GetFlagStatus(UART1_FLAG_TXE));

  }

    

}


这里直接调用这两个函数便可实现发送。不过,发送的数据0x31是十六进制数,转成10十进制后为49,即为1的ASCII值。


    UART1_SendData8(0x31);

    UART1_SendWord("国维不行"); 

 

实验结果:

4.4.2 中断接收


   if(UART1_GetITStatus(UART1_IT_RXNE) != RESET)        //检查指定的UART1中断是否发生。 

   {

     UART1_SendData8(UART1_ReceiveData8());             //将接收的数据再用串口发送出去

     UART1_ClearITPendingBit(UART1_IT_RXNE);            //清除UART1挂起标志

   }

 


由于IAR中库函数工程模板的中断都写在 stm8s_it.c 库文件中,我们需要打开将上面的代码加入函数内部中,如图。


如果不懂的如何操作中断函数,请看这里:我们只需要在中断的库函数里面添加代码即可,不用在主函数中对该中断函数进行调用,只要我们使能中断,系统会自动帮我们运行该函数的。


注意:这里的中断处理有芯片型号的区分,如果不是STM8S103芯片请自行选择相对应的芯片的中断处理函数。

实验结果:

5. 结尾


相对来说,STM8库文件的UART调用还是比较容易的,希望该博客能够帮助到大家实现UART功能。

推荐阅读

史海拾趣

Electronicon Kondensatoren GmbH公司的发展小趣事

ELECTRONICON Kondensatoren GmbH,其前身为RFT Kondensatorenwerk Gera,于20世纪30年代末与德国图林根东部的Gera的电容器制造商建立了紧密的合作。自此,ELECTRONICON开始崭露头角,专注于电容器技术的研发与生产。公司始终将产品的质量和可靠性作为核心理念,为未来的发展奠定了坚实的基础。

Fluke公司的发展小趣事

随着全球市场的不断变化和发展,ELECTRONICON积极实施国际化战略,拓展海外市场。公司在全球范围内建立了完善的销售和服务网络,为客户提供及时、高效的服务。未来,ELECTRONICON将继续秉承“质量为本、客户至上”的经营理念,不断创新和发展,为电子行业的繁荣做出更大的贡献。

AEM [ American Electronic Materials]公司的发展小趣事

在电子行业的发展过程中,AEM始终保持着对技术创新的追求。公司不断投入巨资进行技术研发,引进先进的生产设备和制造工艺,致力于提升产品的性能和品质。通过多年的努力,AEM成功突破了多项技术难题,取得了一系列重要的技术成果。

此外,AEM还积极与产业上下游的企业进行合作,共同推动电子行业的发展。通过与供应商和客户的紧密合作,AEM不断优化供应链和销售渠道,提高了公司的运营效率和市场竞争力。

Electronic Sensor + Resistor GmbH公司的发展小趣事

在ESR公司的发展历程中,技术突破是推动其不断前进的重要动力。公司投入大量资源用于研发,不断推出具有创新性和竞争力的新产品。其中,一款基于纳米技术的微型传感器成为市场上的明星产品,其高精度、低功耗和快速响应的特性受到了用户的广泛好评。

此外,ESR公司还注重与高校和研究机构的合作,共同开展前沿技术的研发。这种产学研合作模式不仅为公司带来了源源不断的技术创新,也为公司培养了一批高素质的研发人才。

台湾丰宾(CapXon)公司的发展小趣事

面对日益激烈的市场竞争,CapXon公司始终坚持以技术创新为驱动,不断推动产业升级。公司投入大量资金用于研发新的技术和产品,以满足市场对高品质、高性能电容器的需求。通过不断的努力,CapXon成功研发出了一系列具有自主知识产权的高性能电容器产品,这些产品不仅具有更高的稳定性和可靠性,而且能够满足更广泛的应用场景需求。

ETA Electric Industry Co Ltd公司的发展小趣事

近年来,ETA Electric Industry Co Ltd积极响应全球环保倡议,致力于实现可持续发展。他们优化了生产流程,减少了废弃物和污染物的排放。同时,公司还加大了对环保型电子元器件的研发力度,推出了一系列节能、环保的新产品。这些举措不仅提升了公司的社会形象,也为其在激烈的市场竞争中增添了新的优势。

上述五个故事,讲述了ETA Electric Industry Co Ltd在电子行业的发展历程。从起步之初的艰难,到技术创新的突破,再到市场拓展和质量管理的成功,最后到对环保和可持续发展的追求,每一步都体现了公司的成长和进步。

问答坊 | AI 解惑

8051模拟i2c 双机通信

有谁做过8051模拟i2c 双机通信的啊,从机地址怎么确定啊!…

查看全部问答>

红外温度传感器的原理

现在,人们对自己的身体健康状况十分关注.都希望自己有一个好的身体。体温是人体的重要生理参数之一,对它的监测十分重要。市场上最流行的体温计是电子体温计,特别是非接触式红外体温计。目前国内开发的红外体温计主要有华中科技大学研制的“慧眼 ...…

查看全部问答>

ARM9线程冲突

    用arm9编写的两个线程,分别从串口和网口收数据。前者始终运行,后者每1.5秒运行一次。现在后者运行时前者不仅收不到数据,连时钟也发不出来。优先级都设置好的,奇了怪了,百思不得其解。盼望过路大侠指点迷津,谢谢!…

查看全部问答>

请教在arm7中怎样将数据存入flash中并读取

希望实现以下功能: 开机时,读取flash中的数据num,初始化程序 运行时,num的值会发生变化 运行结束时,将num的值存入flash中,共下次开机时使用 请教怎样才能将num的值存入flash中,并且可以读取 我使用的是周立功的easyram2131开发板, ...…

查看全部问答>

求助5402程序大于0x4000时装载出错问题

我的板子上外扩了一片sdram,如果代码少于0x4000时装载正常,大于就会报data verification at address 0x41dc,please verify targe memory and memory map. 我的cmd文件如下: -stack  1024 -heap   2048 /*************** ...…

查看全部问答>

关于lm3s系列 串口接收数据的问题

假如我串口接收FIFO设置为7/8的深度 并设置接收FIFO中断 和 接收超时中断   当我的串口接受的数据长度正好为14的整数倍时,就不会进入超时中断,请问有什么好的解决方法吗?…

查看全部问答>

UC3843的电源问题

求助,希望做开关电源的高手能够帮帮我,谢谢,帮我把UC3843的那些电容取值帮我算出来,比如C3,C4,C6,C11,C12!我自己弄出来的要么不起振,要么空载的功耗就有好几瓦,这开关电源的东西还真难整啊!谢谢各位大侠!…

查看全部问答>

【讨论】引脚中断须外置上拉/下拉电路?

配置引脚中断时,不能是数字输出模式,否则中断配置不成功。若想使用引脚内部上拉/下拉时,需配置为数字输出模式,否则上拉/下拉配置不成功。结论:引脚中断须外置上拉/下拉电路?…

查看全部问答>

【求助】MDK422下载出错 久查未决

求教,有没有人遇到类似问题或解决方法~~~~~~~~~~~~~~~~~~~~~~~~~~~ 【问题】:编辑、编译正确,但下载出问题,     【解决1:】MDK422设置正常,包括debug、utilities,但正常工程和自建工程区别就在下面, 为什么?这个 ...…

查看全部问答>

据说明天开始比赛的题都一样

本帖最后由 paulhyde 于 2014-9-15 04:01 编辑 我们老师说黑龙江那个是9天的题,所以难。咱们5日开始的题目一样,而且是3天的,难度和2011年全国那个差不多。 不知道各位有没有什么消息  …

查看全部问答>