基于STM8的UART发送和中断接收

2019-12-04来源: eefocus关键字:STM8  UART发送  中断接收

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功能。

关键字:STM8  UART发送  中断接收 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic481976.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:STM32 死在 while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET)
下一篇:基于STM8的IIC协议--实例篇--时钟模块(DS3231)读取

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

STM32-modbus rtu 之从机程序
STM32-modbus rtu 之从机程序以前移植过freemodbus,这次是自己重新写,只实现保持寄存器的读写。一、串口这部分跟上一篇文章主机程序一样,DMA接收,直接发送。二、错误反馈/*发送 错误反馈*/void  mb_sentACK( u8 cm,u8 err){    u16 temp;    serialTXbuf_st.buf[0] = local_addr;    serialTXbuf_st.buf[1] = cm+0x80;    serialTXbuf_st.buf[2] =  err; 
发表于 2019-12-02
STM32-modbus rtu 之从机程序
STM32 堆栈的理解
1、MDK STM32的内存分配 (摘自网络)C语言上分为栈、堆、bss、data、code段。具体每个段具体是存储什么数据的,直接百度吧。重点分析一下STM32以及在MDK里面段的划分。MDK下Code,RO-data,RW-data,ZI-data这几个段:Code是存储程序代码的。RO-data是存储const常量和指令。RW-data是存储初始化值不为0的全局变量。ZI-data是存储未初始化的全局变量或初始化值为0的全局变量。Flash=Code + RO Data + RW Data;RAM= RW-data+ZI-data;这个是MDK编译之后能够得到的每个段的大小,也就能得到占用相应的FLASH和RAM的大小
发表于 2019-12-02
STM32 堆栈的理解
STM32堆栈空间大小设置
1. 设置堆栈空间大小在使用STM32编程时,一般情况下我们不会关注堆栈空间的大小,因为在STM32的启动文件中,已经帮我们预先设置好了堆栈空间的大小。如下图所示的启动代码中,Stack栈的大小为:0x400(1024Byte),Heap堆的大小为:0x200(512Byte)。这也是为什么一个基础的工程编译后,RAM的空间也占用了1.6K左右的原因,因为堆栈的空间均分配在RAM中,可在编译的map文件中查看RAM资源占用的情况。若工程中使用的局部变量较多,定义的数据长度较大时,若不调整栈的空间大小,则会导致程序出现栈溢出,程序运行结果与预期的不符或程序跑飞。这时我们就需要手动的调整栈的大小。当工程中使用了malloc动态分配
发表于 2019-12-02
STM32堆栈空间大小设置
STM32--堆栈空间
函数的局部变量,都是存放在"栈"里面,栈的英文是:STACK.STACK的大小,可以在STM32的启动文件里面设置,以战舰开发板为例,在startup_stm32f10x_hd.s里面:Stack_Size      EQU     0x00000400                  AREA    STACK, NOINIT, READWRITE, ALIGN=3Stack_Mem       SPACE  
发表于 2019-12-02
STM32的堆栈(Heap&Stack)空间
最近做的一个项目遇到一个很莫名的错误,程序运行到某一部分时便会卡死,分析后,感觉在逻辑上并无错误,但是就是会卡死,而且不是偶然。 后来在网上查找资料怀疑是内存溢出,然后调试发现是两个函数中的的局部变量申请的内存空间太大,所以错误应该是栈溢出了。将这两个变量使用malloc申请堆段空间完美解决。下面是对STM32的堆栈(Heap&Stack)小结:内存分配空间 内核保护区栈段堆段数据区代码区代码区 :静态区 常量(const) 函数代码逻辑数据区:静态区 全局变量 局部变量+static堆段:动态区,管理者是程序员 malloc申请的空间栈段:动态区,管理
发表于 2019-12-02
STM32的堆栈(Heap&Stack)空间
stm8s 定时器2测量脉冲宽度(单位 us)
void Init_Timer2(void){  GPIO_Init(GPIOA, GPIO_PIN_3, GPIO_MODE_IN_PU_NO_IT);//输入 无中断  TIM2_TimeBaseInit(TIM2_PRESCALER_16,65536-1);       //16分频, 65ms 溢出  TIM2_Cmd(ENABLE);  }uint16_t TIM2_GetCapture(void){  /* Get the Capture  Register value */  uint16_t tmpccr = 0;&n
发表于 2019-12-02
小广播
何立民专栏 单片机及嵌入式宝典

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

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