《STM32学习笔记:USART通信.docx》由会员分享,可在线阅读,更多相关《STM32学习笔记:USART通信.docx(5页珍藏版)》请在第壹文秘上搜索。
1、STM32学习笔记:USART串口通信1 .串口的基本概念在STM32的参考手册中,串口被描述成通用同步异步收发器(USART),它提供了一种灵活的方法与使用工业标准NRZ异步串行数据格式的外部设备之间进展全双工数据交换。USART利用分数波特率发生器提供宽范围的波特率选择。它支持同步单向通信和半双工单线通信,也支持UN局部互联网智能卡协议和DA1红外数据组织)S/RENDEC标准,以及调制解调器(CTS/RTS)操作。它还允许多处理器通信。还可以使用DMA方式,实现高速数据通信。USART通过3个引脚与其他设备连接在一起,任何USART双向通信至少需要2个引脚:承受数据输入(RX)和发送数据
2、输出(TX)RX:承受数据串行输入。通过过采样技术来区别数据和噪音,从而恢复数据。TX:发送数据输出。当发送器被制止时,输出引脚恢更到它的Vo端口配置。当发送器被激活,并且不发送数据时,TX引脚处处于高电平。在单线和智能卡模式里,此I/O口被同时用于数据的发送和接收。2 .串口的若何工作的一般有两种方式:查询和中断。(1)查询:串口程序不断地循环查询,看看当前有没有数据要它传送。如果有,就帮助传送(可以从PC到STM32板子,也可以从STM32板子到PC)。(2)中断:平时串口只要翻开中断即可。如果发现有一个中断来,那么意味着要它帮助传输数据它就马上进展数据的传送。同样,可以从PC到STM3板
3、子,也可以从STM32板子到Pj3 .串口的硬件连接我用的奋斗STM32V3开发板拥有二路RS-232接口,CPUPA9-US1-TXP68)、PA10-US1-RX(P69PA9-US2-TX(P25PA10-US2-RX(P26)通过MAX3232实现两路RS-232接口,分别连接在XS5和XS17接口上。USARTl在系统存储区启动模式下,将通过该口通过PC对板上的CPU进展ISP,该口也可作为普通串口功能使用,JP3,JP4的短路冒拔去,将断开第二路的RS232通信,仅作为TTL通信通道。4 .编程实例我们要对串口进展操作,首先要将STM32的串口和CPU进展连接。在Windows操作
4、系统中,有一个自带的系统软件叫“超级终端。VISTA以上的操作系统去掉了这个软件,不过可以从XP的系统中,更制“hypertrm.dll和hypertrm.exe到windows/SyStem32文件夹下,然后双击运行hypertrm.exe,就可以看见超级终端的运行界面了。运行超级终端以后,会弹出“连接描述”,输入名称和选择图标,这个地方随便写个什么名称都可以。然后弹出“连接到”设置,在“连接时使用选择你自己PC和STM32连接的COMx,如果不知道是哪个CoM口的话,可以在PC的设备管理器中找到。在选择好COM口之后,会弹出一个“属性”对话框,在“&J秒选择和你STM32中设置的波特率一致
5、就好,数据位也是按照STM32的设置来选择,奇偶校验选择无,停顿位选择1,数据流控制选择无。注意,以上的选项都必须和STM32中的串口设置相匹配,要不然可能会出现一些未知错误。配置好超级终端之后,我们便可以开场对5TM32进展编程了。编程一般按照如下步骤进展:(1) ReC配置;(2) GPlo配置;(3) USART配置;(4) NVlC配置;(5)发送/接收数据。在RCC配置中,我们除了常规的时钟设置以外,要记得翻开USART相对应的10口时钟,USART时钟,还有管脚功能复用时钟。在GPlO配置中,将发送端的管脚配置为复用推挽输出,将接收端的管脚配置为浮空输入。在USART的配置中,通过
6、USARTJnitTypeDef构造体对USART进展初始化操作,按照自己所需的功能配置好就可以了。注意,在超级终端的设置中,需要和这个里面的配置相对应。由于我是采用中断接收数据的方式,所以记得在USART的配置中药翻开串口的中断,同时最后还要翻开串口。在NWc的配置中,主要是USART1RQChanneI的配置,和以前的笔记中讲述的中断配置类似,不会配置的可以参考以前的笔记。全部配置好之后就可以开场发送/接收数据了。发送数据用USART_SendData()函数,接收数据用USART_ReceiveData()函数。具体的函数功能可以参考固件库的参考文件。根据USART的配置,在发送和接收时
7、,都是采用的8bits一帧来进展的,因此,在发送的时候,先开辟一个缓存区,将需要发送的数据送入缓存区,然后再将缓存区中的数据发送出去,在接收的时候,同样也是先接收到缓存区中,然后再进展相应的操作。注意在对数据进展发送和接收的时候,要检查USART的状态,只有等到数据发送或接收完毕之后才能进展下一帧数据的发送或接收。采用USART_GetFlagStatUS()函数。同时还要注意的是,在发送数据的最开场,需要去除一下USART的标志位,否那么,第1位数据会丧失。因为在硬件匏位之后,USART的状态位TC是置位的。当包含有数据的一帧发送完成之后,由硬件将该位置位。只要当USART的状态位TC是置位
8、的时候,就可以进展数据的发送。然后TC位的置零那么是通过软件序列来去除的,具体的步骤是“先读USART_5R,然后写入USAR1_DR,只有这样才能够去除标志位TC,但是在发送第一帧数据的时候,并没有进展读USARLR的操作,而是直接进展写操作,因此IC标志位并没有清空,那么,当发送第一帧数据,然后用USARjGetFlagStatUS()检测状态时返回的是已经发送完毕(因为TC位是置的所以程序会马上发送下一帧数据,那么这样,第一帧数据就被第二帧数据给覆盖了,所以看不到第一帧数据的发送。按照上面的方法编程后,我们便可以在超级终端上查看串口通信的具体状态了。我的这个例程,在硬件复位以后,可以马上
9、在超级终端上看见WelcometomySTM32!Pleasepressanykey!”字样,然后如果在超级终端中通过PC机键盘按下相应的犍,那么这个键会发送到STM32中,并且马上返回到PC机的超级终端上,因此可以马上从超级终端的页面中看到按下的相应的键。5 .程序源代码/includestm32flOx_lib.h,FIagStatusRX_status;voidRCC_cfg();voidGPIO_cfg();voidUSART_cfg();voidNVIC_cfg();intmain()(int/;unsignedcharTxBufl=WelcometomySTM32!Pleasepr
10、essanykey!;RCJcfgQ;GPIOfg();NVIC_cfg();USART_cfg();去除标志位,否那么第1位数据会丧失USART-ClearFlag(USARTl,USART_FLAG_TC);发送数据/PBS的作用是显示正在发送数据当有数据在发送的时候,PB5会亮for(i=OjTxBufli!=,O,;1+)USART_SendData(USART1,TXBUfIij);GPI0_SetBits(GPI0B,GPI0_Pin_5);等待数据发送完毕WhiIe(USARLGetFIagStatus(USART1,USART_FLAG_TC)=RESET);GPIO.Rese
11、tBits(GPIOB,GPI0_Pin_5);)while(l);)RCC时钟配置voidRCC_cfg()定义错误状态变量ErrorStatusHSEStartUpStatus;将RCC存放器重新设置为默认值RCC_Delnit();翻开外部高速时钟晶振RCC_HSEConfig(RCC_HSE_ON);等待外部高速时钟晶振工作HSEStartUpStatus=RCC_WaitForHSEStartUpO;if(HSEStartUpStatus=SUCCESS)设置AHB时钟(HClK)为系统时钟RCC_HCLKConfig(RCC_SYSCLK_Divl);设置高速AHB时钟(APB2)
12、为HCLK时钟RCC_PCLK2Config(RCC_HCLK_Divl);设置低速AHB时钟(APBn为HCLK的2分频RCJPCLKICOnfig(RCjHCLK_Div2);设置FLASH代码延时FLASH_SetLatency(FLASH_Latency_2);使能预取指缓存FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);设置PLL时钟,为HSE的9倍频8MHz*9=72MHzRCJPLLCOnfig(RCjPLLSOUrCJHSE_Divl,RCC_PLLMul_9);使能PlIRCC_PLLCmd(ENABLE);等待PII
13、准备就绪Whiie(RCjGetFIagStatUS(RCjFLAG_PLLRDY)=RESET);设置PLL为系统时钟源RCjSYSCLKConfig(RCjSYSCLKSoUrCJPLLCLK);判断PlI是否是系统时钟WhiIe(RCJGetSYSCLKSOUrCe()!=0x08);)翻开GPIo时钟,复用功能,串口1的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA/RCC_APB2Periph_GPI0BRCC_APB2Periph_AFI0RCC_APB2Periph_USARTl,ENABLE);)/IO口配置voidGPIO_cfg(
14、)(GPIOJnitTypeDefGPIO_lnitStructure;PA9作为USI的X端,翻开更用,负责发送数据GPIO_Structlnit(&GPIO_InitStructure);GPIO_lnitStructure.GPIO_Pin=GPI0_Pin_9;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;GPIOJnit(GPIOA,&GPIO_lnitStructure);/PAlO作为USW的RX端,负责接收数据GPIO_lnitStructure.GPIO_Pin=GPIO_Pin_10;GPIO_lnitStructure.GPIO
15、_Mode=GPIO_Mode_IN_FLOATING;GPIOJnit(GPIOA,&GPIO_lnitStructure);/LED显示串口正在发送/接收数据GPIO_lnitStructure.GPIO_Pin=GPI0_Pin_5;GPIO_lnitStructure.GPIO_Mode=GPIO_Mode_Out_PP;GPIOJnit(GPIOBf&GPIO_lnitStructure);)串口初始化voidUSART_cfg()(USART_lnitTypeDefUSARTJnitStructure;将构造体设置为缺省状态USART_Structlnit(&USART_lnitStructure);波特率设置为S20GUSARTJnitStructure.USART_BaudRate=115200;一帧数据的宽度设置为8bitsUSARTJnitStructure.USART_WordLength=USART_WordLength_8b;在帧结尾传输1个停顿位USARTJnitStructure.USART_StopBits=USART_StopBits_l;奇偶失能模