Universal asynchronous receiver transmitter (UART)
UART基本介绍:
通用异步收发器UART他的功能非常强大
我们只使用UART的全双工异步通信功能,使用中断接收数据。
UART_RX:串行数据输入。
UART_TX:串行数据输出。
硬件支持:
连接串口(RS232)实现在超级终端里输入输出

软件支持:
超级终端,teraterm-4.75

1、配置UART,我们使用UART2
(1)设置波特率为115200,设置数据字段长为8字,使用1个停止位,无基偶校验,UART Clock disabled,打开发送和接收使能
以上基本设置使用一个函数进行封装设置:

函数内部实现:
设置数据字段长为8字:UART2->CR1 |= 0x00;
使用1个停止位: UART2->CR3 |= 0x00;
使用基数位校验:UART2->CR1 |= 0x00;
UART Clock disabled、打开发送和接收使能等等
(2)打开接收中断,当接收发生或者溢出发生时候,产生接收中断

(3)UART使能
UART2->CR1 &= (uint8_t)(~0x02);
(4)全局中断使能
enableInterrupts();
总体UART配置函数实现如下代码所示:
static void UART2_Config(void)
{
/* EVAL COM (UART) configuration -----------------------------------------*/
/* USART configured as follow:
- BaudRate = 115200 baud
- Word Length = 8 Bits
- One Stop Bit
- Odd parity
- Receive and transmit enabled
- UART Clock disabled
*/
UART2_Init((uint32_t), UART2_WORDLENGTH_8D,UART2_STOPBITS_1, UART2_PARITY_NO,
UART2_SYNCMODE_CLOCK_DISABLE, UART2_MODE_TXRX_ENABLE); /* Enable the UART Receive interrupt: this interrupt is generated when the UART
receive data register is not empty */
UART2_ITConfig(UART2_IT_RXNE_OR, ENABLE); /* Enable the UART Transmit complete interrupt: this interrupt is generated
when the UART transmit Shift Register is empty */
UART2_ITConfig(UART2_IT_TXE, ENABLE); /* Enable UART */
UART2_Cmd(ENABLE); /* Enable general interrupts */
enableInterrupts();
}
UART2_Config
2、UART输出功能
如果直接使用C语言的printf函数,只会在编译器的Terminal-I/O中输出,不会在我们想要的超级终端里面输出,所以需要对输出函数做重定向;
实现每次想要输出的时候,将信息打印到超级终端中,故重定向putchar (int c)函数,在函数内使用UART的传送数据功能就可以了,即将要输出的信息写入UART的数据寄存器
#define PUTCHAR_PROTOTYPE int putchar (int c)
...
/**
* @brief Retargets the C library printf function to the UART.
* @param c Character to send
* @retval char Character sent
*/
PUTCHAR_PROTOTYPE
{
/* Write a character to the UART2 */
UART2_SendData8(c);
/* Loop until the end of transmission */
while (UART2_GetFlagStatus(UART2_FLAG_TXE) == RESET); return (c);
}
3、UART输入功能
输入功能实际上是字符串处理过程的实现,在超级终端中输入内容实际上是在UART的数据寄存器里写内容,所我们只需要去数据寄存器里面读取并处理字符串即可;
- 处理函数功能
首先我们得定义一个支持终端回显的函数uart_GetStr,其中功能包括:
(1)当有我们在终端里敲键盘的时候会立马有正确的内容显示;
(2)当按下特殊按键的时候会有正确的反应;比如backspace会删除一个字符;return会表示输入完毕进入发送;
(3)对于其他特殊案件处理不了应当屏蔽;比如不想实现delete功能,删除刚刚读入的delete字符,并不会回显;
- 函数实现:
uart_GetStr传入的第一个参数是指向接收数据数组的指针,第二个参数表示是否允许回显;
几个有用变量:
__IO uint8_t ReciveBuff = 0; //save the current char
uint8_t RxBuffer[32] = {0}; //save the input string
__IO uint8_t RxCounter = 0; //the length of valid string
所以,RxBuffer就是uart_GetStr函数的第一个参数,在uart_GetStr函数内部会对每一个字符进行处理,正确的字符才放入RxBuffer中;
//====================================================================================
//Function Name | dbg_GetStr
//Description | Get string via UART port.
//Input | *p_recv_buff : pointer to receive data buffer
// | b_echo_on : echo back on or off
//Output | detect terminal(0x0d character) :TRUE or FALSE
//Remark |
//====================================================================================
uint8_t uart_GetStr(uint8_t *p_recv_buff, bool b_echo_on)
{
uint8_t b_end = ;
int i;
static uint8_t len = ;
static uint8_t pos = ;
static uint8_t esc_seq = ;
uint8_t c; // Get a character.
if((c = ReciveBuff) == ){
return ;
}
// echo back
if(b_echo_on){
printf("%c",c); //show the input
} //Check
switch(esc_seq){
// Normal
case :
// Return(Terminate)
if(c == 0x0d){
p_recv_buff[len] = ;
len = pos = ; // clear
if(b_echo_on){
printf("\n");
}
b_end = ;
}
// Back Space
else if(c == 0x08){
if(len){
if(b_echo_on){
printf(" ");
printf("%c",0x08); // BS
}
len--; // update length info.
pos--; // update pos info
}
}
// ESC
else if(c == 0x1b){
esc_seq = ;
}
// DEL
else if(c == 0x7f){
if(len){
DeleteChar(pos, len, &p_recv_buff[]);
len --; // update length info
if(b_echo_on){
printf("%s",&p_recv_buff[pos]);
printf(" ");
printf("%c",0x08); // BS
// move cursor to character end.
for(i = ; i < len - pos; i++){
printf("%c",0x1b); // ESC
printf("%c",'[');
printf("%c",'D');
}
}
}
}
// Other
else{
p_recv_buff[pos] = c;
len++; // update length info
pos++; // update pos info
}
break;
// ESC SEQ -> 1st
case :
if(c == '['){
esc_seq = ; // Next seq.
}
else{
esc_seq = ; // not support(to normal)
}
break;
//ESC SEQ -> 2nd
case :
if(c=='D'){
if(pos){
pos--; // "<-" key
}
}
else if(c=='C'){
if(pos < len){
pos++; // "->" key
}
}
esc_seq = ; // To normal
break;
} return (b_end);
}
uart_GetStr
uart_GetStr函数值为0或者为1,只有在终端中输入回车时才会返回1,其他情况均返回0;
有了这一特点,我们在使用这个函数的时候,只需要获取返回值,当返回0时,把处理过后的、用户正确输入的字符串打印出来看;
- 运行流程
(1)当终端中有输入的时候,即数据寄存器不为空,从而触发接收中断;
(2)在接收中断中,我们每次从数据寄存器UART2->DR中读取一个字节,赋值到ReciveBuff;
(3)然后调用uart_GetStr函数,对当前输入字符进行处理;(即每一个输入调用一次处理函数)
(4)将uart_GetStr函数的返回值赋值给RT;
INTERRUPT_HANDLER(UART2_RX_IRQHandler, )
{ /* Read one byte from the receive data register and send it back */ ReciveBuff = (UART2_ReceiveData8() & 0x7F); //get input char RT = uart_GetStr(RxBuffer, TRUE); //operate the char }
interrupt
(5)在主函数里死等,直到RT的值变为1(表示有return发生,即一次输入完毕);
(6)当RT=1时,主函数输出正确的输入字符串RxBuffer(这里可以实现更强大的功能,此处只是简单实现验证功能,可以对正确字符串做判断后实现更强大的功能)
void main(void)
{
/* Clock configuration -----------------------------------------*/
CLK_Config(); /* TIM4 configuration -----------------------------------------*/
TIM4_Config(); /* UART2 configuration -----------------------------------------*/
UART2_Config(); while(){
printf("\n\rplease input something: \n\r"); while(){ //wait until input something if(RT) // return occurred
{
RT = ; //clear flag printf("your put is:");
printf("%s\n\r",RxBuffer); //verify the input /*-- operate the string --*/
/*------------------------*/ //memset(RxBuffer,0,32); //clear the buffer
break; //operation finished
} } /*-- or operate the string here --*/
if(strcmp(RxBuffer, "Hello") == )
{ //case sensitive
printf("\n\rHello World !!\n\r");
}
/*--------------------------------*/ } }
main
- 说明:
这里的打印和上面的回显虽然都是输出到终端,但是不同的是,回显是为了让用户知道自己是在实时输入内容的,而打印是把用户本次输入的字符串处理之后再一并返回给终端,方便用户检查自己输入的内容;
如用户输入:ABCED'backspace''backspace'DE
在终端中实时回显的就是字符串:ABCED'backspace''backspace'DE
而打印的字符串是处理过后的字符串,为:ABCDE
把uart_GetStr的第二个参数分别设置为TRUE和FALSE后观察终端输入操作的不同,这样就能明白他们的不同了。
Universal asynchronous receiver transmitter (UART)的更多相关文章
- STM8S——Universal asynchronous receiver transmitter (UART)
UART基本介绍: 通用异步收发器UART他的功能非常强大 我们只使用UART的全双工异步通信功能,使用中断接收数据. UART_RX:串行数据输入. UART_TX:串行数据输出. 硬件支持: 连接 ...
- Universal Asynchronous Receiver/Transmitter
USART簡介與特性 NRZ標準資料格式(Mark/Space) 半雙工/全雙工 Synchronous 同步傳輸 CLOCK SKEW Asynchronous 非同步傳輸 半/全雙工.同步/非同步 ...
- k64 datasheet学习笔记52---Universal Asynchronous Receiver/Transmitter (UART)
1.前言 UART实现与外设或CPU的通信 2. UART概述 2.1基本特性 (1)Full-duplex operation (2)Standard mark/space non-return-t ...
- 27. USART, Universal synchronous asynchronous receiver transmitter
27.1 USART introduction 通用同步异步接收发射机(USART)对需要NRZ异步串行数据格式行业标准的外部设备,提供了一个灵活的全双工数据交换的方法.USART使用分数波特率生成器 ...
- UART to Serial Terminal(转载)
前一篇<UART Explained>介绍了UART的基本信息,重点分析了UART的信号.本文摘录的文章则重点介绍了波特率(Baud Rate)相关的内容,波特率越高,传输速度越快,但实际 ...
- Software UART, Timer, PWM, External Interrupt
How can you add extra hardware UARTs to a 32bit TMS470 ARM7-based microcontroller at zero cost? Solu ...
- UART学习之路(一)基本概念
第一篇博客,首先记录一下这一个多星期来的学习内容. UART学习之路第一篇,是UART的基本概念介绍.后续会用STM32F103的串口与PC机通信.最后使用Verilog HDL写出串口发送模块和接收 ...
- SAE J1708 DS36277 MAX3444, DS75176B
http://en.wikipedia.org/wiki/J1708 J1708 SAE J1708 is a standard used for serial communications betw ...
- dsp之BF531笔记
获得更多资料欢迎进入我的网站或者 csdn或者博客园 很久以前的BF531的笔记,觉得有用分享出来.摘自于open dsp 通用Gpio ADSP-BF53x 处理器上有16 个PF 接口,这些接口就 ...
随机推荐
- Nginx教程(二) Nginx虚拟主机配置
Nginx教程(二) Nginx虚拟主机配置 1 虚拟主机管理 1.1 Nginx管理虚拟主机 虚拟主机使用的是特殊的软硬件技术,它把一台运行在因特网上的服务器主机分成一台台“虚拟”的主机,每台虚拟主 ...
- (入门篇 NettyNIO开发指南)第三章-Netty入门应用
作为Netty的第一个应用程序,我们依然以第2章的时间服务器为例进行开发,通过Netty版本的时间服务报的开发,让初学者尽快学到如何搭建Netty开发环境和!运行Netty应用程序. 如果你已经熟悉N ...
- 【shell脚本实例】一个恶作剧—— kill掉占用CPU较高的matlab进程
我们实验室有台服务器,博士们在服务器上跑MATLAB,基本都是4核都是超过95%的CPU占用,想了个恶作剧的shell 定时kill掉MATLAB程序,是不是很邪恶啊,哈哈~~~ 不过我只是干过一次 ...
- No matching provisioning profiles found for "Applications/MyApp.app”问题解决
新开发的一个app打包报错,度娘谷歌了好久,废了不少时间,发现错误提示已经很明显了,只是自己没读懂而已,先说下问题和解决方法,给同意遇到这个问题的你: Failed to locate or gene ...
- 东正王增涛浅析OA信息化整合平台系统在企业中的应用价值
王增涛说OA信息化整合平台系统作为企业管理中最基础的管理软件,已在企业成长道路上存在多年,它的应用开启了智能移动办公的先河,也让企业的办公流程管理更加的便捷.高效.流畅.省时.省力,它的使用不但让企业 ...
- VR全景智慧城市,开启“上帝视角”体验‘身临其境’
VR全景把不同的场景 分为若干个VR视角点 进入一个视角点,用户便能开启"上帝视角" 转动手机,身临其境地360度转动察看,对场景的全貌和细节一目了然. 人生处处有尴尬 比如大 ...
- 使用HAL库函数建立STM32F2工程
一.建立一个新的文件夹,新建三个文件夹User.Driver.Project,还可以加一个Doc存放工程的相关说明等等. 1.将STM32F2xx的库函数(HAL函数库)中的Drivers文件夹中的所 ...
- sql备份文件兼容性问题
第一步: 右键需要备份的数据库,选择"属性"
- (原创) Maven查看JAR包的依赖关系
如果是用命令行,可进入项目所在目录,然后输入: mvn dependency:tree ,来查看jar包依赖关系. 另外还可以在eclipse操作,如下图所示: 点击run后,开始输出JAR包依赖树. ...
- 与我们息息相关的internet服务(1)---域名服务
在起步一个公司,从组建的技术上,可能要准备很多东西,其中一个就是我们熟悉的域名-----域名可以用在邮箱中.网站中等等 域名,听起来很怪的一个词(他类似于电话本的作用),但理解起来很简单,想法也很简单 ...