历史上的今天
返回首页

历史上的今天

今天是:2024年12月03日(星期二)

正在发生

2018年12月03日 | STM32基础实验3(串口通信)

2018-12-03 来源:eefocus

一、实验原理


简单串口通信实例 


1、串口设置的一般步骤可以总结为如下几个步骤: 

1) 串口时钟使能,GPIO时钟使能 

2) 串口复位 

3) GPIO端口模式设置 

4) 串口参数初始化 

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

6) 使能串口 

7) 编写中断处理函数 


2、具体函数实现 

1)串口时钟使能,GPIO时钟使能:RCC_APB2PeriphClockCmd();


    //①串口时钟使能,GPIO时钟使能

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//GPIOA时钟使能

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//串口1时钟使能


2)GPIO端口模式设置:GPIO_Init(); 模式设置为GPIO_Mode_AF_PP和GPIO_Mode_IN_FLOATING


    //②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);//GPIO端口模式设置

    //②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);//GPIO端口模式设置


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


    //③串口参数初始化

    USART_InitStrue.USART_BaudRate=115200;//波特率

    USART_InitStrue.USART_HardwareFlowControl=USART_HardwareFlowControl_None;//无硬件流

    USART_InitStrue.USART_Mode=USART_Mode_Tx|USART_Mode_Rx;//收发模式都打开

    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);


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

NVIC_Init(); 

USART_ITConfig();


  //④

    USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//④开启接收中断!!!!


    NVIC_InitStrue.NVIC_IRQChannel=USART1_IRQn;;//串口1中断

    NVIC_InitStrue.NVIC_IRQChannelCmd=ENABLE;

    NVIC_InitStrue.NVIC_IRQChannelPreemptionPriority=1;// 抢占优先级为1

    NVIC_InitStrue.NVIC_IRQChannelSubPriority=1;//子优先级位1

    NVIC_Init(&NVIC_InitStrue);//④中断初始化函数


5)使能串口:USART_Cmd();


    //⑤使能串口

    USART_Cmd(USART1,ENABLE);


6)编写中断处理函数:USARTx_IRQHandler(); 

7)串口数据收发: 

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

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


//自己编写的中断处理函数(SYSTEM中重复定义了)⑥

void USART1_IRQHandler(void)

{

    u8 res;

     if(USART_GetITStatus(USART1,USART_IT_RXNE))//判断是否有接受中断!

 {

     //串口数据收发函数⑦

     res= USART_ReceiveData(USART1); 

     USART_SendData(USART1,res);   

  }

}


8)串口传输状态获取(暂未用到): 

FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG); 

void USART_ClearITPendingBit(USART_TypeDef* USARTx, uint16_t USART_IT); 


3、使用中文手册查串口需要配置的GPIO模式


这里写图片描述


二、实验代码


**main.c**

#include "stm32f10x.h"


void My_USART1_Init(void)//自己写的简单串口初始化函数,可以把单独个uart.c

{

    //2、3、4定义结构体指针

    GPIO_InitTypeDef GPIO_InitStrue;

    USART_InitTypeDef USART_InitStrue;

    NVIC_InitTypeDef NVIC_InitStrue;


    //①串口时钟使能,GPIO时钟使能

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//GPIOA时钟使能

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//串口1时钟使能


    //②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);//GPIO端口模式设置

    //②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);//GPIO端口模式设置


    //③串口参数初始化

    USART_InitStrue.USART_BaudRate=115200;//波特率

    USART_InitStrue.USART_HardwareFlowControl=USART_HardwareFlowControl_None;//无硬件流

    USART_InitStrue.USART_Mode=USART_Mode_Tx|USART_Mode_Rx;//收发模式都打开

    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);


    //⑤使能串口

    USART_Cmd(USART1,ENABLE);

  //④

    USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//④开启接收中断!!!!


    NVIC_InitStrue.NVIC_IRQChannel=USART1_IRQn;;//串口1中断

    NVIC_InitStrue.NVIC_IRQChannelCmd=ENABLE;

    NVIC_InitStrue.NVIC_IRQChannelPreemptionPriority=1;// 抢占优先级为1

    NVIC_InitStrue.NVIC_IRQChannelSubPriority=1;//子优先级位1

    NVIC_Init(&NVIC_InitStrue);//④中断初始化函数

}


//自己编写的中断处理函数(SYSTEM中重复定义了)⑥

void USART1_IRQHandler(void)

{

    u8 res;

     if(USART_GetITStatus(USART1,USART_IT_RXNE))//判断是否有接受中断!

 {

     //串口数据收发函数⑦

     res= USART_ReceiveData(USART1); 

     USART_SendData(USART1,res);   

  }

}



int main(void)

{

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//中断优先级分组函数

    My_USART1_Init();

    while(1);//等待中断


}


三、实验结果


 这里写图片描述 


需要串口助手中的配置与初始化的一致


    //串口参数初始化

    USART_InitStrue.USART_BaudRate=115200;//波特率

    USART_InitStrue.USART_HardwareFlowControl=USART_HardwareFlowControl_None;//无硬件流

    USART_InitStrue.USART_Mode=USART_Mode_Tx|USART_Mode_Rx;//收发模式都打开

    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);


推荐阅读

史海拾趣

Gore公司的发展小趣事
在隔离型中压大容量直流变换器中,可能存在直流偏磁问题,导致变压器磁路饱和、励磁电流增加、局部过热和噪声增大等问题。
HEICO Corporation公司的发展小趣事

为了进一步扩大在电子行业的市场份额,HEICO Corporation采取了积极的并购策略。例如,在2022年,公司宣布收购Accurate Metal Machining, Inc. 96%的股份,这是一家位于克利夫兰的高可靠性组件制造商。此次收购为HEICO带来了新产品和功能,增强了其在航空航天和国防领域的竞争力。通过并购,HEICO不仅获得了先进的技术和人才,还拓宽了产品线,加速了其在电子行业的扩张步伐。

Dino-Lite公司的发展小趣事

Dino-Lite公司自创立之初,就专注于数字显微镜技术的研发与创新。公司研发团队不断探索新技术,将传统显微镜与现代数字技术相结合,成功推出了一系列高性能、易用性强的Dino-Lite数字显微镜产品。这些产品以其高清画质、便捷操作和广泛适用性,迅速赢得了市场的认可。

随着技术的不断进步,Dino-Lite公司不断推出新产品,满足了不同行业对数字显微镜的需求。例如,公司针对医疗领域推出了高分辨率、低光环境下的专业显微镜,为医疗诊断和治疗提供了有力支持;同时,针对教育行业推出了性价比高的入门级产品,让更多的学生和老师能够接触和使用到先进的显微镜技术。

GradConn Ltd公司的发展小趣事

GradConn深知不同客户对连接解决方案的需求各不相同,因此公司特别注重提供定制化服务。通过与客户紧密合作,GradConn能够深入了解其特定需求,并据此设计出符合客户要求的定制化产品。这种服务不仅提升了客户的满意度,还增强了GradConn在市场上的竞争力。许多知名企业都选择GradConn作为其连接器和电缆组件的供应商,正是看中了其强大的定制化能力。

Bipolarics Inc公司的发展小趣事

在快速发展的过程中,Bipolarics Inc始终重视人才培养和团队建设。公司注重从高校和研究机构引进优秀人才,同时加强内部员工的培训和晋升机制。通过打造一支高效、专业的团队,Bipolarics Inc在技术研发、市场营销等方面取得了显著成绩。此外,公司还积极营造良好的企业文化氛围,激发员工的创新精神和团队凝聚力。

正泰公司的发展小趣事

随着工业4.0时代的到来,正泰公司积极推进智能制造转型。以海宁工厂为例,正泰通过引入自动化生产线和信息化管理系统,提高了生产效率和产品质量。同时,公司还加大了对智能制造技术的研发和应用力度,推动生产过程的数字化、网络化、智能化。这一转型不仅提升了公司的生产效率和市场竞争力,也为公司的未来发展奠定了坚实的基础。

以上五个故事只是正泰公司发展过程中的冰山一角,但它们充分展示了正泰公司在电子行业中不断创新、追求卓越的精神风貌和坚定决心。

问答坊 | AI 解惑

指针不完全手册

1、 指针与变量 定义一个变量,再定义一个指向该变量类型的指针,把该变量的地址赋给此指针,然后通过此指针访问该变量,教科书上都是这样说的,但恐怕没有人这样用,因为还不如直接访问变量名直截了当。问题是为什么这两种方法都可以访问那个特 ...…

查看全部问答>

ccd

我需要测光点大小,想要ccd采集,单片机处理,有哥们玩过没,指点下。。。。…

查看全部问答>

如何定制支持MFC的SDK

现在想把原来在WINCE5.0开发的MFC程序移植到WINCE6.0上面, 但一直不能成功.特来请教下: 我现在的环境是VS2005+WINCE6.0  之前在网上找了下, 说是WINCE6.0默认是不支持MFC的.要手动添加几个DLL文件. 现在我也把 MFC80ENU.DLL加进去了, ...…

查看全部问答>

不能编译DriverStudio3.2库的问题

我使用的是vs2005 DriverStudio3.2 XPDDK编译DriverStudio库文件时出现这样的问题如下: C:\\PROGRA~1\\COMPUW~1\\DRIVER~1\\DRIVER~4\\source>call C:\\WINDDK\\2600\\bin\\setenv.bat C:\\WINDDK\\2600 chk   C:\\PROGRA~1\\COMPUW~1 ...…

查看全部问答>

麻烦高手看下编写的AT89C52对TLC1543取样的程序

;-------------------1543对应的管脚接线方式----------------------- ;1543AT89C52 ;EOCP1.5 ;I/O CLOCKP1.6 ;ADDRESSP1.7 ;DATAOUTP3.0 ;CSP3.1 ;=========================================== ...…

查看全部问答>

blob源码中configure.in的问题

case \"$board_name\" in     assabet)         board_name=\"Intel Assabet\"         AC_DEFINE(ASSABET)                      ...…

查看全部问答>

基于蓝牙应用的嵌入式开发板选型问题

想做个基于蓝牙应用的嵌入式项目,想法是 开发板+单独蓝牙模块,操作系统用linux,因为对硬件不熟悉,不知道选择那个平台的什么型号的开发板,恳请赐教,谢谢~~~…

查看全部问答>

LM3s8962体验之二----------- Keil µVision 4 目标工具选项详解

一、目标工具选项(Target Options …) µVision可以设置目标硬件的选项。通过下图1中的工具栏2区域按钮或1区域菜单项Project -> Options for Target打开Options for Target对话框。         & ...…

查看全部问答>

手机万能充

当接入电源后,通过整流二极管VD1、R1给开关管Q1提供启动电流,使Q1开始导通,其集电极电流Ic在L1中线性增长,在L2中感应出使Q1基极为正,发射极为负的正反 馈电压,使Q1很快饱和。与此同时,感应电压给C1充电,随着C1充电电压的增高,Q1基极电位逐 ...…

查看全部问答>

请问Freescale MPC8377VRALG 的架构和CPU类型是什么?

我用的芯片是Freescale MPC8377VRALG,现在想用crosstool-ng编用在这块芯片上的交叉编译工具链。在crosstool-ng menuconfig配置中“Target options”下有几项不知道填写什么,请大家提供帮助。谢谢! Target options  --->   &nbs ...…

查看全部问答>