Stm32F407ZGT6 串口通迅 usart2

2019-10-09来源: eefocus关键字:Stm32F407ZGT6  串口通迅  usart2

正点原子的开发板,一定要注意跳线帽


串口2


usart2.h


//STM32F407 zgt6 串口2

#ifndef __USART2_H

#define __USART2_H

#include "sys.h" 


#define USART2_MAX_RECV_LEN 200

#define USART2_MAX_SEND_LEN 200

extern u8 USART2_RX_buf[USART2_MAX_RECV_LEN];

extern u8 USART2_TX_buf[USART2_MAX_SEND_LEN];

extern u16 USART2_RX_STA;       //接收状态标记 

void uart2_init(u32 bound);

#endif



usart2.c


#include "usart2.h"


u8 USART2_RX_buf[USART2_MAX_RECV_LEN];

u8 USART2_TX_buf[USART2_MAX_SEND_LEN];

u16 USART2_RX_STA=0;//接收状态标记

/* 初始化串口过程

1.串口时钟使能

2.设置引脚复用

3.GPIO端口初始化

4.串口参数初始化

5.初始化NVIC并且开启中断2

6.使能串口


*/

//初始化IO 串口2 

//bound:波特率

void uart2_init(u32 bound)

{

   //GPIO端口设置

GPIO_InitTypeDef GPIO_InitStructure;

USART_InitTypeDef USART_InitStructure;

NVIC_InitTypeDef NVIC_InitStructure;


RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); //使能GPIOA时钟

RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);//使能USART2时钟 

 

//串口1对应引脚复用映射

GPIO_PinAFConfig(GPIOA,GPIO_PinSource2,GPIO_AF_USART2); //GPIOA2复用为USART2

GPIO_PinAFConfig(GPIOA,GPIO_PinSource3,GPIO_AF_USART2); //GPIOA3复用为USART2


//USART2端口配置

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3; //GPIOA2与GPIOA3

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //速度50MHz

GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出

GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉

GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化PA2,PA3



   //USART2 初始化设置

USART_InitStructure.USART_BaudRate = bound;//波特率设置

USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式

USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位

USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位

USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制

USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收发模式

USART_Init(USART2, &USART_InitStructure); //初始化串口2


NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;//串口2中断通道

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;//抢占优先级3 数值越小优先级越高

NVIC_InitStructure.NVIC_IRQChannelSubPriority =3; //子优先级3,响应优先级

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能

NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器、


USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//开启接收中断

USART_Cmd(USART2, ENABLE);  //使能串口2


}





void USART2_IRQHandler(void)

{

u8 Res;

if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾)

{

Res =USART_ReceiveData(USART2);//(USART2->DR); //读取接收到的数据

USART_SendData(USART2,Res);//将收到的发回去了

  } 


}



main.c



#include "sys.h"

#include "delay.h"

//#include "usart1.h"

#include "usart2.h"

#include "led.h"





int main(void)

u8 t=0,len=0;

u16 times=0;

char str[]={'u','1','w','a','i','t','r','n'};

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

delay_init(168);//168 MHz 

LED_Init();

LED1=0;//位带操作点灯 sys.h 

uart2_init(115200);

while(1)

{


if (USART2_RX_STA&0x8000)//接收完成

{

len=USART2_RX_STA&0x3fff;//长度不能超255,因为len是u8

for(t=0;t

{

USART2->DR=USART2_RX_buf[t];

while((USART2->SR & 0x40)==0);//等待发送结束

USART2_RX_STA=0;

}


}

else

{

times++;

if(times %500==0)//5sec

{

for(t=0;t

{

USART2->DR=str[t];

while((USART2->SR & 0x40)==0);//等待发送结束

}

LED1=!LED1;

}

delay_ms(10);


}

}

}


以上必须在模板工程的配置情况下才能运行,本人验证以上代码ok


关键字:Stm32F407ZGT6  串口通迅  usart2 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic476456.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:STM32 KEIL MDK 本地时间和Unix timestamp相互转换
下一篇:stm32F103 DMA通道

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

关于STM32F407ZGT6的一些知识小结及串口1程序
一、关于STM32F4在通过串口通信的时候乱码问题 1.刚开始弄得时候,以为和stm32一样配置完串口之后就可以用了,结果后面发现串口打印出来的东西全是乱码。后面发现是STM32F4的固件库中使用的频率是25Mhz,而板子上的外部晶振是8Mhz的。因此需要去固件库的stm32f4xx.h中把HSE_VALUE改成8Mhz就可以了。2.还有一种问题是,如果使用的是电平转换的问题。要直接从芯片的引脚进行通信的话,可以直接用一个TTL下载器直接相连,如CH340;如果板子上带有MAX3232芯片的电平转换,要通过DB9插口线转RS232电平为TTL电平然后和电脑相连。#include "
发表于 2019-09-09
关于STM32F407ZGT6的一些知识小结及串口1程序
STM32F407ZGT6学习之工程建立及点灯
;      在工程“project - Debug”上右击,选择“Options”进入工程配置①选择芯片型号,这里需要根据使用的芯片,选择相关的芯片型号,本工程使用的芯片型号是“STM32F407ZGT6” 刚才我们在IAR平台上,工程里添加文件的时候没有添加的.h文件,需要在配置文件中添加使用的.h文件的路径,这样工程就能自动找到使用的.h文件了。图中第3方框就是添加的头文件的路径,这里我们添加的是头文件的相对路径,"$PROJ_DIR"代表工程的位置。第4方框是宏定义的,用于选择使用的芯片。本工程的下载器使用的是“ST-LINK”,所以下载器选择"
发表于 2019-09-09
STM32F407ZGT6学习之工程建立及点灯
ROS使用STM32F407ZGT6作为底盘控制器
库)进行通信也是参考网上的进行学习,想了解的可以看我的上一篇博客(ros下使用rosserial和STM32F1/STM32F4系列进行通信(MDK5工程)),里面有相关资料的连接。使用STM32F4它的资源丰富,而且主频168M也足够我们使用了,后期是打算制作一辆麦克奈姆轮的室内自动导航小车,后期可能会把自己做好和配置好的ubuntu制作成镜像。这次博客就先到这里,后期会持续更新,希望大家可以多多关注、多多交流,相互学习,想讨论的可以给我留言哦。
发表于 2019-09-09
ROS使用STM32F407ZGT6作为底盘控制器
STM32F407ZGT6之硬件介绍
STM32F407ZGT6 :ARM Cortex-M4 32位 MCU+FPU,210DMIPS,高达1 MB Flash/192 + 4KB RAM,USB OTG HS/FS,以太网,17 个TIM,3个ADC,15 个通信接口、摄像头。特性:1、内核:带有 FPU 的 ARM® 32 位 Cortex®-M4CPU、在 Flash 存储器中实现零等待状态运行性能的自适应实时加速器 (ART 加速器 ™)、主频高达 168MHz, MPU,能够实现高达210 DMIPS/1.25DMIPS/MHz (Dhrystone 2.1)的性能,具有 DSP 指令集。2、存储器– 高达1 MB Flash– 高达 192+4 KB
发表于 2019-07-24
STM32F407ZGT6之硬件介绍
Stm32F407ZGT6 串口通迅 USART3
usart3.h//STM32F407zgt6 串口3#ifndef __USART3_H#define __USART3_H#include "sys.h" #define USART3_MAX_RECV_LEN 255#define USART3_MAX_SEND_LEN 255extern u8 USART3_RX_buf[USART3_MAX_RECV_LEN];extern u8 USART3_TX_buf[USART3_MAX_SEND_LEN];extern u16 USART3_RX_STA;       //接收状态标记 void
发表于 2018-08-13
STM32串口通迅–使用中断方式
在上一节串口通讯中使用了查询方式, 在少量数据传输应用中, 这种方法基本可行, 但如果通迅数据量比较大的话会对系统实时性造成很大的影响, 所以在实际工程运用中, 查询的方法并不多见.一个较好的方法就是利用空间换时间, 用一个缓存区加中断进行数据发送和接收, 以减少不必要的等待的时间, 提高系统的实时性.为了提高空间利用率, 最常用的方法是采用一个环形队列做为接收/发送缓存, 配合中断, 可很好的完成数据接收/传送, 在时间和空间中取得一个平衡.  有关环形队列的知识, 这里不多做介绍, 可参考相关资料.使用环形队列做为缓存.发送逻辑: 当有一个字符串要发送时, 待发送的字符串送入FIFO缓存, 然后打开串口中断, 在中断
发表于 2017-02-06
小广播
何立民专栏 单片机及嵌入式宝典

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

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