《(9.7)--7 USART原理及应用单片机原理与应用.ppt》由会员分享,可在线阅读,更多相关《(9.7)--7 USART原理及应用单片机原理与应用.ppt(60页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第第7章章 USART原理及应用原理及应用 目录2串口概览串口概览串口结构串口结构串口引脚定义串口引脚定义串口寄存器概览串口寄存器概览串口寄存器详解串口寄存器详解STM32中断系统中断系统串口库函数串口库函数7.1 串口引脚定义与端口重映射3STM32根据芯片型号的不同资源数量也不一样,根据芯片型号的不同资源数量也不一样,F103系列系列最多可提供最多可提供5路串口有路串口有分数波特率发生器分数波特率发生器、支持同步单线通信、支持同步单线通信和和半双工半双工单线通讯单线通讯串口与总线连接方式:串口与总线连接方式:pUSART1连接在连接在APB2总线总线pUSART2/3以及以及UART4/5
2、连接在连接在APB1总线总线STM32串口一般有两种方式:查询和中断串口一般有两种方式:查询和中断p查询:串口程序不断地循环查询,看看当前有没有数据要查询:串口程序不断地循环查询,看看当前有没有数据要它传送,如果有,就帮助传送。它传送,如果有,就帮助传送。p中断:平时串口只要打开中断即可,如果发现有一个中断中断:平时串口只要打开中断即可,如果发现有一个中断来,则意味着要它帮助传输数据来,则意味着要它帮助传输数据它就马上进行数据的它就马上进行数据的传送。传送。摘自:RM0008英文版-Page38PA口 16脚PB口16脚PC口3脚PD口2脚USART2_TX:USART2_RX:USART1_
3、TX:USART1_RXUSART3_RX:USART3_TX:串口串口2串口串口1串口串口3STM32F103Cx:拥有:拥有3个个USART端口重映射图5摘自:STM32芯片手册英文版-Page30-356STM32的串口引脚除了有默认模式外,还可以将引脚进行重映像或部分重映像,具体如下所示:pUART1-TX(PA09)/UART1-RX(PA10)pUART1-TX(PB06)/UART1-RX(PB07)UART1重映像重映像pUART2-TX(PA02)/UART2-RX(PA03)pUART2-TX(PD05)/UART2-RX(PD06)UART2重映像重映像pUART3-TX
4、(PB10)/UART3-RX(PB11)pUART3-TX(PC10)/UART3-RX(PC11)UART3部分重映像部分重映像pUART3-TX(PD08)/UART3-RX(PD09)UART3全部重映像全部重映像pUART4-TX(PC10)/UART4-RX(PC11)pUART5-TX(PC12)/UART5-RX(PD02)摘自:STM32芯片手册英文版-Page30-35STM32的CPU 引脚,通过PA 端口的两个引脚PA9 和PA10,连接到一个SP3232 芯片,或者MAX232 芯片。然后再连接到DB9 串口座上。SP32327.2.1 串口功能 全双工的,异步通信全
5、双工的,异步通信 NRZ标准标准格式格式(NRZ,Non-Return to Zero)分数波特率发生器分数波特率发生器系统系统 发送和接收共用的可编程波特率,最高达发送和接收共用的可编程波特率,最高达4.5Mbits/s 可编程数据字长度可编程数据字长度(8 位或位或9位位)可配置的停止位可配置的停止位-支持支持1 或或2个停止位个停止位 单线半双工通信单线半双工通信 单独的发送器和接收器使能位单独的发送器和接收器使能位 检测标志检测标志 接收缓冲器满接收缓冲器满 发送缓冲器空发送缓冲器空 传输结束标志传输结束标志 校验控制校验控制 发送校验位发送校验位 对接收数据进行校验对接收数据进行校验
6、 7.2 串口功能与结构思考思考:何为:何为NRZ?特点和分类。思考思考:何为:何为分数分数波特率发生器波特率发生器?7.2.2 串口结构10波特率波特率控制控制CR3GTPRCPUBRR最高速率=4.5Mb/s7.4 串口波特率设置 每个串口都有一个自己独立的波特率寄存器每个串口都有一个自己独立的波特率寄存器USART_BRR,通过设置该寄存器达到配置不同,通过设置该寄存器达到配置不同波特率的目的。该寄存器的各位描述如下波特率的目的。该寄存器的各位描述如下 最低最低4位用来存放小数部分位用来存放小数部分DIV_Fraction,15:4这这12位用来存放整数位用来存放整数DIV_Mantis
7、sa。高。高16位未使用。位未使用。这里波特率的计算通过如下公式计算:这里波特率的计算通过如下公式计算:这里这里的的fpclkx(x=1、2)是给外设的时钟)是给外设的时钟(PCLK1用于串口用于串口2、3、4、5,PCLK2用于串口用于串口1),),USARTDIV是一个无符号的定点数,它的值可以有串口的是一个无符号的定点数,它的值可以有串口的BRR寄存器值得到。而我们更关心的是如何从寄存器值得到。而我们更关心的是如何从USARTDIV的值得到的值得到USART_BRR的值,因为一般我们知道的是波特率,的值,因为一般我们知道的是波特率,和和PCLKx的时钟,要求的就是的时钟,要求的就是USA
8、RT_BRR的值。的值。下面我们来介绍如何通过下面我们来介绍如何通过USARTDIV得到串口得到串口USART_BRR寄存器的值,假设我们的串口寄存器的值,假设我们的串口1要设置为要设置为9600的波特率,而的波特率,而PCLK2的时钟为的时钟为72M。这样,我们根据。这样,我们根据上面的公式有:上面的公式有:USARTDIV=72000000/9600*16=468.75那么得到:那么得到:DIV_Fraction=16*0.75=12=0 x0C;DIV_Mantissa=468=0 x1D4;这样,我们就得到了这样,我们就得到了USART1-BRR的值为的值为0 x1D4C。只要设置串口
9、。只要设置串口1的的BRR寄存器值为寄存器值为0 x1D4C就可以得到就可以得到9600的波特率。的波特率。Company Logo7.6 STM32串口中断 串口的中断接收方式:串口的中断接收方式:在驱动中频繁的使用查询方式接收数据不仅会降低系统在驱动中频繁的使用查询方式接收数据不仅会降低系统的效率而且可能使系统崩溃。采取中断方式可以很好地的效率而且可能使系统崩溃。采取中断方式可以很好地缓解这一问题。本次讲解串口缓解这一问题。本次讲解串口1的中断接收方式:的中断接收方式:用串口中断函数除了要初始化用串口中断函数除了要初始化I/O和时钟等,还要配置相和时钟等,还要配置相应的中断及中断函数。应的
10、中断及中断函数。Company LogoSTM32串口中断 STM32(Cortex-M3)中有两个优先级的概念:抢占式优先级中有两个优先级的概念:抢占式优先级和响应优先级,也把响应优先级称作和响应优先级,也把响应优先级称作“亚优先级亚优先级”或或“副优副优先级先级”,每个中断源都需要被指定这两种优先级。,每个中断源都需要被指定这两种优先级。占先式优先级占先式优先级(pre-emption priority):高占先式优先级的中断:高占先式优先级的中断事件会打断当前的主程序事件会打断当前的主程序/中断程序运行中断程序运行抢断式优先响应,抢断式优先响应,俗称中断嵌套。俗称中断嵌套。副优先级副优先
11、级(subpriority):在占先式优先级相同的情况下,高副:在占先式优先级相同的情况下,高副优先级的中断优先被响应;优先级的中断优先被响应;在占先式优先级相同的情况下,如果有低副优先级中断正在在占先式优先级相同的情况下,如果有低副优先级中断正在执行,执行,高副优先级的中断要等待已被响应的低副优先级中断高副优先级的中断要等待已被响应的低副优先级中断执行结束后才能得到响应执行结束后才能得到响应非抢断式响应非抢断式响应(不能嵌套不能嵌套)。Company Logo STM32中对中断优先级的定义 Cortex-M3允许具有较少中断源时使用较少的寄存器位指定允许具有较少中断源时使用较少的寄存器位指
12、定中断源的优先级,因此中断源的优先级,因此STM32把指定中断优先级的寄存器位把指定中断优先级的寄存器位减少到减少到4位,这位,这4个寄存器位的分组方式如下:个寄存器位的分组方式如下:第第0组:所有组:所有4位用于指定响应优先级位用于指定响应优先级第第1组:最高组:最高1位用于指定抢占式优先级,最低位用于指定抢占式优先级,最低3位用于指位用于指定响应优先级定响应优先级第第2组:最高组:最高2位用于指定抢占式优先级,最低位用于指定抢占式优先级,最低2位用于指位用于指定响应优先级定响应优先级第第3组:最高组:最高3位用于指定抢占式优先级,最低位用于指定抢占式优先级,最低1位用于指位用于指定响应优先
13、级定响应优先级第第4组:所有组:所有4位用于指定抢占式优先级位用于指定抢占式优先级Company Logo STM32中对中断优先级的定义中断优先级分组是为了给抢占式优先级和响应优先级在中断优中断优先级分组是为了给抢占式优先级和响应优先级在中断优先级寄存器的高四位分配各个优先级数字所占的位数,在一次先级寄存器的高四位分配各个优先级数字所占的位数,在一次程序中只能设定一次。程序中只能设定一次。AIRC(Application Interrupt and Reset Register)寄存器中有用寄存器中有用于指定优先级的于指定优先级的 4 bits。这。这4个个bits用于分配用于分配preem
14、ption优先级优先级和和sub优先级。优先级。可以通过调用可以通过调用STM32的固件库中的函数的固件库中的函数NVIC_PriorityGroup Config()选择使用哪种优先级分组方式,这个函数的参数有下列选择使用哪种优先级分组方式,这个函数的参数有下列5种:种:NVIC_PriorityGroup_0=选择第选择第0组组NVIC_PriorityGroup_1=选择第选择第1组组NVIC_PriorityGroup_2=选择第选择第2组组NVIC_PriorityGroup_3=选择第选择第3组组NVIC_PriorityGroup_4=选择第选择第4组组Company Logo
15、STM32中对中断优先级的定义接下来就是指定中断源的优先级:接下来就是指定中断源的优先级:要注意的几点是:要注意的几点是:1.如果指定的抢占式优先级别或响应优先级别超出了选定的优如果指定的抢占式优先级别或响应优先级别超出了选定的优先级分组所限定的范围,将可能得到意想不到的结果;先级分组所限定的范围,将可能得到意想不到的结果;2.抢占式优先级别相同的中断源之间没有嵌套关系;抢占式优先级别相同的中断源之间没有嵌套关系;3.如果某个中断源被指定为某个抢占式优先级别,又没有其它如果某个中断源被指定为某个抢占式优先级别,又没有其它中断源处于同一个抢占式优先级别,则可以为这个中断源指定任中断源处于同一个抢
16、占式优先级别,则可以为这个中断源指定任意有效的响应优先级别。意有效的响应优先级别。Company LogoSTM32串口中断 stm32库文件中的库文件中的stm32f10 x_it.c和和stm32f10 x_it.h文件中是中文件中是中断映射函数,所以需要操作串口的中断必须清楚串口的中断断映射函数,所以需要操作串口的中断必须清楚串口的中断映射函数,有些映射函数,有些it文件中并没有串口的中断映射函数,在启文件中并没有串口的中断映射函数,在启动文件动文件startup_stm32f10 x_hd.s中可以看到各种中断的映射函中可以看到各种中断的映射函数:数:从中可以看出串口从中可以看出串口2
17、的中断映射函数名为的中断映射函数名为 USART2_IRQHandlerCompany LogoSTM32串口中断 接下来就是编写中断响应函数在中断响应函数中写入进接下来就是编写中断响应函数在中断响应函数中写入进中断后想要进行的操作,本实验中是将接收端接收的数中断后想要进行的操作,本实验中是将接收端接收的数据通过串口发送出去:据通过串口发送出去:接下来将编译通过的程序下到开发板中,通过串口调试接下来将编译通过的程序下到开发板中,通过串口调试助手进行调试即可。助手进行调试即可。7.7 USART口寄存器 状态状态寄存器寄存器(USART_SR)数据数据寄存器寄存器(USART_DR):它是由两个
18、寄存器组成的,一个给发送用(发送寄存器发送寄存器 TDR),一个给接收用(接收寄存器接收寄存器 RDR)波特率波特率寄存器寄存器(USART_BRR)控制控制寄存器寄存器1(USART_CR1)控制控制寄存器寄存器2(USART_CR2)控制控制寄存器寄存器3(USART_CR3)保护保护时间和预分频寄存器时间和预分频寄存器(USART_GTPR)Company LogoSTM32串口控制STM32中每个串口都有中每个串口都有3个控制寄存器个控制寄存器USART_CR13,串口的很多配置都是通过这串口的很多配置都是通过这3个寄存器来设置的。这里个寄存器来设置的。这里我们只要用到我们只要用到US
19、ART_CR1就可以实现我们的功能了,就可以实现我们的功能了,其他的寄存器就不一一列出了。具体各位的功能及操作其他的寄存器就不一一列出了。具体各位的功能及操作方法见方法见STM32参考手册的参考手册的496497页。其中发送和接收页。其中发送和接收的中断都通过这个寄存器进行使能。的中断都通过这个寄存器进行使能。Company LogoSTM32串口数据的发送和接收STM32串口的发送和接收是通过数据寄存器串口的发送和接收是通过数据寄存器USART_DR来实现的,这是一个双寄存器,包含了发送来实现的,这是一个双寄存器,包含了发送和接收两部分。当向该寄存器写数据时,串口就会自动和接收两部分。当向该
20、寄存器写数据时,串口就会自动发送,当收到数据的时候,也在该寄存器中。发送,当收到数据的时候,也在该寄存器中。其中只用了低9位,其他位都保留且硬件强制为0。Company LogoSTM32串口数据的发送和接收STM32串口的发送和接收在库文件中分别有对应的函数,串口的发送和接收在库文件中分别有对应的函数,可直接调用,分别是:可直接调用,分别是:void USART_SendData(USART_TypeDef*USARTx,u8 Data)u8 USART_ReceiveData(USART_TypeDef*USARTx)Company LogoSTM32串口状态STM32串口的状态可通过状态
21、寄存器USART_SR读取。这里我们关注一下三个位,第5、6、7位RXNE、TC和TXE。串口寄存器详解-USART_SR27状态寄存器(USART_SR)28状态寄存器(USART_SR)摘自:RM0008英文版-Page683-684 串口寄存器详解-USART_SR29状态寄存器(USART_SR)摘自:RM0008英文版-Page683-684 串口寄存器详解-USART_DR30数据寄存器(USART_DR)摘自:RM0008英文版-Page685 串口寄存器详解-USART_BRR31波特比率寄存器(USART_BRR)摘自:RM0008英文版-Page686 串口寄存器详解-US
22、ART_CR132控制寄存器1(USART_CR1)摘自:RM0008英文版-Page686 串口寄存器详解-USART_CR133控制寄存器1(USART_CR1)摘自:RM0008英文版-Page686 串口寄存器详解-USART_CR134控制寄存器1(USART_CR1)摘自:RM0008英文版-Page686 串口寄存器详解-USART_CR235控制寄存器2(USART_CR2)摘自:RM0008英文版-Page686功能:根据USART_InitTypeDef中指定的参数,初始化外设USARTx串口串口7.8 USART_INIT 初始化串口 定义 USART_Init(USAR
23、T1,&USART_InitStructure);/初始化USARTx串口串口例如,USART_InitTypeDef USART_InitStructure;/定义结构体变量USART_InitStructure,用于初始化外设USARTx串口串口的参数/*Function Name :USART_Init*Description :Initializes the USARTx peripheral according to the specified*parameters in the USART_InitStruct.*Input :-USARTx:Select the USART or
24、 the UART peripheral.*This parameter can be one of the following values:*-USART1,USART2,USART3,UART4 or UART5.*-USART_InitStruct:pointer to a USART_InitTypeDef structure*that contains the configuration information for the*specified USART peripheral.*Output :None*Return :None*/void USART_Init(USART_T
25、ypeDef*USARTx,USART_InitTypeDef*USART_InitStruct)u32 tmpreg=0 x00,apbclock=0 x00;u32 integerdivider=0 x00;u32 fractionaldivider=0 x00;u32 usartxbase=0;RCC_ClocksTypeDef RCC_ClocksStatus;/*Check the parameters*/assert_param(IS_USART_ALL_PERIPH(USARTx);assert_param(IS_USART_BAUDRATE(USART_InitStruct-U
26、SART_BaudRate);assert_param(IS_USART_WORD_LENGTH(USART_InitStruct-USART_WordLength);assert_param(IS_USART_STOPBITS(USART_InitStruct-USART_StopBits);assert_param(IS_USART_PARITY(USART_InitStruct-USART_Parity);assert_param(IS_USART_MODE(USART_InitStruct-USART_Mode);assert_param(IS_USART_HARDWARE_FLOW_
27、CONTROL(USART_InitStruct-USART_HardwareFlowControl);/*The hardware flow control is available only for USART1,USART2 and USART3*/assert_param(IS_USART_PERIPH_HFC(USARTx,USART_InitStruct-USART_HardwareFlowControl);usartxbase=(*(u32*)&USARTx);/*-USART CR2 Configuration-*/tmpreg=USARTx-CR2;/*Clear STOP1
28、3:12 bits*/tmpreg&=CR2_STOP_CLEAR_Mask;/*Configure the USART Stop Bits,Clock,CPOL,CPHA and LastBit-*/*Set STOP13:12 bits according to USART_StopBits value*/tmpreg|=(u32)USART_InitStruct-USART_StopBits;/*Write to USART CR2*/USARTx-CR2=(u16)tmpreg;/*-USART CR1 Configuration-*/tmpreg=USARTx-CR1;/*Clear
29、 M,PCE,PS,TE and RE bits*/tmpreg&=CR1_CLEAR_Mask;/*Configure the USART Word Length,Parity and mode-*/*Set the M bits according to USART_WordLength value*/*Set PCE and PS bits according to USART_Parity value*/*Set TE and RE bits according to USART_Mode value*/tmpreg|=(u32)USART_InitStruct-USART_WordL
30、ength|USART_InitStruct-USART_Parity|USART_InitStruct-USART_Mode;/*Write to USART CR1*/USARTx-CR1=(u16)tmpreg;/*-USART CR3 Configuration-*/tmpreg=USARTx-CR3;/*Clear CTSE and RTSE bits*/tmpreg&=CR3_CLEAR_Mask;/*Configure the USART HFC-*/*Set CTSE and RTSE bits according to USART_HardwareFlowControl va
31、lue*/tmpreg|=USART_InitStruct-USART_HardwareFlowControl;/*Write to USART CR3*/USARTx-CR3=(u16)tmpreg;/*-USART BRR Configuration-*/*Configure the USART Baud Rate-*/RCC_GetClocksFreq(&RCC_ClocksStatus);if(usartxbase=USART1_BASE)apbclock=RCC_ClocksStatus.PCLK2_Frequency;else apbclock=RCC_ClocksStatus.P
32、CLK1_Frequency;/*Determine the integer part*/integerdivider=(0 x19*apbclock)/(0 x04*(USART_InitStruct-USART_BaudRate);tmpreg=(integerdivider/0 x64)0 x04);tmpreg|=(fractionaldivider*0 x10)+0 x32)/0 x64)&(u8)0 x0F);/*Write to USART BRR*/USARTx-BRR=(u16)tmpreg;在文件“stm32f10 x_usart.c”中,定义:38 STM32中断系统-N
33、VIC.C/NVIC.HNVIC.h的API函数声明void InitNVIC(void);NVIC.c的API函数实现void InitNVIC(void)ConfigNVIC();NVIC.c的内部静态函数实现static void ConfigNVIC(void)/设置NVIC中断分组2:2位抢占优先级,2位响应优先级 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);39 串口应用STEP-BY-STEPStep1:添加UART.c文件以及Queue.c/Queue.h文件对到工程Step2:防止重编译处理Step3:UART.h包含头文件D
34、ataType.h/stdio.h#ifndef _UART_H_#define _UART_H_.#endifStep4:UART.h的API函数定义void InitUART(void);/初始化驱动,缺省打开串口u8 WriteUART(u8*pBuf,u8 len);/写串口,返回已写入的字节数u8 ReadUART(u8*pBuf,u8 len);/读串口,返回读到的字节数40 串口应用STEP-BY-STEPStep6:UART.c中缓冲大小宏定义#define UART_BUF_SIZE 100Step7:UART.c中串口工作状态枚举定义/工作模式typedef enum UA
35、RT_STATE_OFF,/串口关闭 UART_STATE_ON,/串口打开 UART_STATE_MAXEnumUARTState;Step5:UART.c包含头文件#include UART.h#include Queue.h#include stm32f10 x_usart.h41 串口应用STEP-BY-STEPStep8:内部变量定义static StructCirQue s_structUARTSendCirQue;/发送串口CirQuestatic StructCirQue s_structUARTRecCirQue;/接收串口CirQuestatic u8 s_arrSendB
36、ufUART_BUF_SIZE;/发送串口Bufstatic u8 s_arrRecBufUART_BUF_SIZE;/接收串口Bufstatic u8 s_iUARTTxSts;Step9:内部静态函数声明static void InitUARTBuf(void);static u8 WriteReceiveBuf(u8 d);/写串口接收缓冲区static u8 ReadSendBuf(u8*p);/读串口发送缓冲区static void ConfigUART(void);static void EnableUARTTx(void);static void SendCharUsedByFp
37、utc(u16 ch);42 串口应用STEP-BY-STEPStep10:内部静态函数InitUARTBuf实现static void InitUARTBuf(void)i16 i;for(i=0;i UART_BUF_SIZE;i+)s_arrSendBufi=0;s_arrRecBufi =0;InitQueue(&s_structUARTSendCirQue,s_arrSendBuf,UART_BUF_SIZE);InitQueue(&s_structUARTRecCirQue,s_arrRecBuf,UART_BUF_SIZE);43 串口应用STEP-BY-STEPStep11:内
38、部静态函数WriteReceiveBuf实现static u8 WriteReceiveBuf(u8 d)u8 ok=0;/是否读取成功的标志,0-不成功,1-成功 ok=EnQueue(&s_structUARTRecCirQue,&d,1);return ok;44 串口应用STEP-BY-STEPStep12:内部静态函数ReadSendBuf实现static u8 ReadSendBuf(u8*p)u8 ok=0;/是否读取成功的标志,0-不成功,1-成功 ok=DeQueue(&s_structUARTSendCirQue,p,1);return ok;45 串口应用STEP-BY-
39、STEPStep13:内部静态函数ConfigUART实现static void ConfigUART(void).46 串口应用STEP-BY-STEPStep13-1:GPIO、USART、NVIC结构体定义 GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;Step13-2:开启GPIO和USART时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);RCC_APB
40、2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);47 串口应用STEP-BY-STEPStep13-3:配置UART对应的GPIO GPIO_InitStructure.GPIO_Pin =GPIO_Pin_9;GPIO_InitStructure.GPIO_Mode =GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin =GPIO_Pin_10;G
41、PIO_InitStructure.GPIO_Mode =GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOA,&GPIO_InitStructure);48 串口应用STEP-BY-STEPStep13-4:配置UART常规参数USART_StructInit(&USART_InitStructure);USART_InitStructure.USART_BaudRate =115200;USART_InitStructure.USART_WordLength=USART_WordLength_8b;USART_InitStructure.USART_StopBits
42、=USART_StopBits_1;USART_InitStructure.USART_Parity =USART_Parity_No;USART_InitStructure.USART_Mode =USART_Mode_Rx|USART_Mode_Tx;USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;USART_Init(USART1,&USART_InitStructure);涉及到的寄存器:涉及到的寄存器:涉及到的寄存器:涉及到的寄存器:USART_BRR/USART_CR1(M)/
43、USART_CR2(STOP1:0)/USART_CR1(PS)/USART_BRR/USART_CR1(M)/USART_CR2(STOP1:0)/USART_CR1(PS)/USART_CR1(TE)/USART_CR1(RE)/USART_CR3(CTSE/RTSE)USART_CR1(TE)/USART_CR1(RE)/USART_CR3(CTSE/RTSE)49五、技术点详解(7)串口应用STEP-BY-STEPStep13-5:配置NVIC参数NVIC_InitStructure.NVIC_IRQChannel =USART1_IRQn;NVIC_InitStructure.NVI
44、C_IRQChannelPreemptionPriority=3;NVIC_InitStructure.NVIC_IRQChannelSubPriority =3;NVIC_InitStructure.NVIC_IRQChannelCmd =ENABLE;NVIC_Init(&NVIC_InitStructure);Step13-6:UART中断使能 USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);USART_ITConfig(USART1,USART_IT_TXE,ENABLE);涉及到的寄存器:涉及到的寄存器:涉及到的寄存器:涉及到的寄存器:USAR
45、T_CR1(RXNEIE/TXEIE)USART_CR1(RXNEIE/TXEIE)Step13-7:UART使能 USART_Cmd(USART1,ENABLE);涉及到的寄存器:涉及到的寄存器:涉及到的寄存器:涉及到的寄存器:USART_CR1(UE)USART_CR1(UE)50五、技术点详解(7)串口应用STEP-BY-STEPStep13-8:将自定义的UART发送状态位置为关闭s_iUARTTxSts =UART_STATE_OFF;Step14:内部静态函数EnableUARTTx实现static void EnableUARTTx(void)s_iUARTTxSts=UART_
46、STATE_ON;/将s_iUARTTxSts的状态置为UART_STATE_ON USART_ITConfig(USART1,USART_IT_TXE,ENABLE);/发送中断使能 涉及到的寄存器:涉及到的寄存器:涉及到的寄存器:涉及到的寄存器:USART_CR1(TXEIE)USART_CR1(TXEIE)51 串口应用STEP-BY-STEPStep15:内部静态函数SendCharUsedByFputc实现static void SendCharUsedByFputc(u16 ch)USART_SendData(USART1,(u8)ch);while(USART_GetFlagSt
47、atus(USART1,USART_FLAG_TC)=RESET)涉及到的寄存器:涉及到的寄存器:涉及到的寄存器:涉及到的寄存器:USART_SR(TC)USART_SR(TC)52 串口应用STEP-BY-STEPStep16-1:UART中断服务函数实现void USART1_IRQHandler(void)u8 uData=0;if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)/接收中断 NVIC_ClearPendingIRQ(USART1_IRQn);uData=USART_ReceiveData(USART1);WriteRecei
48、veBuf(uData);下页继续.涉及到的寄存器:涉及到的寄存器:涉及到的寄存器:涉及到的寄存器:USART_CR1(RXNEIE)/USART_SR(RXNE)/USART_DRUSART_CR1(RXNEIE)/USART_SR(RXNE)/USART_DR 53 串口应用STEP-BY-STEPStep16-2:UART中断服务函数实现void USART1_IRQHandler(void).继续上页 if(USART_GetFlagStatus(USART1,USART_FLAG_ORE)=SET)/溢出 USART_ClearFlag(USART1,USART_FLAG_ORE);
49、/读SR USART_ReceiveData(USART1);/读DR 下页继续.涉及到的寄存器:涉及到的寄存器:涉及到的寄存器:涉及到的寄存器:USART_SR(ORE)/USART_DRUSART_SR(ORE)/USART_DR 54五、技术点详解(7)串口应用STEP-BY-STEPStep16-3:UART中断服务函数实现void USART1_IRQHandler(void)继续上页.if(USART_GetITStatus(USART1,USART_IT_TXE)!=RESET)USART_ClearITPendingBit(USART1,USART_IT_TXE);NVIC_C
50、learPendingIRQ(USART1_IRQn);ReadSendBuf(&uData);USART_SendData(USART1,uData);if(QueueEmpty(&s_structUARTSendCirQue)s_iUARTTxSts=UART_STATE_OFF;USART_ITConfig(USART1,USART_IT_TXE,DISABLE);涉及到的寄存器:涉及到的寄存器:涉及到的寄存器:涉及到的寄存器:USART_CR1(TXEIE)/USART_SR(TXE)/USART_DRUSART_CR1(TXEIE)/USART_SR(TXE)/USART_DR 55