stm32串口实验:stm32通过usart1进行串口收发,PA9(TX)和PA10(RX)

这是stm32开发中比较简单的实验,原理是通过串口助手发送信息,stm32接收到信息以后在串口助手中打印相同的内容。

这里直接分享keil5工程代码,是在工程模板的基础上移植和修改了正点原子的串口代码

百度网盘链接:https://pan.baidu.com/s/1aptEjcYPuQlDD_ayZaNoJw
提取码:8hr9

(如果失效的话可以在下方评论留下邮箱,我看到会给你发一份)

顺便把usart.c和usart.h还有mian.c中的代码复制到下面,小伙伴可以直接移植到自己的工程中

实现的效果也在下面放上串口助手中显示的图片

usart.c

  1 #include "sys.h"
  2 #include "usart.h"
  3
  4
  5 //STM32F103核心板例程
  6 //库函数版本例程
  7 /********** mcudev.taobao.com 出品  ********/
  8
  9
 10 //////////////////////////////////////////////////////////////////////////////////
 11 //如果使用ucos,则包括下面的头文件即可.
 12 #if SYSTEM_SUPPORT_UCOS
 13 #include "includes.h"                    //ucos 使用
 14 #endif
 15 //////////////////////////////////////////////////////////////////////////////////
 16 //STM32开发板
 17 //串口1初始化
 18
 19 //////////////////////////////////////////////////////////////////////////////////
 20
 21
 22 //////////////////////////////////////////////////////////////////
 23 //加入以下代码,支持printf函数,而不需要选择use MicroLIB
 24 #if 1
 25 #pragma import(__use_no_semihosting)
 26 //标准库需要的支持函数
 27 struct __FILE
 28 {
 29     int handle;
 30
 31 };
 32
 33 FILE __stdout;
 34 //定义_sys_exit()以避免使用半主机模式
 35 void _sys_exit(int x)
 36 {
 37     x = x;
 38 }
 39 //重定义fputc函数
 40 int fputc(int ch, FILE *f)
 41 {
 42     while((USART1->SR&0X40)==0);//循环发送,直到发送完毕
 43     USART1->DR = (u8) ch;
 44     return ch;
 45 }
 46 #endif
 47
 48 /*使用microLib的方法*/
 49  /*
 50 int fputc(int ch, FILE *f)
 51 {
 52     USART_SendData(USART1, (uint8_t) ch);
 53
 54     while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET) {}
 55
 56     return ch;
 57 }
 58 int GetKey (void)  {
 59
 60     while (!(USART1->SR & USART_FLAG_RXNE));
 61
 62     return ((int)(USART1->DR & 0x1FF));
 63 }
 64 */
 65
 66 #if EN_USART1_RX   //如果使能了接收
 67 //串口1中断服务程序
 68 //注意,读取USARTx->SR能避免莫名其妙的错误
 69 u8 USART_RX_BUF[USART_REC_LEN];     //接收缓冲,最大USART_REC_LEN个字节.
 70 //接收状态
 71 //bit15,    接收完成标志
 72 //bit14,    接收到0x0d
 73 //bit13~0,    接收到的有效字节数目
 74 u16 USART_RX_STA=0;       //接收状态标记
 75
 76 void uart_init(u32 bound){
 77     //GPIO端口设置
 78   GPIO_InitTypeDef GPIO_InitStructure;
 79     USART_InitTypeDef USART_InitStructure;
 80     NVIC_InitTypeDef NVIC_InitStructure;
 81
 82     RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);    //使能USART1,GPIOA时钟
 83      //USART1_TX   PA.9
 84     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9
 85     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
 86     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;    //复用推挽输出
 87     GPIO_Init(GPIOA, &GPIO_InitStructure);
 88
 89     //USART1_RX      PA.10
 90     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
 91     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
 92     GPIO_Init(GPIOA, &GPIO_InitStructure);
 93
 94    //Usart1 NVIC 配置
 95
 96     NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
 97     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3
 98     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;        //子优先级3
 99     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;            //IRQ通道使能
100     NVIC_Init(&NVIC_InitStructure);    //根据指定的参数初始化VIC寄存器
101
102    //USART 初始化设置
103
104     USART_InitStructure.USART_BaudRate = bound;//一般设置为9600;
105     USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
106     USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
107     USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位
108     USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
109     USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;    //收发模式
110
111     USART_Init(USART1, &USART_InitStructure); //初始化串口
112     USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启中断
113     USART_Cmd(USART1, ENABLE);                    //使能串口
114
115 }
116
117
118
119 void USART1_IRQHandler(void)                    //串口1中断服务程序
120     {
121     u8 Res;
122 #ifdef OS_TICKS_PER_SEC         //如果时钟节拍数定义了,说明要使用ucosII了.
123     OSIntEnter();
124 #endif
125     if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾)
126         {
127         Res =USART_ReceiveData(USART1);//(USART1->DR);    //读取接收到的数据
128
129         if((USART_RX_STA&0x8000)==0)//接收未完成
130             {
131             if(USART_RX_STA&0x4000)//接收到了0x0d
132                 {
133                 if(Res!=0x0a)USART_RX_STA=0;//接收错误,重新开始
134                 else USART_RX_STA|=0x8000;    //接收完成了
135                 }
136             else //还没收到0X0D
137                 {
138                 if(Res==0x0d)USART_RX_STA|=0x4000;
139                 else
140                     {
141                     USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
142                     USART_RX_STA++;
143                     if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收
144                     }
145                 }
146             }
147      }
148 #ifdef OS_TICKS_PER_SEC         //如果时钟节拍数定义了,说明要使用ucosII了.
149     OSIntExit();
150 #endif
151 }
152 #endif    

usart.h

 1 #ifndef __USART_H
 2 #define __USART_H
 3 #include "stdio.h"
 4 #include "sys.h"
 5
 6 //STM32F103核心板例程
 7 //库函数版本例程
 8 /********** mcudev.taobao.com 出品  ********/
 9
10 //////////////////////////////////////////////////////////////////////////////////
11 //STM32开发板
12 //串口1初始化
13
14 #define USART_REC_LEN              200      //定义最大接收字节数 200
15 #define EN_USART1_RX             1            //使能(1)/禁止(0)串口1接收
16
17 extern u8  USART_RX_BUF[USART_REC_LEN]; //接收缓冲,最大USART_REC_LEN个字节.末字节为换行符
18 extern u16 USART_RX_STA;                 //接收状态标记
19 //如果想串口中断接收,请不要注释以下宏定义
20 void uart_init(u32 bound);
21 #endif

main.c

 1 #include "sys.h"
 2 #include "delay.h"
 3 #include "usart.h"
 4
 5 uint8_t t;
 6 uint8_t len;
 7 uint16_t times=0;
 8
 9 int main(void)
10 {
11     delay_init();     //延时函数初始化
12     uart_init(115200);     //串口初始化为115200
13
14     while(1)
15     {
16         if(USART_RX_STA&0x8000)  //USART_RX_STA第十六位为1则括号内为1,表示接收完数据
17         {
18             len=USART_RX_STA&0x3fff;//得到此次接收到的数据长度
19             printf("\r\n您发送的消息为:\r\n\r\n");
20             for(t=0;t<len;t++)
21             {
22                 USART_SendData(USART1, USART_RX_BUF[t]);//向串口1发送数据
23                 while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束
24             }
25             printf("\r\n\r\n");//插入换行
26             USART_RX_STA=0;
27         }else
28         {
29             times++;
30             if(times%500==0)printf("请输入数据,以回车键结束\n");
31             delay_ms(10);
32         }
33     }
34 }

串口实验效果图:

未发送时

发送数据时:

祝小伙伴们2020加油!

原文地址:https://www.cnblogs.com/hjf-log/p/stm32-usart1.html

时间: 2024-10-30 16:57:49

stm32串口实验:stm32通过usart1进行串口收发,PA9(TX)和PA10(RX)的相关文章

STM32串口通信配置(USART1+USART2+USART3+UART4)

一.串口一的配置(初始化+中断配置+中断接收函数) 1 /*=============================================================================== 2 Copyright: 3 Version: 4 Author: 5 Date: 2017/11/3 6 Description: 7 配置独立看门狗初始化函数,在主函数中运行IWDG_ReloadCounter进行喂狗主函数必须在4s内进行一次喂狗不然系统会复位: 8 函数功

串口通信 stm32

文件:mian.c //功能:串口初始化.打开定时器中断,然后一直接收数据状态就好了.发送在中断中实现 #include "stm32f10x.h"#include "usart.h" u8 USART_rx_data;int main(void){    RCC_Configuration();      //系统时钟配置  GPIO_Configuration();      //端口初始化  NVIC_Configuration();      //中断源配置

实验2串口实验

0目标 1STM32 串口简介 2硬件设计 3软件设计 4下载验证 0.目标 利用串口1 不停的打印信息到电脑上,同时接收从串口发过来的数据,把发送过来的数据直接送回给电脑. 1.STM32 串口简介 串口设置的一般步骤可以总结为如下几个步骤:1) 串口时钟使能, GPIO 时钟使能2) 串口复位3) GPIO 端口模式设置4) 串口参数初始化5) 开启中断并且初始化 NVIC(如果需要开启中断才需要这个步骤)6) 使能串口7) 编写中断处理函数注:对于复用功能的 IO,我们首先要使能GPIO 

S5PV210 串口实验(中断方式)

结合之前的串口实验(轮询方式)与中断体系分析,我们来做下中断方式的串口接收实验. start.S .global _start .global IRQ_handle _start: /* 关 Watch Dog */ ldr r0, =0xE2700000 mov r1, #0 str r1, [r0] /* 设置系统模式栈指针 */ ldr sp, =0x40000000 /* 开 IRQ 总中断开关 */ mov r0, #0x53 msr CPSR_cxsf, r0 /* 时钟初始化 */

「ZigBee模块」协议栈-串口透传,打造无线串口模块

前面写比较仔细,后面一个么因为和前面重复了,不多说了,还有个原因...我懒...O(∩_∩)O哈哈~ 串口透传,打造无线串口模块 一.实验目的 两台PC机各使用串口连接一个zigbee模块,连接正确后打开串口调试助手发送信息.利用zigbee将从串口接收到的数据无线传送给另一个zigbee模块,另一个zigbee模块通过串口将数据传给PC端并在屏幕上显示. 二.实验平台 硬件:两个zigbee模块,两台PC机(其实一台也许,连接不同串口即可),编译器,方口转USB数据线两根 软件:基于Z-sta

串口协议匹配函数,避免串口数据接收时顺序换乱错误

按照协议匹配,避免串口数据接收时顺序换乱错误. 包头 长度 地址码 回复状态 校验和 包尾 备注 C0C0 02 F5 AA YY CF 成功 1,转移字符 a)              数据包基本格式中的数据长度.数据和校验和中如果出现关键字C0. CF或CA则需要在其前端加上转义字符CA,即将数据C0.CF或CA发送成CAC0.CACF或CACA,将数据C0C0发送成CAC0CAC0. b)              数据包基本格式中的数据长度length以有效数据的数量为准,即不 需要也

stm32+dht11温湿度数据实验-stm32将采集dht11温湿度通过usart1在串口助手打印

网上其实已经介绍了很多dht11这种单线通讯协议 这里就不多重复大佬们的工作了,直接上keil5工程 keil5工程百度网盘链接:https://pan.baidu.com/s/1HDNe7gUM_dplRzR_j17wtA 提取码:xpfj 另外我把dht11.c和dht11.h直接贴在下面,小伙伴可以直接移植到自己的代码中就行了 之后会把stm32的两个实验组合起来实现一个简单的室内温度计,温湿度数据显示在oled上,学以致用嘛 岂不美哉 1 #ifndef __DHT11_H 2 #def

STM32组合设备实现USB转双串口

USB转双串口,核心技术就在于组合设备(USB Composite)的实现,组合设备的实现,其核心技术在于描述符的实现,下面我们先给出描述符:设备描述符 [C] 纯文本查看 复制代码 ? 00001 00002 00003 00004 00005 00006 00007 00008 00009 00010 00011 00012 00013 00014 00015 00016 00017 00018 00019 00020 00021 00022 00023 00024 00025 00026

cortex_m3_stm32嵌入式学习笔记(三):串口实验(串口通信)

串口,可以理解为是用来和上位机(比如电脑)对话的,本节实验实现的是stm32接收上位机发送过来的信息,在原原本本的返回过去 stm32有5路串口,本节学习的是其中之一的USB串口(USART1)和学习IO口一样,首先要配置串口,由于原子已经配好了写在sys文件里,本渣就本着不造轮子的理念(其实是太难不懂orz),先跳过去了.. 所以本工程只需要一个main函数即可 #include "led.h" #include "sys.h" #include "de