完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
STM32F1 串口简介
串口作为 MCU 的重要外部接口,同时也是软件开发重要的调试手段,其重要性不言而喻。 现在基本上所有的 MCU 都会带有串口,STM32 自然也不例外。 STM32 的串口资源相当丰富的,功能也相当强劲。ALIENTEK 战舰 STM32 开发板所使用 的 STM32F103ZET6 最多可提供 5 路串口,有分数波特率发生器、支持同步单线通信和半双工 单线通讯、支持 LIN、支持调制解调器操作、智能卡协议和 IrDA SIR ENDEC 规范、具有 DMA 等。 5.3 节对串口有过简单的介绍,接下来我们将从寄存器层面,告诉你如何设置串口,以达到 我们最基本的通信功能。本章,我们将实现利用串口 1 不停的打印信息到电脑上,同时接收从 串口发过来的数据,把发送过来的数据直接送回给电脑。战舰 STM32 开发板板载了 1 个 USB 串口和 2 个 RS232 串口,我们本章介绍的是通过 USB 串口和电脑通信。 串口最基本的设置,就是波特率的设置。STM32 的串口使用起来还是蛮简单的,只要你开 启了串口时钟,并设置相应 IO 口的模式,然后配置一下波特率,数据位长度,奇偶校验位等 信息,就可以使用了,详见 5.3.2 节。下面,我们就简单介绍下这几个与串口基本配置直接相关 的寄存器。 1,串口时钟使能。串口作为 STM32 的一个外设,其时钟由外设时钟使能寄存器控制,这 里我们使用的串口1是在APB2ENR寄存器的第14位。APB2ENR寄存器在之前已经介绍过了, 这里不再介绍。只是说明一点,就是除了串口 1 的时钟使能在 APB2ENR 寄存器,其他串口的 时钟使能位都在 APB1ENR 寄存器。 2,串口复位。当外设出现异常的时候可以通过复位寄存器里面的对应位设置,实现该外设 的复位,然后重新配置这个外设达到让其重新工作的目的。一般在系统刚开始配置外设的时候, 都会先执行复位该外设的操作。串口 1 的复位是通过配置 APB2RSTR 寄存器的第 14 位来实现 的。APB2RSTR 寄存器的各位描述如图 9.1.1 所示: 图 9.1.1 APB2RSTR 寄存器各位描述 从图9.1.1可知串口1的复位设置位在APB2RSTR的第14位。通过向该位写1复位串口1, 写 0 结束复位。其他串口的复位位在 APB1RSTR 里面。 3,串口波特率设置。在 5.3.2 节,我们已经介绍过了,每个串口都有一个自己独立的波特 率寄存器 USART_BRR,通过设置该寄存器就可以达到配置不同波特率的目的。具体实现方法, 请参考 5.3.2 节。 4,串口控制。STM32 的每个串口都有 3 个控制寄存器 USART_CR1~3,串口的很多配置 都是通过这 3 个寄存器来设置的。这里我们只要用到 USART_CR1 就可以实现我们的功能了, 该寄存器的各位描述如图 9.1.2 所示: ALIENTEK 战舰 STM32F103 V3 开发板教程 137 STM32 F1 开发指南( ( 寄存器 版) ) 图 9.1.2 USART_CR 寄存器各位描述 该寄存器的高 18 位没有用到,低 14 位用于串口的功能设置。UE 为串口使能位,通过该 位置 1,以使能串口。M 为字长选择位,当该位为 0 的时候设置串口为 8 个字长外加 n 个停止 位,停止位的个数(n)是根据 USART_CR2 的[13:12]位设置来决定的,默认为 0。PCE 为校验 使能位,设置为 0,则禁止校验,否则使能校验。PS 为校验位选择,设置为 0 则为偶校验,否 则为奇校验。TXIE 为发送缓冲区空中断使能位,设置该位为 1,当 USART_SR 中的 TXE 位为 1 时,将产生串口中断。TCIE 为发送完成中断使能位,设置该位为 1,当 USART_SR 中的 TC 位为 1 时,将产生串口中断。RXNEIE 为接收缓冲区非空中断使能,设置该位为 1,当 USART_SR 中的 ORE 或者 RXNE 位为 1 时,将产生串口中断。TE 为发送使能位,设置为 1,将开启串口 的发送功能。RE 为接收使能位,用法同 TE。 其他位的设置,这里就不一一列出来了,大家可以参考《STM32 中文参考手册》第 542 页 有详细介绍,在这里我们就不列出来了。 5,数据发送与接收。STM32 的发送与接收是通过数据寄存器 USART_DR 来实现的,这是 一个双寄存器,包含了 TDR 和 RDR。当向该寄存器写数据的时候,串口就会自动发送,当收 到数据的时候,也是存在该寄存器内。该寄存器的各位描述如图 9.1.3 所示: 图 9.1.3 USART_DR 寄存器各位描述 可以看出,虽然是一个 32 位寄存器,但是只用了低 9 位(DR[8:0]),其他都是保留。 DR[8:0]为串口数据,包含了发送或接收的数据。由于它是由两个寄存器组成的,一个给 发送用(TDR),一个给接收用(RDR),该寄存器兼具读和写的功能。TDR 寄存器提供了内部总 线和输出移位寄存器之间的并行接口。RDR 寄存器提供了输入移位寄存器和内部总线之间的并 行接口。 当使能校验位(USART_CR1 中 PCE 位被置位)进行发送时,写到 MSB 的值(根据数据的长 度不同,MSB 是第 7 位或者第 8 位)会被后来的校验位取代。 当使能校验位进行接收时,读到的 MSB 位是接收到的校验位。 6,串口状态。串口的状态可以通过状态寄存器 USART_SR 读取。USART_SR 的各位描述 如图 9.1.4 所示: ALIENTEK 战舰 STM32F103 V3 开发板教程 138 STM32 F1 开发指南( ( 寄存器 版) ) 图 9.1.4 USART_SR 寄存器各位描述 这里我们关注一下两个位,第 5、6 位 RXNE 和 TC。 RXNE(读数据寄存器非空),当该位被置 1 的时候,就是提示已经有数据被接收到了,并 且可以读出来了。这时候我们要做的就是尽快去读取 USART_DR,通过读 USART_DR 可以将 该位清零,也可以向该位写 0,直接清除。 TC(发送完成),当该位被置位的时候,表示 USART_DR 内的数据已经被发送完成了。如 果设置了这个位的中断,则会产生中断。该位也有两种清零方式:1)读 USART_SR,写 USART_DR。2)直接向该位写 0。 通过以上一些寄存器的操作外加一下 IO 口的配置,我们就可以达到串口最基本的配置了, 关于串口更详细的介绍,请参考《STM32 中文参考手册》第 516 页至 548 页,通用同步异步收 发器一章。 9.2 硬件 设计 本实验需要用到的硬件资源有: 1) 指示灯 DS0 2) 串口 1 串口 1 之前还没有介绍过,本实验用到的串口 1 与 USB 串口并没有在 PCB 上连接在一起, 需要通过跳线帽来连接一下。这里我们把 P4 的 RXD 和 TXD 用跳线帽与 PA9 和 PA10 连接起 来。如图 9.2.1 所示: 图 9.2.1 硬件连接图示意图 连接上这里之后,我们在硬件上就设置完成了,可以开始软件设计了。 9.3 软件 设计 本章的代码设计,比前两章简单很多,因为我们的串口初始化代码和接收代码就是用我们 之前介绍的 SYSTEM 文件夹下的串口部分的内容。这里我们对代码部分稍作讲解。 打开上一章的TEST工程,因为本章我们用不到按键和蜂鸣器等功能,所以把key.c和beep.c 从工程HARDWARE 组里面删除,删除方法(下同):光标放 key.c 上右键Remove File ‘key.c’即可删除(beep.c 删除方法一样),从减少工程代码量,后续我们也将这样,仅留下必 须的.c 文件,无关的.c 文件尽量删掉,从而节省空间,加快编译速度。 然后在 SYSTEM 组下双击 usart.c,我们就可以看到该文件里面的代码,先介绍 uart_init 函 数,该函数代码如下: //初始化 IO 串口 1 ALIENTEK 战舰 STM32F103 V3 开发板教程 139 STM32 F1 开发指南( ( 寄存器 版) ) //pclk2:PCLK2 时钟频率(Mhz) //bound:波特率 void uart_init(u32 pclk2,u32 bound) { float temp; u16 mantissa; u16 fraction; temp=(float)(pclk21000000)/(bound16);//得到 USARTDIV mantissa=temp; //得到整数部分 fraction=(temp-mantissa)*16; //得到小数部分 mantissa<<=4; mantissa+=fraction; RCC->APB2ENR|=1<<2; //使能 PORTA 口时钟 RCC->APB2ENR|=1<<14; //使能串口时钟 GPIOA->CRH&=0XFFFFF00F;//IO 状态设置 GPIOA->CRH|=0X000008B0;//IO 状态设置 RCC->APB2RSTR|=1<<14; //复位串口 1 RCC->APB2RSTR&=~(1<<14);//停止复位 //波特率设置 USART1->BRR=mantissa; // 波特率设置 USART1->CR1|=0X200C; //1 位停止,无校验位. #if EN_USART1_RX //如果使能了接收 //使能接收中断 USART1->CR1|=1<<5; //接收缓冲区非空中断使能 MY_NVIC_Init(3,3,USART1_IRQn,2);//组 2,最低优先级 #endif } 从该代码可以看出,其初始化串口的过程,和我们前面介绍的一致。先计算得到 USART1->BRR 的内容。然后开始初始化串口引脚,然之后设置波特率和奇偶校验等。 这里需要注意一点,因为我们使用到了串口的中断接收,必须在 usart.h 里面设置 EN_USART1_RX 为 1 (默认设置就是 1 的)。该函数才会配置中断使能,以及开启串口 1 的 NVIC 中断。这里我们把串口 1 中断放在组 2,优先级设置为组 2 里面的最低。 串口 1 的中断服务函数 USART1_IRQHandler,在 5.3.1 已经有详细介绍了,这里我们就不 再介绍了。 介绍完了这两个函数,我们回到 test.c,在 test.c 里面编写如下代码: #include “sys.h” #include “delay.h” #include “usart.h” #include “led.h” int main(void) { u16 t; u16 len; u16 times=0; Stm32_Clock_Init(9); //系统时钟设置 ALIENTEK 战舰 STM32F103 V3 开发板教程 140 STM32 F1 开发指南( ( 寄存器 版) ) uart_init(72,115200); //串口初始化为 115200 delay_init(72); //延时初始化 LED_Init(); //初始化与 LED 连接的硬件接口 while(1) { if(USART_RX_STA&0x8000) { len=USART_RX_STA&0x3FFF;//得到此次接收到的数据长度 printf("rn 您发送的消息为:rnrn"); for(t=0;t { USART1->DR=USART_RX_BUF[t]; while((USART1->SR&0X40)0);//等待发送结束 } printf("rnrn");//插入换行 USART_RX_STA=0; }else { times++; if(times%50000) { printf("rn 战舰 STM32 开发板 串口实验rn"); printf(“正点原子@ALIENTEKrnrn”); } if(times%2000)printf(“请输入数据,以回车键结束rn”); if(times%300)LED0=!LED0;//闪烁 LED,提示系统正在运行. delay_ms(10); } } } 这段代码比较简单,重点看下以下两句: USART1->DR=USART_RX_BUF[t]; while((USART1->SR&0X40)==0);//等待发送结束 第一句,其实就是发送一个字节到串口,通过直接操作寄存器来实现的。第二句呢,就是 我们在写了一个字节在 USART1->DR 之后,要检测这个数据是否已经被发送完成了,通过检测 USART1->SR 的第 6 位,是否为 1 来决定是否可以开始第二个字节的发送。 其他的代码比较简单,大家看注释即可。然后,我们执行编译操作看看有没有错误,没有 错误就可以开始仿真与调试了。整个工程的编译结果如图 9.3.1 所示: 图 9.3.1 编译结果 ALIENTEK 战舰 STM32F103 V3 开发板教程 141 STM32 F1 开发指南( ( 寄存器 版) ) 可以看到,编译没有任何错误和警告,下面我们可以开始下载验证了。 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1614 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1541 浏览 1 评论
970 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
682 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1592 浏览 2 评论
1863浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
644浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
515浏览 3评论
531浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
504浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-21 22:58 , Processed in 0.609491 second(s), Total 46, Slave 39 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号