『7x24小时有问必答』

写在前面
做软件开发的人都知道打印信息的重要,说到打印信息,我们就不得不说UART串口打印。做单片机开发的人,打印信息主要的来源就是UART串口打印。因此,关于UART相关的知识就比较重要。

printf、scanf这种标准的函数不只是可以在电脑上可以使用,在我们单片机上也同样可以使用,本文只讲述关于UART的基础知识,关于printf、scanf这一块后面将再次给大家整理一篇文章。

本文将结合“STM8S参考手册”和软件源代码给大家讲述关于UART的基础知识和用法。

为方便大家阅读,本文内容已经整理成PDF文件:
http://pan.baidu.com/s/1i5uWhJR
  
UART基础知识
通用异步收发传输器(Universal Asynchronous Receiver/Transmitter),通常称作UART,是一种异步收发传输器。

STM8S微控制器家族的通用同步异步收发器(UART1、UART2或UART3)提供了一种灵活的方法和使用工业标准NZR异步串行数据格式的外部设备之间进行全双工数据交换。STM8的UART提供宽范围的波特率选择,并且支持多处理器通讯。

主要特性
Ø  全双工的,异步通信
Ø  高精度波特率发生器系统:发送和接收共用的可编程波特率,最高达 2.5Mbits/s
Ø  可编程数据字长度(8位或9)
Ø  可配置的停止位-支持12个停止位
Ø  单线半双工通信(UART1)
Ø  检测标志:接收缓冲器满、发送缓冲器空、传输结束标志
Ø  6个带标志的中断源
Ø  2个中断向量
Ø  低功耗模式

  
UART同步模式
UART_CK脚是UART发送器时钟的输出。在起始位和停止位期间,UART_CK脚上没有时钟脉冲。根据UART_CR3寄存器中LBCL位的状态,发送器决定在最后一个有效数据位期间产生或不产生时钟脉冲。 UART_CR3寄存器的CPOL位允许用户选择时钟极性, UART_CR3寄存器上的CPHA位允许用户选择外部时钟的相位。
  
在总线空闲帧和断开帧中,外部CK时钟处于非激活状态。
  
注意
1.UART_CK脚同UART_TX脚一起联合工作。当UART发送端被禁用时(TENREN=0)UART_CKUART_TX管脚为高阻态。
  
2.在UART发送端和接收端都被禁用(TEN=REN=0)时, LBCL,CPOLCPHA位必须被正确配置以保证时钟脉冲正确工作;当发送器或接收器被激活时,这些位不能被改变。
  
3.建议在同一条指令中设置TERE,以减少接收器的建立时间和保持时间。
  
4UART只支持主模式:它不能使用来自其他设备的输入时钟以接收或发送数据(SCLK只能配置为输出状态)
  
5. 本节给出的数据只有在寄存器UART_BRR2UART_DIV[3:0]0时才有效。否则建立时间和持续时间不再是1/16位时间,而是4/16位时间。
该功能选项可以串行地控制那些由移位寄存器组成的外设,而不会失去异步通讯的功能,即仍然可以与其他异步发送接收器通讯。
  
UART同步传输的例子:
软件工程源代码

1、关于工程

本文提供的工程代码是基于前面软件工程STM8SA02TIM精确延时(阻塞式)”增加UART串口修改而来。初学的朋友可以参看我前面对应的基础文章,那些文章讲的比较详细。
  
工程源代码主要实现功能:UART串口基本输出+中断接收数据。UART串口间隔1s打印字符串“Demo...”,串口通过中断接收数据,接收到一个字符就将其通过串口发送出去。
  
本文重点讲述关于UART的内容:
UART_InitializesUART串口初始化
UART1_SendByteUART串口发送字节数据
  

2.代码分析说明

A.UART_Initializes:初始化
void UART_Initializes(void)
{
   UART1_Init((uint32_t)115200, UART1_WORDLENGTH_8D, UART1_STOPBITS_1, UART1_PARITY_NO, UART1_SYNCMODE_CLOCK_DISABLE, UART1_MODE_TXRX_ENABLE);
   UART1_Cmd(ENABLE);
   UART1_ITConfig(UART1_IT_RXNE, ENABLE);

   enableInterrupts();
}

UART1_Init:包含的参数:
115200:波特率
UART1_WORDLENGTH_8D:字长,8位或9
UART1_STOPBITS_1:停止位
UART1_PARITY_NO:奇偶校验
UART1_SYNCMODE_CLOCK_DISABLE:同步模式
UART1_MODE_TXRX_ENABLE:收发使能
  
这里每一个参数都可以有不同值,可参看其枚举类型。
  
UART1_Cmd(ENABLE):使能UART1.
  
UART1_ITConfig(UART1_IT_RXNE, ENABLE):使能中断接收
  
enableInterrupts():使能全局中断。

B.UART1_SendByte:发送字节数据
void UART1_SendByte(uint8_t Data)
{
   while((UART1_GetFlagStatus(UART1_FLAG_TXE)==RESET));
   UART1_SendData8(Data);
   while((UART1_GetFlagStatus(UART1_FLAG_TC)==RESET));
}

while((UART1_GetFlagStatus(UART1_FLAG_TXE)==RESET)):等待发送为空
UART1_FLAG_TXE代表发送寄存器为空。
  
UART1_SendData8(Data):发送字节数据
  
while((UART1_GetFlagStatus(UART1_FLAG_TC)==RESET)):等待传输完成
UART1_FLAG_TC代表发送完成标志。

C.中断接收
位于stm8s_it.c文件下:
INTERRUPT_HANDLER(UART1_RX_IRQHandler, 18)
{
    uint8_t temp;
  
    temp = UART1_ReceiveData8();
    UART1_SendData8(temp);
}

这里只是简单的一个Demo例程,接收到数据,将其通过串口发送出去。

UART串口有接收数据中断,会置位接收标志,平常我们响应中断,一般都会清楚中断标志,但串口中断接收数据,我们都会去读取串口接收数据,读取数据会自动清除标志位。见参考手册中“状态寄存器UART_SR

D.主函数功能
while(1)
{
   LED_ON;   
   TIMDelay_Nms(500);
   LED_OFF;   
   TIMDelay_Nms(500);

   UART1_Printf((uint8_t*)"Demo...");  
}

主函数里面实现间隔一段时间(1s),通过UART串口发送字符串“Demo...”。

下载
STM8S资料:

http://pan.baidu.com/s/1o7Tb9Yq
  
软件源代码工程(STM8S-A04_UART基本收发数据):
http://pan.baidu.com/s/1c2EcRo0
  
提示:如果网盘链接失效,可以微信公众号“底部菜单”查看更新链接。  

最后
微信搜索“EmbeddDeveloper” 或者扫描下面二维码、关注,查看更多精彩内容!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

上一主题上一主题         下一主题下一主题
QQ手机版小黑屋粤ICP备17165530号

关于我们·投诉举报· 用户帮助· 联系我们 · 本站服务 · 版权声明· 隐私政策 · 投搞指南

法律保护:PLC技术网,plcjs.com,plcjs.net等字样
Copyright 2010-2030. All rights reserved. 


微信公众号二维码 抖音二维码 百家号二维码 今日头条二维码哔哩哔哩二维码