STM32学习笔记:USART串口的使用

上传人:feng****ing 文档编号:53590403 上传时间:2022-02-10 格式:DOC 页数:8 大小:55.50KB
收藏 版权申诉 举报 下载
STM32学习笔记:USART串口的使用_第1页
第1页 / 共8页
STM32学习笔记:USART串口的使用_第2页
第2页 / 共8页
STM32学习笔记:USART串口的使用_第3页
第3页 / 共8页
资源描述:

《STM32学习笔记:USART串口的使用》由会员分享,可在线阅读,更多相关《STM32学习笔记:USART串口的使用(8页珍藏版)》请在装配图网上搜索。

1、1. 串口的基本概念在 STM32 的参考手册中,串口被描述成通用同步异步收发器 (USART) ,它提供了一种 灵活的方法与使用工业标准 NRZ 异步串行数据格式的外部设备之间进行全双工数据交换。 USART 利用分数波特率发生器提供宽范围的波特率选择。它支持同步单向通信和半双工单 线通信,也支持 LIN (局部互联网),智能卡协议和 IrDA (红外数据组织) SIR ENDEC 规 范,以及调制解调器 (CTS/RTS) 操作。它还允许多处理器通信。还可以使用DMA 方式,实现高速数据通信。USART 通过 3 个引脚与其他设备连接在一起,任何 USART 双向通信至少需要 2 个引 脚

2、:接受数据输入(RX)和发送数据输出(TX)。RX: 接受数据串行输入。通过过采样技术来区别数据和噪音,从而恢复数据。TX: 发送数据输出。当发送器被禁止时,输出引脚恢复到它的 I/O 端口配置。当发送器 被激活,并且不发送数据时, TX 引脚处处于高电平。在单线和智能卡模式里,此 I/O 口被 同时用于数据的发送和接收。2. 串口的如何工作的一般有两种方式:查询和中断。( 1)查询:串口程序不断地循环查询,看看当前有没有数据要它传送。如果有,就帮 助传送(可以从 PC 到 STM32 板子,也可以从 STM32 板子到 PC)。( 2)中断:平时串口只要打开中断即可。如果发现有一个中断来,则

3、意味着要它帮助 传输数据它就马上进行数据的传送。 同样,可以从 PC 到 STM3 板子,也可以从 STM32 板子到 PC。3. 串口的硬件连接我用的奋斗 STM32 V3 开发板拥有二路 RS-232 接口, CPU 的 PA9-US1-TX (P68)、 PA10-US1-RX (P69)、PA9-US2-TX (P25)、PA10-US2-RX (P26)通过 MAX3232 实现 两路 RS-232 接口,分别连接在 XS5 和 XS17 接口上。 USART1 在系统存储区启动模式下, 将通过该口通过 PC对板上的CPU进行ISP,该口也可作为普通串口功能使用,JP3, JP4的短

4、路冒拔去,将断开第二路的 RS232 通信,仅作为 TTL 通信通道。4. 编程实例我们要对串口进行操作,首先要将STM32的串口和CPU进行连接。在 Windows操作系统中, 有一个自带的系统软件叫 “超级终端” 。 VISTA 以上的操作系统去掉了这个软件, 不过可以从 XP 的系统中,复制“ hypertrm.dll ”和“ hypertrm.exe ”到“ windows/system32 ” 文件夹下,然后双击运行 hypertrm.exe,就可以看见超级终端的运行界面了。运行超级终端以后,会弹出“连接描述”,输入名称和选择图标,这个地方随便写个什么名称都可以。然后弹出“连接到”设

5、置,在“连接时使用”选择你自己PC和STM32连接的 COMx ,如果不知道是哪个 COM 口的话,可以在 PC 的设备管理器中找到。在选择好 COM 口之后,会弹出一个“属性”对话框,在“位/秒”选择和你 STM32 中设置的波特率一致就好,数据位也是按照 STM32 的设置来选择,奇偶校验选择无,停止位选择1,数据流控制选择无。注意,以上的选项都必须和 STM32 中的串口设置相匹配,要不然可能会出 现一些未知错误。配置好超级终端之后,我们便可以开始对 STM32 进行编程了。编程一般按照如下步骤 进行:1)RCC 配置;2)GPIO 配置;3)USART 配置;4)NVIC 配置;5)发

6、送 /接收数据。在 RCC 配置中, 我们除了常规的时钟设置以外, 要记得打开 USART 相对应的 IO 口时 钟, USART 时钟,还有管脚功能复用时钟。在 GPIO 配置中, 将发送端的管脚配置为复用推挽输出, 将接收端的管脚配置为浮空输 入。在 USART 的配置中, 通过 USART_InitTypeDef 结构体对 USART 进行初始化操作,按 照自己所需的功能配置好就可以了。 注意, 在超级终端的设置中, 需要和这个里面的配置相 对应。由于我是采用中断接收数据的方式, 所以记得在 USART 的配置中药打开串口的中断, 同时最后还要打开串口。在 NVIC 的配置中, 主要是

7、USART1_IRQChannel 的配置,和以前的笔记中讲述的中断 配置类似,不会配置的可以参考以前的笔记。全部配置好之后就可以开始发送 /接收数据了。 发送数据用 USART_SendData() 函数,接 收数据用 USART_ReceiveData() 函数。具体的函数功能可以参考固件库的参考文件。根据 USART 的配置,在发送和接收时,都是采用的 8bits 一帧来进行的,因此,在发送的时候, 先开辟一个缓存区, 将需要发送的数据送入缓存区, 然后再将缓存区中的数据发送出去, 在 接收的时候,同样也是先接收到缓存区中,然后再进行相应的操作。注意在对数据进行发送和接收的时候, 要检查

8、 USART 的状态, 只有等到数据发送或接 收完毕之后才能进行下一帧数据的发送或接收。采用 USART_GetFlagStatus() 函数。同时还要注意的是, 在发送数据的最开始, 需要清除一下 USART 的标志位, 否则, 第 1 位数据会丢失。因为在硬件复位之后, USART 的状态位 TC 是置位的。当包含有数据的 一帧发送完成之后, 由硬件将该位置位。 只要当 USART 的状态位 TC 是置位的时候, 就可 以进行数据的发送。然后 TC 位的置零则是通过软件序列来清除的,具体的步骤是“先读 USART_SR ,然后写入 USART_DR ”,只有这样才能够清除标志位 TC ,但

9、是在发送第一 帧数据的时候,并没有进行读 USART_SR 的操作,而是直接进行写操作,因此 TC 标志位 并没有清空, 那么, 当发送第一帧数据, 然后用 USART_GetFlagStatus() 检测状态时返回的 是已经发送完毕(因为 TC 位是置 1 的),所以程序会马上发送下一帧数据,那么这样,第 一帧数据就被第二帧数据给覆盖了,所以看不到第一帧数据的发送。按照上面的方法编程后, 我们便可以在超级终端上查看串口通信的具体状态了。 我的这 个例程, 在硬件复位以后, 可以马上在超级终端上看见 “ Welcome to my STM32! Please pressany key! ”字样

10、,然后如果在超级终端中通过PC 机键盘按下相应的键,则这个键会发送到STM32 中,并且马上返回到 PC 机的超级终端上, 因此可以马上从超级终端的页面中看到按 下的相应的键。5. 程序源代码#include stm32f10x_lib.hFlagStatus RX_status;void RCC_cfg();void GPIO_cfg();void USART_cfg();void NVIC_cfg();int main()int i;unsigned char TxBuf1 = Welcome to my STM32! Please press any key!;RCC_cfg();GPI

11、O_cfg();NVIC_cfg();USART_cfg();/清除标志位,否则第 1 位数据会丢失USART_ClearFlag(USART1,USART_FLAG_TC);/ 发送数据/PB5 的作用是显示正在发送数据/ 当有数据在发送的时候, PB5 会亮for( i=0;TxBuf1i!=0;i+)USART_SendData(USART1,TxBuf1i);GPIO_SetBits(GPIOB,GPIO_Pin_5);/ 等待数据发送完毕while(USART_GetFlagStatus(USART1, USART_FLAG_TC)=RESET);GPIO_ResetBits(GPI

12、OB,GPIO_Pin_5);while(1);/RCC 时钟配置void RCC_cfg()/ 定义错误状态变量ErrorStatus HSEStartUpStatus;/ 将 RCC 寄存器重新设置为默认值RCC_DeInit();/打开外部高速时钟晶振RCC_HSEConfig(RCC_HSE_ON);/等待外部高速时钟晶振工作HSEStartUpStatus = RCC_WaitForHSEStartUp(); if(HSEStartUpStatus = SUCCESS) / 设置 AHB 时钟 (HCLK) 为系统时钟 RCC_HCLKConfig(RCC_SYSCLK_Div1);

13、/设置高速 AHB时钟(APB2)为HCLK时钟 RCC_PCLK2Config(RCC_HCLK_Div1);/设置低速 AHB时钟(APB1)为HCLK的2分频 RCC_PCLK1Config(RCC_HCLK_Div2);/ 设置 FLASH 代码延时FLASH_SetLatency(FLASH_Latency_2);/ 使能预取指缓存FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);/设置 PLL 时钟,为 HSE 的 9倍频 8MHz * 9 = 72MHz RCC_PLLConfig(RCC_PLLSource_HSE_Div

14、1, RCC_PLLMul_9);/ 使能 PLLRCC_PLLCmd(ENABLE);/ 等待 PLL 准备就绪 while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) = RESET);/ 设置 PLL 为系统时钟源 RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);/ 判断 PLL 是否是系统时钟 while(RCC_GetSYSCLKSource() != 0x08);/打开 GPIO 时钟,复用功能,串口 1 的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2P

15、eriph_GPIOB | RCC_APB2Periph_AFIO | RCC_APB2Periph_USART1, ENABLE);/IO 口配置void GPIO_cfg()GPIO_InitTypeDef GPIO_InitStructure;/PA9 作为 US1 的 TX 端,打开复用,负责发送数据GPIO_StructInit(&GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_Init(GPIOA , &G

16、PIO_InitStructure);/PA10 作为 US1 的 RX 端,负责接收数据GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure);/LED 显示串口正在发送 / 接收数据GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(G

17、PIOB, &GPIO_InitStructure);/串口初始化void USART_cfg()USART_InitTypeDef USART_InitStructure;/ 将结构体设置为缺省状态USART_StructInit(&USART_InitStructure);/ 波特率设置为 115200USART_InitStructure.USART_BaudRate = 115200;/ 一帧数据的宽度设置为 8bitsUSART_InitStructure.USART_WordLength = USART_WordLength_8b;/ 在帧结尾传输 1 个停止位USART_Init

18、Structure.USART_StopBits = 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;/ 设置串口 1USART_Init(USART1, &US

19、ART_InitStructure);/ 打开串口 1 的中断响应函数USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);/ 打开串口 1USART_Cmd(USART1, ENABLE);/配置中断void NVIC_cfg()NVIC_InitTypeDef NVIC_InitStructure;选择中选择抢占响应式/ 使NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); / 断分组 2NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQChannel;/串口 1

20、中断NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;/式中断优先级设置为 0NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;/中断优先级设置为 0NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;能中断NVIC_Init(&NVIC_InitStructure);然后在 stm32f10x_it.c 文件中找到相应的中断处理函数,并填入一下内容。注意在 stm32f10x_it.c 中,要声明一下外部变量 RX_statusexter

21、n FlagStatus RX_status;void USART1_IRQHandler(void)GPIO_SetBits(GPIOB, GPIO_Pin_5);/确认是否接收到数据RX_status = USART_GetFlagStatus(USART1, USART_FLAG_RXNE);/ 接收到数据 if(RX_status = SET)/ 将数据回送至超级终端 USART_SendData(USART1, USART_ReceiveData(USART1);/ 等待数据发送完毕 while(USART_GetFlagStatus(USART1, USART_FLAG_TC) = RESET);GPIO_ResetBits(GPIOB, GPIO_Pin_5);

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!