stm32f103之串口实验

发布者:DreamyEclipse最新更新时间:2019-10-23 来源: eefocus关键字:stm32f103  串口实验  相互通讯 手机看文章 扫描二维码
随时随地手机看文章

stm32f103之串口实验,串口相互通讯即用同一个单片机的串口1与串口3相互通讯


串口1,串口3都接到电脑上,选上”Use MicroLIB”这是KEIL自带的一个简易的库,例如你用printf函数的时候,就会从串口1 输出字符串,直接默认定向到串口1。(此程序中两个波特率不匹配,接受会出错,在实践中要设置串口一致的波特率)以下是程序


#ifndef __USART_H//头文件

 

#define __USART_H

#include "stdio.h"

#include "sys.h" 

 

 

void usart3_init(u32 bound);//如果想串口中断接收,请不要注释以下宏定义

void uart_init(u32 bound);

void USART_SendData(USART_TypeDef* USARTx, uint16_t Data);

 

 

#endif

#include "sys.h" 



void usart3_init(u32 bound);//如果想串口中断接收,请不要注释以下宏定义

void uart_init(u32 bound);

void USART_SendData(USART_TypeDef* USARTx, uint16_t Data);



#endif

#include "sys.h"//串口初始化文件

#include "usart.h"

#include //一定要有的头文件,若要使用printf,

 

 

 

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

//串口1中断服务程序

 

u8 USART_RX_BUF[USART_REC_LEN];     //接收缓冲,最大USART_REC_LEN个字节.

//接收状态

//bit15, 接收完成标志

//bit14, 接收到0x0d

//bit13~0, 接收到的有效字节数目

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

 

//初始化串口1  

void uart_init(u32 bound)

{

  //GPIO端口设置

  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=0 ;//抢占优先级0

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

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)  //mcu接受数据,接收中断(接收到的数据必须是0x0d 0x0a结尾),,一位一位的接收

{

Res =USART_ReceiveData(USART1); //mcu读取通过串口1接收到的数据

USART_SendData(USART3, Res);////mcu读取通过串口1接收到的数据,发送给串口3

  

}  

}     

      

 

#endif

 

 

//初始化串口3

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

//串口3中断服务程序

//注意,读取USARTx->SR能避免莫名其妙的错误   

u8 USART3_RX_BUF[USART_REC_LEN3];     //接收缓冲,最大USART_REC_LEN个字节.

//接收状态

//bit15, 接收完成标志

//bit14, 接收到0x0d

//bit13~0, 接收到的有效字节数目

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

     

 

void usart3_init(u32 bound)

{

  //GPIO端口设置

    GPIO_InitTypeDef GPIO_InitStructure;

USART_InitTypeDef USART_InitStructure;

NVIC_InitTypeDef NVIC_InitStructure;

RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);

 

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能USART3,GPIOB时钟

  

//USART3_TX   GPIOB10.

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //PB.10

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

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

  GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化PB10

   

  //USART13_RX   GPIOB.11初始化

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;//PB11

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

  GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化PB11 

 

  //Usart3 NVIC 配置

NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;

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

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

  

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

  USART_Cmd(USART3, ENABLE);                    //使能串口3 

  

 

}

 

void USART3_IRQHandler(void)                //串口3中断服务程序 abcd......0x0d,0x0a.定义了一个16位sta永于状态标记

                                                //bit15 完成位bit14结束位bit13-0数据位

{

u8 Res2;

 

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

{

Res2 =USART_ReceiveData(USART3); //mcu接受数据读取接收到的数据,一位一位的接受的,res2指的是一位,如果是S,表示是命令信息的起始位

USART_SendData(USART1, Res2);

}     

     } 

}

#endif

 


//主函数

#include "led.h"

#include "delay.h"

#include "sys.h"

#include "usart.h"

 int main(void)

 {u8 t;u8 len;

delay_init();

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

uart_init(115200);

usart3_init(9600);

 while(1){}

}

这是串口1发送数据的窗口

这是串口3接受数据的窗口

关键字:stm32f103  串口实验  相互通讯 引用地址:stm32f103之串口实验

上一篇:stm32f103双串口收发(调试通过)
下一篇:stm32f103串口1串口2收发程序

推荐阅读最新更新时间:2024-11-07 20:49

ucos ii 移植到STM32f103ze上
简介:在移植UCOS时,需要编写的函数文件有includes.h、os_cpu.c、os_cpu_a.asm、os_cpu.h、需要配置的文件有os_cgf.h、中断和启动代码。 采用别人移植好的代码。即所需函数已写好。 准备工作: 1、ucos ii源码 2、stm32库 步骤: 1、建工程。 工程目录为: 2、配置ucos ii 在os_cfg.h中配置相关功能 3、修改相关函数 ucos ii需要一个定时器,在stm32中采用systick定时器,因此需要配置systick定时器 void SysTick_Configuration(void) { //关计数
[单片机]
ucos ii 移植到<font color='red'>STM32f103</font>ze上
STM32f103系列 USART2 串口2通信
最近在做一个工程要用到多个串口同时通讯的,就参考了正点原子的串口通讯例程,发现例程是USART1 串口1的,后面我想改成USART2 串口2的,上网找了资料,要不是不靠谱,要不就是要积分下载。所以后面自己写了一个可用程序来和大家分享! .c文件 #include usart2.h void USART2_Init(u32 My_BaudRate) { GPIO_InitTypeDef GPIO_InitStrue; USART_InitTypeDef USART_InitStrue; NVIC_InitTypeDef NVIC_InitStrue; // 外设使能时钟 RCC_APB2PeriphCl
[单片机]
stm32f103——按键检测(轮询方式)
我们下面来讲一讲,GPIO在输入模式下检测按键是否被按下: 首先我们来看看按键按下时,K1处电压的变化情况是什么: 我们看到,按键按下时,K1处的电压并不是立马就下降为0v,因为按键有机械的弹性形变,导致按键被按下时,会发生抖动。我们用GPIO来读取K1处的电压是否为0,如果为低电平,则表示按键被按下。被按下后,如果为高电平,则表示按键被抬起来了。 但是,在这个按键抖动的过程中,电平有上升沿也有下降沿,电压有高电平也有低电平。所以,在这一段抖动的部分的时间段内,如果我们用GPIO去判断,由于电平忽高忽低,我们的程序就会识别出来,按键在被按下后马上就抬起来了。但是,实际上并不是这样。所以,我们需要跳过按键被按下时的前50
[单片机]
<font color='red'>stm32f103</font>——按键检测(轮询方式)
STM32F103 systick 是做什么用呢
提到systick 不得不抱怨以下STM32 的用户手册,既然提供了systick 的功 能,为啥手册里却只提了一下?后来笔者上网搜的时候,才发现,抱怨的不仅仅 是我一个人。整个DATASHEET上面就只有一句话提到了关于systick的具体用法,糊里糊涂的我蒙了半天,问老大,结果被人家鄙视了,我很是不爽就在网上看了看,结果还是没有资料,后来终于看了信达工作室里整合了一篇关于systick的文章,觉得不错就和大家分享下,希望对大家有帮助,由于时间紧张文章中可能会有写的不具体和逻辑不清楚的地方,请大家多包涵。 1. systick介绍 Systick 就是一个定时器而已,只是它放在了NVIC 中,主要的目的是为了 给操作系统提供一个硬
[单片机]
STM32F103+NRF24L01航模遥控器制作
摇杆数值ADC读取后通过DMA存到数组中,TIM3中断函数中对数据进行处理发送,同时对电池电压进行采集,OLED显示PIT、THR、电压等信息。 #include stm32f10x.h #include sys.h #include i2c.h #include delay.h #include usart.h #include remote.h #include oled0561.h #include ADC_DMA_Config.h #include spi.h #include nrf24l01.h #include TIM.h #include EEPROM.h #include key.h int main(v
[单片机]
<font color='red'>STM32F103</font>+NRF24L01航模遥控器制作
基于STM32F103入门3——外部中断
外部中断 基本概念 CPU在处理某一事件A时,发生了另一事件B请求CPU迅速去处理(中断发生),那么CPU就会暂停当前的工作(A事件),去执行B事件(中断响应和中断服务),然后B事件做完之后,再回到原来的事件(A事件)中继续工作。(中断的返回)。 简单的说就是 比如你在家看电视,突然电话响了(中断),然后又突然有人敲门(又另一个中断),这时,你是不是应该先不看电视,先去接电话,然后去开门,然后再回来看电视呢? 当然 电话响和有人敲门 你先去干哪个 取决于你觉得哪个更重要,更应该先去做。这个属于中断嵌套。 框图 功能说明 外部中断的配置 代码编写步骤 1:打开相应的时钟 1.1:GPIO的时钟 2.2:功能复用IO的
[单片机]
基于<font color='red'>STM32F103</font>入门3——外部中断
STM32F103 基础知识1
一、系统架构 四个驱动单元: --Cortex -M3 内核DCode总线(D-bus)和系统总线(S-bus); --通用DMA1和通用DMA2; 四个被动单元: --内部SRAM; --内部闪存存储器; --FSMC; --AHB到APB 的桥(AHB2APBx),它连接所有的APB设备; ICode总线 --该总线将Cortex -M3 内核的指令总线与闪存指令接口相连接。指令预取在此总线上完成。 DCode总线 --该总线将Cortex -M3 内核的DCode总线与闪存存储器的数据接口相连接(常量加载和调试访问)。 系统总线 --此总线连接Cortex -M3 内核的系统总线(外设总线)到
[单片机]
STM32CUBEMX(7)--移植雅特力AT32F403AVGT(兼容STM32F103VGT6),DAC输出电压
概述 本篇文章主要介绍如何使用 STM32 CubeMX移植到雅特力AT32F403AVGT7,并通过 DAC 输出电压,在 芯片 中有2个12位的DAC口可以供选择。 硬件 准备 首先需要准备一个开发板,这里我准备的是雅特力AT32F403AVGT7的开发板: 述 选择芯片型号 雅特力AT32F403AVGT7兼容STM32F103系列,故选取STM32f103VG进行开发。 配置 时钟 源 HSE与LSE分别为外部高速时钟和低速时钟,在本文中使用内置的时钟源,故都选择Disable选项,如下所示: 配置时钟树 雅特力AT32F403AVGT7最高频率到240M,但是STM32F1的最高主频到72M,同时使用不
[单片机]
STM32CUBEMX(7)--移植雅特力AT32F403AVGT(兼容<font color='red'>STM32F103</font>VGT6),DAC输出电压
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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