完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
|
|
相关推荐
1个回答
|
|
工程
将01 跑马灯工程复制一份,并改名为03 串口。 打开文件夹中Hrd文件,并新建USART文件夹。 在Keil中新建两个文件并保存在USART文件下,命名usart.c和usart.h。 并将usart.c添加到工程中,usart.h添加到环境变量中。(详细添加请看stm32新建工程模板) 串口简介 通信接口背景 通信方式 (1)并行通信 传输原理:数据各个位同时传输。 优点:速度快 缺点:占用引脚资源多 (2)串行通信(常用) 传输原理:数据按位顺序传输。 优点:占用引脚资源少 缺点:速度相对较慢 串行通信 (1)按照数据传送方向,分为三类: a、单工:数据传输只支持数据在一个方向上传输 b、半双工:允许数据在两个方向上传输,但是,在某一时刻,只允许数据在一个方向上传输,它实际上是一种切换方向的单工通信; c、全双工:允许数据同时在两个方向上传输,因此,全双工通信是两个单工通信方式的结合,它要求发送设备和接收设备都有独立的接收和发送能力。 (2)串行通信的三种传送方式 (3)串行通信的通信方式 同步通信:带时钟同步信号传输。 SPI,IIC通信接口 异步通信:不带时钟同步信号。 UART(通用异步收发器),单总线 (4)常见的串行通信接口 STM32串口通信 STM32 的串口资源相当丰富的,功能也相当强劲。ALIENTEK MiniSTM32 开发板所使用的 STM32F103RCT6 最多可提供 5 路串口,有分数波特率发生器、支持同步单线通信和半双工单线通讯、支持 LIN、支持调制解调器操作、智能卡协议和 IrDA SIR ENDEC 规范、具有 DMA等。 USART功能概述 任何USART双向通信至少需要两个脚:接收数据输入(RX)和发送数据输出(TX)。 RX:接收数据串行输入。通过采样技术来区别数据和噪音,从而恢复数据。 TX:发送数据输出。当发送器被禁止时,输出引脚恢复到它的I/O端口配置。当发送器被激活,并且不发送数据时,TX引脚处于高电平。在单线和智能卡模式里,此I/O口被同时用于数据的发送和接收。 ● 总线在发送或接收前应处于空闲状态 ● 一个起始位 ● 一个数据字(8或9位),最低有效位在前 ● 0.5,1.5,2个的停止位,由此表明数据帧的结束 ● 使用分数波特率发生器 —— 12位整数和4位小数的表示方法。 ● 一个状态寄存器(USART_SR) ● 数据寄存器(USART_DR) ● 一个波特率寄存器(USART_BRR),12位的整数和4位小数 ● 一个智能卡模式下的保护时间寄存器(USART_GTPR) USART中断请求 USART的各种中断事件被连接到同一个中断向量,有以下各种中断事件: ● 发送期间:发送完成、清除发送、发送数据寄存器空。 ● 接收期间:空闲总线检测、溢出错误、接收数据寄存器非空、校验错误、LIN断开符号检测、噪音标志(仅在多缓冲器通信)和帧错误(仅在多缓冲器通信)。 如果设置了对应的使能控制位,这些事件就可以产生各自的中断。 STM32串口通信接口 UART:通用异步收发器 USART:通用同步异步收发器 UART异步通信方式引脚 RXD:数据输入引脚。数据接受。 TXD:数据发送引脚。数据发送。 UART异步通信方式特点 (1)全双工异步通信。 (2)分数波特率发生器系统,提供精确的波特率。发送和接受共用的可编程波特率,最高可达4.5Mbits/s (3)可编程的数据字长度(8位或者9位); (4)可配置的停止位(支持1或者2位停止位); (5)可配置的使用DMA多缓冲器通信。 (6)单独的发送器和接收器使能位。 (7)检测标志:① 接受缓冲器 ②发送缓冲器空 ③传输结束标志 (8)多个带标志的中断源。触发中断。 (9)其他:校验控制,四个错误检测标志。 函数介绍 RCC_APB2PeriphClockCmd() 函数原型: void RCC_APB2PeriphClockCmd(u32 RCC_APB2Periph, FunctionalState NewState) 功能描述:使能或者失能 APB2 外设时钟 输入参数 1 :RCC_APB2Periph: 门控 APB2 外设时钟 输入参数 2 :NewState:指定外设时钟的新状态 这个参数可以取:ENABLE 或者 DISABLE 时钟使能函数,要使能使用的串口以及IO口(接受数据和发送数据IO口) 详细请看此链接STM32时钟系统 USART_DeInit() 函数原型: void USART_DeInit(USART_TypeDef* USARTx) 功能描述:将外设 USARTx 寄存器重设为缺省值 输入参数:USARTx:x 可以是 1,2 或者 3,来选择 USART 外设 当外设出现异常的时候可以通过复位设置,实现该外设的复位,然后重新配置这个外设达到让其重新工作的目的。一般在系统刚开始配置外设的时候,都会先执行复位该外设的操作。 USART_Init() 函数原型: void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct) 1 功能描述:根据 USART_InitStruct 中指定的参数初始化外设 USARTx 寄存器 输入参数 1: USARTx:x 可以是 1,2 或者 3,来选择 USART 外设 输入参数 2 :USART_InitStruct:指向结构 USART_InitTypeDef 的指针,包含了外设 USART 的配置信息。 参数2的内容: (1)USART_BaudRate:该成员设置了 USART 传输的波特率 (2)USART_WordLength:提示了在一个帧中传输或者接收到的数据位数(8位数据位或9位数据位) (3)USART_StopBits: 定义了发送的停止位数目 (4)USART_Parity:定义了奇偶模式 注意:奇偶校验一旦使能,在发送数据的 MSB 位插入经计算的奇偶位(字长 9 位时的第 9 位,字长 8 位时的第 8 位) (5)USART_HardwareFlowControl:指定了硬件流控制模式使能还是失能 (6)USART_Mode: 指定了使能或者失能发送和接收模式 (7)USART_CLOCK: 提示了 USART 时钟使能还是失能 使能:时钟高电平活动 失能:时钟第电平活动 (8)USART_CPOL: 指定了下 SLCK 引脚上时钟输出的极性(时钟高电平 or 时钟低电平) (9)USART_CPHA 指定了下 SLCK 引脚上时钟输出的相位,和 CPOL 位一起配合来产生用户希望的时钟/数据的采样关系 (10)USART_LastBit: 来控制是否在同步模式下,在 SCLK 引脚上输出最后发送的那个数据字 (MSB)对应的时钟脉冲 USART_SendData() and USART_ReceiveData() STM32 的发送与接收是通过数据寄存器 USART_DR 来实现的,这是一个双寄存器,包含了 TDR 和 RDR。当向该寄存器写数据的时候,串口就会自动发送,当收到收据的时候,也是存在该寄存器内。 函数原型: void USART_SendData(USART_TypeDef* USARTx, u8 Data) 功能描述: 通过外设 USARTx 发送单个数据 输入参数 1: USARTx:x 可以是 1,2 或者 3,来选择 USART 外设 输入参数 2: Data: 待发送的数据 函数原型: u8 USART_ReceiveData(USART_TypeDef* USARTx) 功能描述:返回 USARTx 最近接收到的数据 输入参数: USARTx:x 可以是 1,2 或者 3,来选择 USART 外设 USART_Cmd() 函数原型: void USART_Cmd(USART_TypeDef* USARTx, FunctionalState NewState) 功能描述: 使能或者失能 USART 外设 输入参数 1: USARTx:x 可以是 1,2 或者 3,来选择 USART 外设 输入参数 2 :NewState: 外设 USARTx 的新状态,这个参数可以取:ENABLE 或者 DISABLE USART_ITConfig() 函数原型: void USART_ITConfig(USART_TypeDef* USARTx, u16 USART_IT, FunctionalStateNewState) 功能描述: 使能或者失能指定的 USART 中断 输入参数 1: USARTx:x 可以是 1,2 或者 3,来选择 USART 外设 输入参数 2 :USART_IT:待使能或者失能的 USART 中断源 输入参数 3 :NewState:USARTx 中断的新状态这个参数可以取:ENABLE 或者 DISABLE USART_GetITStatus() 函数原型: ITStatus USART_GetITStatus(USART_TypeDef* USARTx, u16 USART_IT) 功能描述: 检查指定的 USART 中断发生与否 输入参数 1:USARTx:x 可以是 1,2 或者 3,来选择 USART 外设 输入参数 2:USART_IT:待检查的 USART 中断源 USART_GetFlagStatus() 函数原型: FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, u16 USART_FLAG) 功能描述: 检查指定的 USART 标志位设置与否 输入参数 1: USARTx:x 可以是 1,2 或者 3,来选择 USART 外设 输入参数 2 :USART_FLAG:待检查的 USART 标志位# 完整代码 RXNE(读数据寄存器非空),当该位被置 1 的时候,就是提示已经有数据被接收到了,并且可以读出来了。这时候我们要做的就是尽快去读取 USART_DR,通过读 USART_DR 可以将该位清零,也可以向该位写 0,直接清除。 TC(发送完成),当该位被置位的时候,表示 USART_DR 内的数据已经被发送完成了。如果设置了这个位的中断,则会产生中断。该位有两种清零方式:1、读 USART_SR,写USART_DR。2、直接向该位写 0。 USARTx_IRQHandler() 此函数为串口中断服务函数,当发生中断时,就会执行此函数的内容。要使用那个串口,x就为相应的数字。 如:使用串口1,则函数为USART1_IRQHandler() 此函数一般在startup_stm32f10x_hd.s(启动文件)里查找 完整代码 usart.h #ifndef __USART_H #define __USART_H void USART1_Init(void);//串口1 #endif usart.c #include"usart.h" #include"stm32f10x.h" void USART1_Init(void) { GPIO_InitTypeDef GPIO_InitStrue; USART_InitTypeDef USART_InitStrue; NVIC_InitTypeDef NVIC_InitStrue; //使能USART1,GPIOA时钟 ① RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1,ENABLE); //GPIOA.9 USART1_TX ③ GPIO_InitStrue.GPIO_Mode = GPIO_Mode_AF_PP; //推挽复用输出 GPIO_InitStrue.GPIO_Pin = GPIO_Pin_9; GPIO_InitStrue.GPIO_Speed = GPIO_Speed_10MHz; GPIO_Init(GPIOA,&GPIO_InitStrue); //GPIOA.10 USART1_RX ③ GPIO_InitStrue.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入 GPIO_InitStrue.GPIO_Pin = GPIO_Pin_10; GPIO_InitStrue.GPIO_Speed = GPIO_Speed_10MHz; GPIO_Init(GPIOA,&GPIO_InitStrue); //串口(USART)初始化 串口1 ④ USART_InitStrue.USART_BaudRate = 115200; //波特率 USART_InitStrue.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //无硬件数据流控制 USART_InitStrue.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收发方式 USART_InitStrue.USART_Parity = USART_Parity_No; //无奇偶校验位 USART_InitStrue.USART_StopBits = USART_StopBits_1; //一位停止位 USART_InitStrue.USART_WordLength = USART_WordLength_8b; //字长为8位数据格式 USART_Init(USART1,&USART_InitStrue); //初始化串口1 USART_Cmd(USART1,ENABLE); //使能串口1 ⑥ USART_ITConfig(USART1,USART_IT_RXNE,ENABLE); //打开串口接受中断 //USART1 NVIC配置 NVIC_InitStrue.NVIC_IRQChannel = USART1_IRQn; NVIC_InitStrue.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能 NVIC_InitStrue.NVIC_IRQChannelPreemptionPriority = 1; //抢占优先级1 NVIC_InitStrue.NVIC_IRQChannelSubPriority = 1; //子优先级1 NVIC_Init(&NVIC_InitStrue); //中断优先级分组 ⑤ } //中断程序内容 void USART1_IRQHandler(void) //⑧ { u8 res; if(USART_GetITStatus(USART1,USART_IT_RXNE)) { res = USART_ReceiveData(USART1); //读取串口中的数据 ⑨ USART_SendData(USART1,res);//发送数据 } } stm32中断优先级NVIC main.c #include"stm32f10x.h" #include"Led.h" #include"delay.h" #include"sys.h" #include"usart.h" int main() { LED_Init(); delay_init(); //中断入口 中断优先级分组 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); USART1_Init(); LED_OneCycle(); while(1); } 实验现象 LED0不断闪烁表示程序运行成功。 在串口调试助手上就能看到实验效果,数据发送和数据接收 实验步骤 注:不同的stm32所使用的IO口会有所不同,以下步骤对ALIENTEK miniSTM32F103 的 STM32F103RTC6有效,至于其他型号的stm32请参照相关的资料进行配置。但是对于大致的步骤都基本相同 stm32串口【USART1】使用的IO口为PA9(USARTx_TX:发送)、PA10(USARTx_RX:接受). 串口配置的一般步骤: ①串口时钟使能,GPIO时钟使能:RCC_APB2PeriphClockCmd(); ②串口复位:USART_DeInit(); 这一步不是必须的 ③GPIO端口模式设置:GPIO_Init(); 模式设置为GPIO_Mode_AF_PP ④串口参数初始化:USART_Init(); 波特率、数据字长、奇偶校验、硬件流控、收发使能 ⑤开启中断并且初始化NVIC(如果需要开启中断才需要这个步骤) NVIC_Init(); 中断初始化 USART_ITConfig(); 开启中断 ⑥使能串口:USART_Cmd(); ⑦使能相关中断:USART_ITConfig(); ⑧编写中断处理函数:USARTx_IRQHandler(); ⑨串口数据收发: void USART_SendData();//发送数据到串口,DR uint16_t USART_ReceiveData();//接受数据,从DR读取接受到的数据 ⑩串口传输状态获取: FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG);获取状态标志位 void USART_ClearITPendingBit(USART_TypeDef* USARTx, uint16_t USART_IT); 清除状态标志位 USART_GetITStatus();获取中断状态标志位 USART_ClearITPendingBit();清除中断状态标志位 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1752 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1611 浏览 1 评论
1052 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
721 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1666 浏览 2 评论
1924浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
711浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
560浏览 3评论
583浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
544浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-18 13:29 , Processed in 0.949092 second(s), Total 77, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号