UART串口初始化函数
- 格式:doc
- 大小:29.00 KB
- 文档页数:4
C8051F340串口学习笔记UART0 是一个异步、全双工串口,它提供标准8051 串行口的方式1 和方式3。
UART0具有增强的波特率发生器电路,有多个时钟源可用于产生标准波特率。
接收数据缓冲机制允许UART0 在软件尚未读取前一个数据字节的情况下开始接收第二个输入数据字节。
UART0 有两个相关的特殊功能寄存器:串行控制寄存器(SCON0)和串行数据缓冲器(SBUF0)。
写SBUF0时自动访问发送寄存器;读SBUF0时自动访问接收寄存器,不可能从发送数据寄存器中读数据。
如果UART0 中断被允许,则每次发送完成TI0 位被置‘1’或接收到数据字节RI0 位被置‘1’时将产生中断。
当CPU转向中断服务程序时硬件不清除UART0 中断标志。
中断标志必须用软件清除。
UART0 波特率由定时器1 工作在8 位自动重装载方式产生,定时器1 应被配置为方式2,即8 位自动重装载方式,定时器1 的时钟可以在6个时钟源中选择:SYSCLK、SYSCLK/4、SYSCLK/12、SYSCLK/48、外部振荡器时钟/8 和外部输入T1。
其中T1CLK是定时器1 的时钟频率,T1H是定时器1 的高字节(重载值)UART0 提供标准的异步、全双工通信,其工作方式(8 位或9 位)通过S0MODE来选择8 位UART每个数据字节共使用10 位:一个起始位、8 个数据位(LSB 在先)和一个停止位,软件向SBUF0 寄存器写入一个字节时开始数据发送。
在发送结束时中断标志TI0被置1UART1(仅C8051F340/1/4/5有)UART1的使用与UART0基本大致相同,但是。
UART1 包含一个由16 位定时器和可编程预分频器构成的专用波特率发生器,能产生很宽围的波特率,有多个时钟源可用于产生标准波特率。
UART1 有六个相关的特殊功能寄存器。
三个用于波特率发生器(SBCON1、SBRLH1 和SBRLL1),两个用于数据格式、控制和状态功能(SCON1 和SMOD1),一个用于发送和接收数据(SBUF1)。
uartprintf用法-回复UART(Universal Asynchronous Receiver/Transmitter)是一种通信协议,常用于单片机和外部设备之间的串行通信。
而UART printf(uartprintf)则是在嵌入式系统中使用的一种用于串口输出调试信息的函数。
在本文中,我将详细介绍uartprintf的用法和一些常见的应用场景。
UART printf函数是将格式化的字符串通过UART串口输出,便于开发人员进行嵌入式系统的调试和维护。
它的使用非常简单,只需要按照一定的格式编写打印信息的字符串即可。
下面详细介绍uartprintf的用法和注意事项。
步骤一:头文件包含在使用uartprintf函数之前,首先需要引入相应的头文件。
通常,UART 相关的头文件会包含在嵌入式系统的开发包中,如stdio.h或uart.h。
通过以下代码引入头文件:#include <stdio.h>步骤二:初始化UART串口在使用uartprintf函数之前,需要对UART串口进行初始化。
串口初始化的具体过程因芯片型号和开发环境而异。
在一些常见的嵌入式系统中,我们可以使用类似下面的代码进行初始化:void UART_Init(){初始化串口配置,波特率、数据位、停止位等...}步骤三:编写格式化的字符串uartprintf函数接受一个格式化的字符串作为参数,所以我们需要根据具体的需要,编写相应的格式化字符串。
格式化字符串中可以包含普通的文本字符,也可以包含特殊的转换说明符,用于输出变量的值。
以下是一些常见的转换说明符及其用法:- d:输出整数。
- f:输出浮点数。
- c:输出字符。
- s:输出字符串。
- x:输出十六进制数。
假设我们要输出一个整数变量value和一个浮点数变量pi,可以这样编写格式化字符串:char message[100];int value = 10;float pi = 3.14;sprintf(message, "Value: d, Pi: f", value, pi);步骤四:使用uartprintf函数输出字符串在格式化字符串编写完成后,我们可以使用uartprintf函数将字符串通过UART串口输出。
/******************************************************************************* **************函数名:UART串口初始化函数调用:UART_init();参数:无返回值:无结果:启动UART串口接收中断,允许串口接收,启动T/C1产生波特率(占用)备注:振荡晶体为12MHz,PC串口端设置 [ 4800,8,无,1,无 ]/******************************************************************************* ***************/void UART_init (void){EA = 1; //允许总中断(如不使用中断,可用//屏蔽)ES = 1; //允许UART串口的中断TMOD = 0x20; //定时器T/C1工作方式2SCON = 0x50; //串口工作方式1,允许串口接收(SCON = 0x40 时禁止串口接收)TH1 = 0xF3; //定时器初值高8位设置TL1 = 0xF3; //定时器初值低8位设置PCON = 0x80; //波特率倍频(屏蔽本句波特率为2400)TR1 = 1; //定时器启动}/******************************************************************************* ***************//******************************************************************************* **************函数名:UART串口初始化函数调用:UART_init();参数:无返回值:无结果:启动UART串口接收中断,允许串口接收,启动T/C1产生波特率(占用)备注:振荡晶体为11.0592MHz,PC串口端设置 [ 19200,8,无,1,无 ]/******************************************************************************* ***************/void UART_init (void){EA = 1; //允许总中断(如不使用中断,可用//屏蔽)ES = 1; //允许UART串口的中断TMOD = 0x20; //定时器T/C1工作方式2SCON = 0x50; //串口工作方式1,允许串口接收(SCON = 0x40 时禁止串口接收)TH1 = 0xFD; //定时器初值高8位设置TL1 = 0xFD; //定时器初值低8位设置PCON = 0x80; //波特率倍频(屏蔽本句波特率为9600)TR1 = 1; //定时器启动}/******************************************************************************* ***************//******************************************************************************* **************函数名:UART串口接收中断处理函数调用:[SBUF收到数据后中断处理]参数:无返回值:无结果:UART串口接收到数据时产生中断,用户对数据进行处理(并发送回去)备注:过长的处理程序会影响后面数据的接收/******************************************************************************* ***************/void UART_R (void) interrupt 4 using 1{ //切换寄存器组到1unsigned char UART_data; //定义串口接收数据变量RI = 0; //令接收中断标志位为0(软件清零)UART_data = SBUF; //将接收到的数据送入变量 UART_data//用户函数内容(用户可使用UART_data做数据处理)//SBUF = UART_data; //将接收的数据发送回去(删除//即生效)//while(TI == 0); //检查发送中断标志位//TI = 0; //令发送中断标志位为0(软件清零)}/******************************************************************************* ***************//******************************************************************************* **************函数名:UART串口接收CPU查寻语句(非函数体)调用:将下面内容放入主程序参数:无返回值:无结果:循环查寻接收标志位RI,如有收到数据则进入if (RI == 1){}备注:/******************************************************************************* ***************/unsigned char UART_data; //定义串口接收数据变量if (RI == 1){ //接收中断标志位为1时UART_data = SBUF; //接收数据 SBUF 为单片机的接收发送缓冲寄存器RI = 0; //令接收中断标志位为0(软件清零)//用户函数内容(用户可使用UART_data做数据处理)//SBUF = UART_data; //将接收的数据发送回去(删除//即生效)//while(TI == 0); //检查发送中断标志位//TI = 0; //令发送中断标志位为0(软件清零)}/******************************************************************************* ***************//******************************************************************************* **************函数名:UART串口发送函数调用:UART_T (?);参数:需要UART串口发送的数据(8位/1字节)返回值:无结果:将参数中的数据发送给UART串口,确认发送完成后退出备注:/******************************************************************************* ***************/void UART_T (unsigned char UART_data){ //定义串口发送数据变量SBUF = UART_data; //将接收的数据发送回去while(TI == 0); //检查发送中断标志位TI = 0; //令发送中断标志位为0(软件清零)}/******************************************************************************* ***************//******************************************************************************* **************函数名:UART串口发送字符串函数调用:UART_TC (?);参数:需要UART串口发送的数据(8位/1字节)返回值:无结果:向串口发送一个字符串,长度不限。
STM32F407的UART串口初始化STM32F407xx内嵌四个通用同步/异步接收器(USART1,USART2,USART3 和USART6)和两个通用异步收发器(UART4和UART5)。
这6个接口提供异步通信的IrDASIR ENDEC支持,多机通信模式,单线半双工通信模式LIN主/从功能。
USART1和USART6接口能够速度高达10.5 Mbit / s的通信其他可用的接口通信高达5.25bit/s。
USART1,USART2,USART3和USART6还提供硬件管理的CTS,RTS信号,智能卡的模式(ISO7816兼容)和类似的SPI通信能力。
所有接口都可以通过DMA控制器。
这里只使用了两根线的最简单串口设置。
硬件环境:STM32F4-Discovery软件环境:MDK4.7a实现的功能:1、串口初始化,2、通过串口发送数据3、中断方式接收数据,并将接收到的数据回送。
使用库函数操作首先,配置NVIC使用NVIC_PriorityGroupConfig()设置优先级分组,使用NVIC_Init ()对NVIC进行初始化本文引用地址:http://21ic/app/mcu/201812/783926void NVIC_Config(){NVIC_InitTypeDef NVIC_InitStructure;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x03;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(。
ZYNQ驱动初始化套路--UART串⼝@⽬录套路如下:1、定义硬件信息结构体namePs_Config *Config;2、定义驱动信息结构体namePs name_Ps;3、根据设备号和⾃动⽣成的硬件.c⽂件,获取外设硬件信息Config = namePs_LookupConfig(DEVICE_ID); //uart0、SD0都是0,uart1、SD1都是14、调⽤外设初始化函数对name_Ps赋值,后期就只需⽤name_Ps进⾏各种操作了!Status = namePs_CfgInitialize(&name_Ps, Config, Config->BaseAddress);if (Status != XST_SUCCESS){return XST_FAILURE;}5、这⼀步不同外设就不同了:调⽤配置函数对外设进⾏配置,例如uart就设置波特率等,MIO就设置输⼊输出等。
UART 串⼝ZYNQ使⽤的UART1,在PL中使能。
使⽤时想在PS改下串⼝波特率,发现代码中没有串⼝初始化函数。
BSP中有串⼝初始化函数,是以中断⽅式初始化的,但是没有调⽤。
int UartPDSA_Initiation(XScuGic *IntcInstPtr, XUartPDSA *xptrUartRs232, u16 DeviceId, u16 UartIntrId)后使⽤如下代码,加在main()函数中即可改变波特率:XUartPs_Config *Config;XUartPs Uart_Ps;Config = XUartPs_LookupConfig(1);//UART0写0,UART1写1if (NULL == Config){return XST_FAILURE;}Status = XUartPs_CfgInitialize(&Uart_Ps, Config, Config->BaseAddress);if (Status != XST_SUCCESS){return XST_FAILURE;}XUartPs_SetBaudRate(&Uart_Ps, 128000);//写⼊想⽤的波特率是PL完成了串⼝初始化?SDK 的BSP完成的初始化?偶然在官⽅例程发现:UART被bootrom初始化完成:GPIO之 MIO控制 LEDMIO0、7、8接LED灯#include "xparameters.h" //器件参数信息#include "xstatus.h" //包含XST_FAILURE和XST_SUCCESS的宏定义#include "xil_printf.h" //包含print()函数#include "xgpiops.h" //包含PS GPIO的函数声明#include "sleep.h" //包含sleep()函数//宏定义GPIO_DEVICE_ID#define GPIO_DEVICE_ID XPAR_XGPIOPS_0_DEVICE_ID//连接到MIO的LED#define MIOLED0 7 //连接到MIO7#define MIOLED1 8 //连接到MIO8#define MIOLED2 0 //连接到MIO0XGpioPs Gpio; // GPIO设备的驱动程序实例int main(){int Status;XGpioPs_Config *ConfigPtr;print("MIO Test! \n\r");ConfigPtr = XGpioPs_LookupConfig(GPIO_DEVICE_ID);Status = XGpioPs_CfgInitialize(&Gpio, ConfigPtr,ConfigPtr->BaseAddr);if (Status != XST_SUCCESS){return XST_FAILURE;}//设置指定引脚的⽅向:0输⼊,1输出XGpioPs_SetDirectionPin(&Gpio, MIOLED0, 1);XGpioPs_SetDirectionPin(&Gpio, MIOLED1, 1);XGpioPs_SetDirectionPin(&Gpio, MIOLED2, 1);//使能指定引脚输出:0禁⽌输出使能,1使能输出XGpioPs_SetOutputEnablePin(&Gpio, MIOLED0, 1);XGpioPs_SetOutputEnablePin(&Gpio, MIOLED1, 1);XGpioPs_SetOutputEnablePin(&Gpio, MIOLED2, 1);while (1) {XGpioPs_WritePin(&Gpio, MIOLED0, 0x0); //向指定引脚写⼊数据:0或1 XGpioPs_WritePin(&Gpio, MIOLED1, 0x0);XGpioPs_WritePin(&Gpio, MIOLED2, 0x0);sleep(1); //延时1秒XGpioPs_WritePin(&Gpio, MIOLED0, 0x1);XGpioPs_WritePin(&Gpio, MIOLED1, 0x1);XGpioPs_WritePin(&Gpio, MIOLED2, 0x1);sleep(1);}return XST_SUCCESS;}。
8051单片机的UART0串口初始化1、C8051f的UART0是异步、全双工串口。
其波特率发生器规定由定时器1定时器提供。
可配置为8位UART或9位UART(多机通讯第九位用于片选作用)。
SYSCLK=24.5MHZ(我的板子采用内部晶振频率作为系统时钟)BAUDRATE=115200(波特率)2、初值TH1 Tl1配置由上述公式可计算初值:TH1 = 256-(SYSCLK/BAUDRATE/2)而程序内是TH1 = -(SYSCLK/BAUDRATE/2),这两种是相同的。
第一种是以正数的二进制形式保存在计算机内。
第二种是负数,取反加1求得补码保存在计算机中。
结果是相同的。
每当TL1中的值溢出后TH1存储的重装载值装载到TL1中开始计数。
3、初始化程序(以后使用可直接调用此初始化函数)。
SYSCLK与BAUDRATE参数修改即可void UART0_Init (void){SCON0 = 0x10; // SCON0:8-bit variable bit rate// level of STOP bit is// 使能RX接收// ninth bits are zeros// 清除接收和发送中断if (SYSCLK/BAUDRATE/2/256 《1){TH1 = -(SYSCLK/BAUDRATE/2);CKCON |= 0x10; // T1M = 1; SCA1:0 = xx} else if (SYSCLK/BAUDRATE/2/256 《4){TH1 = -(SYSCLK/BAUDRATE/2/4);CKCON |= 0x01; // T1M = 0; SCA1:0 = 01。
/******************************************************************************* **************
函数名:UART串口初始化函数
调用:UART_init();
参数:无
返回值:无
结果:启动UART串口接收中断,允许串口接收,启动T/C1产生波特率(占用)
备注:振荡晶体为12MHz,PC串口端设置 [ 4800,8,无,1,无 ]
/******************************************************************************* ***************/
void UART_init (void){
EA = 1; //允许总中断(如不使用中断,可用//屏蔽)
ES = 1; //允许UART串口的中断
TMOD = 0x20; //定时器T/C1工作方式2
SCON = 0x50; //串口工作方式1,允许串口接收(SCON = 0x40 时禁止串口接收)TH1 = 0xF3; //定时器初值高8位设置
TL1 = 0xF3; //定时器初值低8位设置
PCON = 0x80; //波特率倍频(屏蔽本句波特率为2400)
TR1 = 1; //定时器启动
}
/******************************************************************************* ***************/
/******************************************************************************* **************
函数名:UART串口初始化函数
调用:UART_init();
参数:无
返回值:无
结果:启动UART串口接收中断,允许串口接收,启动T/C1产生波特率(占用)
备注:振荡晶体为11.0592MHz,PC串口端设置 [ 19200,8,无,1,无 ]
/******************************************************************************* ***************/
void UART_init (void){
EA = 1; //允许总中断(如不使用中断,可用//屏蔽)
ES = 1; //允许UART串口的中断
TMOD = 0x20; //定时器T/C1工作方式2
SCON = 0x50; //串口工作方式1,允许串口接收(SCON = 0x40 时禁止串口接收)TH1 = 0xFD; //定时器初值高8位设置
TL1 = 0xFD; //定时器初值低8位设置
PCON = 0x80; //波特率倍频(屏蔽本句波特率为9600)
TR1 = 1; //定时器启动
}
/******************************************************************************* ***************/
/******************************************************************************* **************
函数名:UART串口接收中断处理函数
调用:[SBUF收到数据后中断处理]
参数:无
返回值:无
结果:UART串口接收到数据时产生中断,用户对数据进行处理(并发送回去)
备注:过长的处理程序会影响后面数据的接收
/******************************************************************************* ***************/
void UART_R (void) interrupt 4 using 1{ //切换寄存器组到1
unsigned char UART_data; //定义串口接收数据变量
RI = 0; //令接收中断标志位为0(软件清零)
UART_data = SBUF; //将接收到的数据送入变量 UART_data
//用户函数内容(用户可使用UART_data做数据处理)
//SBUF = UART_data; //将接收的数据发送回去(删除//即生效)
//while(TI == 0); //检查发送中断标志位
//TI = 0; //令发送中断标志位为0(软件清零)
}
/******************************************************************************* ***************/
/******************************************************************************* **************
函数名:UART串口接收CPU查寻语句(非函数体)
调用:将下面内容放入主程序
参数:无
返回值:无
结果:循环查寻接收标志位RI,如有收到数据则进入if (RI == 1){}
备注:
/******************************************************************************* ***************/
unsigned char UART_data; //定义串口接收数据变量
if (RI == 1){ //接收中断标志位为1时
UART_data = SBUF; //接收数据 SBUF 为单片机的接收发送缓冲寄存器
RI = 0; //令接收中断标志位为0(软件清零)
//用户函数内容(用户可使用UART_data做数据处理)
//SBUF = UART_data; //将接收的数据发送回去(删除//即生效)
//while(TI == 0); //检查发送中断标志位
//TI = 0; //令发送中断标志位为0(软件清零)
}
/******************************************************************************* ***************/
/******************************************************************************* **************
函数名:UART串口发送函数
调用:UART_T (?);
参数:需要UART串口发送的数据(8位/1字节)
返回值:无
结果:将参数中的数据发送给UART串口,确认发送完成后退出
备注:
/******************************************************************************* ***************/
void UART_T (unsigned char UART_data){ //定义串口发送数据变量
SBUF = UART_data; //将接收的数据发送回去
while(TI == 0); //检查发送中断标志位
TI = 0; //令发送中断标志位为0(软件清零)
}
/******************************************************************************* ***************/
/******************************************************************************* **************
函数名:UART串口发送字符串函数
调用:UART_TC (?);
参数:需要UART串口发送的数据(8位/1字节)
返回值:无
结果:向串口发送一个字符串,长度不限。
备注:例:UART_TC("d9887321$"); 此函数需要#include <string.h>头文件支持。
/******************************************************************************* ***************/
void UART_TC (unsigned char *str){
while(*str != '\0'){
UART_T(*str);
*str++;
}
*str = 0;
}
/******************************************************************************* ***************/。