STM32F407-串口数据传送

发布者:神光骑士最新更新时间:2022-06-29 来源: eefocus关键字:STM32F407  串口  数据传送 手机看文章 扫描二维码
随时随地手机看文章

一、串口基础

1.常用的串口相关寄存器


USART_SR状态寄存器

USART_DR数据寄存器

USART_BRR波特率寄存器

2.串口操作相关库函数(省略入口参数)


void USART_Init(); //串口初始化:波特率,数据字长,奇偶校验,硬件流控以及收发使能


void USART_Cmd();//使能串口


void USART_ITConfig();//使能相关中断


void USART_SendData();//发送数据到串口,


DR uint16_t USART_ReceiveData();//接受数据,从DR读取接受到的数据


 


FlagStatus USART_GetFlagStatus();//获取状态标志位


void USART_ClearFlag();//清除状态标志位


ITStatus USART_GetITStatus();//获取中断状态标志位


void USART_ClearITPendingBit();//清除中断状态标志位


 


3.状态寄存器

第10-31位保留,硬件强制为0


第5位:RXNE(读数据寄存器非空),当该位被置 1 的时候,就是提示已经有数据被接收到了,并且可以读出来了。这时候我们要做的就是尽快去读取 USART_DR,通过读 USART_DR 可以将该位清零,也可以向该位写 0,直接清除。


第6位:TC(发送完成),当该位被置位的时候,表示 USART_DR 内的数据已经被发送完成了。如果设置了这个位的中断,则会产生中断。该位也有两种清零方式:1)读 USART_SR,写USART_DR。2)直接向该位写 0。


 读取串口状态的函数是:FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG);


例如:


判断读寄存器是否非空(RXNE),操作库函数的方法是:USART_GetFlagStatus(USART1, USART_FLAG_RXNE);


4.数据寄存器

5.串口配置的一般步骤


①串口时钟使能:RCC_APBxPeriphClockCmd();      


GPIO时钟使能:RCC_AHB1PeriphClockCmd();


② 引脚复用映射:      GPIO_PinAFConfig();


③GPIO端口模式设置:GPIO_Init(); 模式设置为GPIO_Mode_AF


④串口参数初始化:USART_Init();


⑤开启中断并且初始化NVIC(如果需要开启中断才需要这个步骤)       NVIC_Init();       USART_ITConfig();


⑥使能串口:USART_Cmd(); ⑦编写中断处理函数:USARTx_IRQHandler();


⑧串口数据收发:


void USART_SendData();//发送数据到串口,DR uint16_t USART_ReceiveData();//接受数据,从DR读取接受到的数据


⑨串口传输状态获取: FlagStatus USART_GetFlagStatus(); void USART_ClearITPendingBit();


二、实例编写


1.宏观变量定义


#define USART_REC_LEN   200      //定义最大接收字节数 200  


u8  USART_RX_BUF[USART_REC_LEN];               //接收缓冲,最大USART_REC_LEN个字节.末字节为换行符  


 u16 USART_RX_STA;                 //接收状态标记    


在这里定义了16位的USART_RX_STA,其中0-13位用于接收数据,第14位用于进行判断0x0d标志,若接收到了置1,反之置0,第15位用于判断接收完成标志,即第14位确定收到0x0d标志后,再进行判断,若收到了0x0a标志,则将该位置为1


2.main函数编写


int main(void)

 

u8 t;

u8 len;

u16 times=0;  

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//将中断优先级分组2,2位响应,2位抢断

delay_init(168); //延时初始化

uart_init(115200); //波特率两边要一致,这里设置为115200,若不一致则会产生乱码

LED_Init();   //初始化LED 

while(1)

{

    //STA为16位,与0x8000与,即判断接收到的数据第15位是否为1,即是否接收到完成

if(USART_RX_STA&0x8000)  

 

{    

len=USART_RX_STA&0x3fff;//接收到的数据长度保存到len中

printf("rn您发送的消息为:rn");

for(t=0;t {

                //将BUF中保存的数据发送到串口1

USART_SendData(USART1, USART_RX_BUF[t]);        

                //等待发送结束

while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);

}

printf("rnrn");

USART_RX_STA=0;    //STA清0,以便于下次接收

}

            else    //没有接收到完整结束标志或只接收到一个,跳入else,循环打印提示信息

{

times++;

if(times%200==0)

            printf("输入数据,以回车键结束rn");  

if(times%30==0)

            LED0=!LED0;//LED闪烁,系统正在运行

delay_ms(10);   

}

}

}

乱码示例:

关键字:STM32F407  串口  数据传送 引用地址:STM32F407-串口数据传送

上一篇:STM32F407-用TB6600驱动器驱动57步进电机
下一篇:STM32F407-串口通信基本原理

推荐阅读最新更新时间:2024-11-07 15:05

STM32F103 USART1串口重映射功能的实现
我们知道,F103的usart1串口是PA8 PA9的复用功能,我们在使用的时候直接配置这两个引脚,配置复用即可,但有时,在实际工作中,也会采用串口的重映射功能。 由图可知,usart1是PB6 PB7的重定义功能,也就是重映射功能,话不多说,直接上代码。我使用的是103C8T7,请知悉。 static void Gpio_Config1(void){ GPIO_InitTypeDef GPIO_InitStructure; /* TX PB6 */ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Pin = GPI
[单片机]
STM32F103 USART1<font color='red'>串口</font>重映射功能的实现
三 ARM9(S3C2440)的串口UART——程序实例讲解
串口通信程序编写步骤 UART通信程序可以采用查询、中断和DMA模式。我们通过使用较多的中断方式来介UART通信程序的编写。简单做法是,UART通信程序的编写参照例子程序。 选通道,通过函数Uart_Select();选UART0~UART2; 选波特率和波特率发生器时钟,选波特率通过函数Uart_Pclk_En(int ch, int baud)或Uart_Pclk_En(int ch, int baud)来进行。时钟选UCLK ,rUCON0|=0x400;时钟选PCLK ,rUCON0&=0x3ff。 通信协议(rULCON0)设定,如果正常通信,一位停止位,8位数据位,无奇偶效验: rULCON0=(0 6)|(0
[单片机]
51单片机串口通信的发送与接收 字符串
51单片机的串口,是个全双工的串口,发送数据的同时,还可以接收数据。 当串行发送完毕后,将在标志位 TI 置 1,同样,当收到了数据后,也会在 RI 置 1。 无论 RI 或 TI 出现了 1,只要串口中断处于开放状态,单片机都会进入串口中断处理程序。 在中断程序中,要区分出来究竟是发送引起的中断,还是接收引起的中断,然后分别进行处理。 看到过一些书籍和文章,在串口收、发数据的处理方法上,很多人都有不妥之处。 接收数据时,基本上都是使用 中断方式 ,这是正确合理的。 即:每当收到一个新数据,就在中断函数中,把 RI 清零,并用一个变量,通知主函数,收到了新数据。 发送数据时,很多的程序都是使用的 查询方式 ,就是执行 while(T
[单片机]
单片机中的浮点数转换成串口可打印格式
阅读数:363 uint8 len = 0; len=Float2Char(arp_count_xishu,b); USART0_send_n(b,len); #define uint8 unsigned char #define uint32 unsigned int /************************************************************************/ /* 函数名:Float2Char */ /* 功能:执行Float转换成char */ /*参数:value: Float值 array:char数组 */ /
[单片机]
STM32 USART串口DMA接收和发送模式
串口DMA发送: 发送数据的流程: 前台程序中有数据要发送,则需要做如下几件事 1. 在数据发送缓冲区内放好要发送的数据,说明:此数据缓冲区的首地址必须要在DMA初始化的时候写入到DMA配置中去。 2. 将数据缓冲区内要发送的数据字节数赋值给发送DMA通道,(串口发送DMA和串口接收DAM不是同一个DMA通道) 3. 开启DMA,一旦开启,则DMA开始发送数据,说明一下:在KEIL调试好的时候,DMA和调试是不同步的,即不管Keil 是什么状态,DMA总是发送数据。 4. 等待发送完成标志位,即下面的终端服务函数中的第3点设置的标志位。或者根据自己的实际情况来定,是否要一直等待这个标志位,也可以通过状态机的方式来循
[单片机]
STM32 USART<font color='red'>串口</font>DMA接收和发送模式
can转串口“485总线 和can”
一一产品简介 CAN232MB/CAN485MB 模块是工业总线改造,多种总线设备互连的关键性工具,是集成  1  路标准  CAN-bus  接口、1  路标准串行接口(RS-232/RS-485)的工业级  CAN-bus  与串行总线通讯连接器(网桥)。   模块接口定义 CAN232MB/CAN485MB模块各接口定义如图所示,使用端子及标准RS-232接口的接线的方式,便于工业现场使用。 图CAN232MB/CAN485MB  模块  RS-232  接口定义   CAN 总线连接 CAN232MB/CAN485MB集成1路CAN-bus通道,由插拔式接线端子引出,可以用于连接1个CAN-b
[嵌入式]
ARM系统代码固化的串口实现方法
  早期的嵌入式程序采用“编程—烧写—修改—烧写”的开发模式,大量的时间消耗在重复烧写芯片上,增加了开发成本和研发周期。之后发展到仿真器阶段,虽然简化了开发模式,但是由于仿真器与ARM芯片的兼容性等因素,经常会发生程序在仿真器上能正确运行,但是固化之后运行却出现问题的情况。   程序的固化是软件开发过程中重要的一环,一般可通过JATG口、网口及串口等进行烧写。相比之下,串口实现更为便捷,更值得推广。笔者在开发1C1T小灵通中继站的过程中,通过编制烧写程序,利用串口将编译后的目标代码发送给ARM处理器;由ARM处理器内部的监控程序将目标代码写入片外Flash,实现程序的在线烧写。这样不仅简化了电路设计,而且降低了开发成本,缩短了开
[单片机]
ARM系统代码固化的<font color='red'>串口</font>实现方法
STM32串口操作相关事项
放了一段时间,对stm32似乎有点陌生,总结一下! (基于3.0固件库,芯片stm32f103rbt6) 1、配置串口的管脚和时钟 由于串口1、2是在GPIOA上: 所以要是能串口GPIOA、AFIO和1或者2的串口时钟,代码如下: RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO | RCC_APB2Periph_USART1 , ENABLE); 2、对串口的具体物理管脚进行相应的配置: /* A9 USART1_Tx */ GPIO_InitStructure.GPIO_Pin = GPIO_Pi
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved