ARM开发(5)基于STM32的UART串口通信实验

发布者:心若水仙最新更新时间:2019-08-19 来源: eefocus关键字:ARM  STM32  UART  串口通信 手机看文章 扫描二维码
随时随地手机看文章

串口通信原理:


1.1 本实验实现串口助手发送数据然后回送在串口助手呈现出来。


1.2 实验思路:看懂电路图,理解uart串口通信原理。


1.3 开发环境 : MDK5 库函数版本开发 JLINK仿真 


二 实验步骤: 

2.1 uart.h代码:


#ifndef __USART_H

#define __USART_H

#include "stdio.h"  

#include "sys.h" 

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

#define EN_USART1_RX    1       //使能(1)/禁止(0)串口1接收

extern u16  USART_TX_BUF[16];       

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

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

void uart_init(u32 bound);

#endif


2.2 uart.c代码(UART串口配置及中断服务程序):


#include "sys.h"

#include "usart.h"    

#if 1

#pragma import(__use_no_semihosting)  //标准库需要的支持函数           


struct __FILE 

    int handle; 


}; 


FILE __stdout;       


_sys_exit(int x) // 以避免使用半主机模式

    x = x; 


int fputc(int ch, FILE *f)  // 重定义fputc函数

{      

    while((USART1->SR&0X40)==0);//循环发送,直到发送完毕   

    USART1->DR = (u8) ch;      

    return ch;

}

#endif 


#if EN_USART1_RX   //如果使能了接收


u8 USART_RX_BUF[USART_REC_LEN];     //接收缓冲区


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


void uart_init(u32 bound){


  GPIO_InitTypeDef GPIO_InitStructure;

  USART_InitTypeDef USART_InitStructure;

  NVIC_InitTypeDef NVIC_InitStructure;


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


    //USART1_TX   GPIOA.9

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;    //PA.9

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出 

  GPIO_Init(GPIOA, &GPIO_InitStructure);// 初始化GPIOA.9


  //USART1_RX     GPIOA.10

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;// 浮空输入

  GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.10  


  //Usart1 NVIC 配置

  NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3

    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //子优先级3

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

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


   //USART 初始化设置


    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(USART1, &USART_InitStructure); //初始化串口1

   USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启串口接受中断

   USART_Cmd(USART1, ENABLE);   //使能串口1 


}


 void USART1_IRQHandler(void)      //串口1中断服务程序

    {

    u8 Res;


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

        {

        Res =USART_ReceiveData(USART1); //读取接收到的数据


        if((USART_RX_STA&0x8000)==0)//接收未完成

            {

            if(USART_RX_STA&0x4000)//接收到了0x0d

                {

                if(Res!=0x0a)USART_RX_STA=0;//接收错误,重新开始

                else USART_RX_STA|=0x8000;  //接收完成了 

                }

            else //还没收到0X0D

                {   

                if(Res==0x0d)USART_RX_STA|=0x4000;

                else

                    {

                    USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;

                    USART_RX_STA++;

                    if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收        

                    }        

                }

            }            

     } 


  } 

#endif  


2.3 main.c代码:


   #include "led.h"

   #include "delay.h"

   #include "key.h"

   #include "sys.h"

   #include "beep.h"

   #include "keyled.h" 

   #include "usart.h"

   int main(void)

   {

       u8 t,len;

       u16 times=0;

       delay_init();

       NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);

       uart_init (115200); //波特率设置

       LED_Init();             

       KEY_Init();


       while(1)

       {

           if(USART_RX_STA&0X8000)

           {

               len=USART_RX_STA&0X3F;

               printf("发什么消息:n");

               for (t=0;t               {USART_SendData(USART1,USART_RX_BUF[t]);

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



           } 

           printf ("n");

           USART_RX_STA=0;

       }

       else{

           times++;

           if(times %5000==0)

           {

               printf ("发送了n");



           } 

           if(times %200==0) printf ("请输入数据:n");

           if(times %30==0) BEEP =!BEEP;

           delay_ms(10);

           }

    } 

 } 


三 接线测试:


3.1 与板子接线测试效果良好,串口调试效果良好。



关键字:ARM  STM32  UART  串口通信 引用地址:ARM开发(5)基于STM32的UART串口通信实验

上一篇:ARM开发(6) 基于STM32的矩阵键盘按键触发外部中断
下一篇:ARM开发(1) 基于stm32的led跑马灯

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

基于ARM和PSO-BP的人体穴位定位系统
穴位的位置是否找准会直接影响治疗效果,因此设计了一种基于粒子群算法优化神经网络(PSO-BP)的穴位相对坐标预测模型,然后与ARM结合构成一个可以用于人体穴位定位的系统。首先采用PC进行MATLAB仿真训练学习,然后将最优权值及阈值保存下来并简化算法嵌入ARM内,将在线预测转变为离线过程。实验结果表明:经粒子群优化过的BP神经网络有效地改善了局部极值缺陷,可应用于定位端预测穴位的位置,并在LCD中显示穴位相关信息,控制端收到位置数据后可执行电机上的运动操作。 0 引言 人体穴位分布容易受到人体尺寸和比例的影响,所以具有以下两个特性:非线性、模糊不确定性。人体穴位分布的解决方法主要有3种:视觉技术、光学定位法和专家系统法。但是这
[单片机]
基于<font color='red'>ARM</font>和PSO-BP的人体穴位定位系统
几张图对比STM32各系列产品特性和外设兼容性
STM32产品系列特性比较 下面是STM32F0、F1、F2、F4、L1各产品系列的特性进行对比: 外设兼容性分析对比 对STM32进行过研究的朋友,特别是使用过寄存器开发的朋友应该很明白STM32片上外设,进行过对比的朋友,会发现,各系列MCU的片上外设很多相似之处,甚至完全一样。 下面将F1分别和F0、F2、F4、L1对比一下,大家看看有哪些差异。 1.STM32 F1 与 F0 系列外设兼容性分析对比 2.STM32 F1 与 F2 系列外设兼容性分析对比 3.STM32 F1 与 F4 系列外设兼容性分析对比 4.STM32 F1 与 L1 系列外设兼容性分析对比 Pin引脚对比 S
[单片机]
以太网简介以及SMI接口
以太网简介 STM32F20X和STM32F21的以太网外设可接受和发送数据按照IEE802.3-2002标准。 以太网提供一个完整的、灵活的外设去满足不同应用和要求。它支持与外部相连(PHY)的两个标准的工业接口:默认情况使用在IEEE802.3规范中定义的独立介质接口(MII)和精简介质独立接口(RMII)。它可以被用于大量的需求,例如开关(交换机)、网络接口卡等等。 以太网满足下列标准: ● IEEE 802.3-2002,用于以太网MAC。 ● IEEE 1588-2008标准,用于规定联网时钟同步的精度。 ● AMBA 2.0,用于AHB主/从端口。 ● RMII联盟的RMII规范。 02 STM32F207的ETH介绍
[单片机]
以太网简介以及SMI接口
意法半导体量产STM32 F0系列入门级MCU
意法半导体(ST)5月15日在北京媒体沟通会上宣布,开始量产基于ARM Cortex-M0处理器内核的入门级STM32 F0系列32位MCU。其适于工业控制器、家庭自动化、打印机和白色家电等应用。   STM32 F0的主要特性包括:①工作频率48MHz时,性能为38DMIPS,独立第三方评测机构的CoreMark评分为68;24MHz时,22DMIPS,CoreMark39。11项外设映射在5通道的DMA,结合总线矩阵,使闪存中执行代码与DMA数据传输同步操作。   ②四个低功耗模式包括5.3μA停止模式,实时时钟运行的2.8μA待机模式,电池供电模式下且实时时钟运行时0.4μA。1.8V/2-3.6V电源电压。功耗效率如图
[模拟电子]
意法半导体量产<font color='red'>STM32</font> F0系列入门级MCU
ARM指令集中常用的存储和加载指令
ARM微处理器支持加载/存储指令用于在寄存器和存储器之间传送数据,加载指令用于将存储器中的数据传送到寄存器,存储指令则完成相反的操作。常用的加载存储指令如下: LDR 字数据加载指令 LDRB 字节数据加载指令 LDRH 半字数据加载指令 STR 字数据存储指令 STRB 字节数据存储指令 STRH 半字数据存储指令 1、LDR指令 LDR指令的格式为: LDR{条件} 目的寄存器, 存储器地址 LDR指令用于从存储器中将一个32位的字数据传送到目的寄存器中。该指令通常用于从存储器中读取32位的字数据到通用寄存器,然后对数据进行处理。当程序计数器PC作为目的
[单片机]
基于ARM Linux的无线音视频对讲系统设计方案
随着数字化和网络化时代的到来,尤其是宽带无线网络的发展,为音视频这样大数据量传输业务在无线网络上的应用提供了契机。同时由于音视频独特的感官特性,使其相关的应用需求也变得越来越迫切。无线多媒体是多媒体和移动通信这两个领域的技术相互融合的产物,成为当今通信领域的一个热点。鉴于Linux内核的开源性,采用其作为操作系统,从而使整个系统具有更好的实时性和稳定性。整个系统以ARM11为核心处理器、采用新一代视频编解码标准H.264进行编译码,并通过无线网络传输音视频。它充分利用S3C6410微处理器内部集成的多媒体编解码器(Multi-Formatvideo Codec,MFC),有效提高了系统的性价比。整个系统为无线多媒体音视频的传输提供
[单片机]
基于<font color='red'>ARM</font> Linux的无线音视频对讲系统设计方案
stm32库函数下,输出可调频率pwm
//////////////////////////////////////////////////////////// //基于库函数的不完全代码 //////////////////////////////////////////////////////////// TIM3_PWM_Init(899,0); //不分频。PWM频率=72000000/900=80Khz while(1) { TIM3- ARR=led0pwmval+50; //改变此句话的值,调节pwm频率 TIM_SetCompare2(TIM3,49); delay_ms(500); led0pwmval++; if(led0
[单片机]
7.ARM处理器的工作模式
ARM七种工作模式:图1-1: 图1-1 上面的七种工作模式可以在cpsr设置:如下的M =Mode number。 图1-2 之所以要有这么多种模式,是为了避免致命的错误。例如我们写的应用程序运行在User模式,操作系统的运作在比较高的模式。 User模式:普通程序运行的模式。 FIQ:快速中断运行的模式 RIQ:普通中断运行的模式 Supervisor:特权模式 Abort:访问内存异常等 Undefined:未定义模式,数据未定义。 System:系统模式 Linux对于用户程序是运行在User模式,内核运行在Supervisor模式。
[单片机]
7.<font color='red'>ARM</font>处理器的工作模式
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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