一直被说是就不能把几个串口放在一起,写个标准例程直接用,非要每次用哪个串口才现场改程序,被迫把usart1,usart2,usart3进行了资源整合,挂在这以备不时之需。
功能简述:
串口1,串口2,串口3串口内自收自发数据,串口之间通信互发数据,读取串口的缓冲区进行收发都可以,资源冲突已经解决,可以直接用。
程序声明:
根据标准例程对usart1,usart2,usart3进行了GPIO,时钟,串口等配置,放在了一个工程中,为每个串口定义了自己的缓冲区(大小也是)用于存储串口接收到的数据。
因为主要用的是usart1来进行调试,所以就为usart1中配置了标准库函数,若需要用其他串口来打印输出,可以将下方代码复制到对应的.c文件,更改USART1串口号即可。
#if 1
#pragma import(__use_no_semihosting)
//标准库需要的支持函数
struct __FILE
{
int handle;
};
FILE __stdout;
//定义_sys_exit()以避免使用半主机模式
void _sys_exit(int x)
{
x = x;
}
//重定义fputc函数
int fputc(int ch, FILE *f)
{
while((USART1->SR&0X40)==0);//循环发送,直到发送完毕
USART1->DR = (u8) ch;
return ch;
}
#endif
哪个串口需要用到ucos就复制这段代码
#if SYSTEM_SUPPORT_OS
#include "includes.h" //ucos 使用
#endif
移植注意事项:
需要更改串口对应的GPIO引脚,对应的缓冲区变量,缓冲区大小,接收标记变量,使能变量,串口号,函数名,时钟源,比如串口1的时钟源是APB2,串口2则是APB1,增加更多串口时,要同时增加变量声明,如串口2
#ifndef __USART2_H
#define __USART2_H
如果出现#223-D: function "xxxxxx" declared implicitly这种某个函数已经在头文件中声明了,但是在调用时出错就是没有可能声明冲突了,改个新的名字。
关键字:STM32F407 串口通信 数据收发
引用地址:
STM32F407多路串口通信进行数据收发
推荐阅读最新更新时间:2024-11-17 05:15
【stm32f407】独立看门狗 iwdog
独立看门狗 STM32F4的独立看门狗由内部专门的32Khz低速时钟(LSI)驱动,即使主时钟发生故障,它也仍然有效。这里需要注意独立看门狗的时钟是一个内部RC时钟,所以并不是准确的32Khz,而是在15~47Khz之间的一个可变化的时钟,只是我们在估算的时候,以32Khz的频率来计算,看门狗对时间的要求不是很精确,所以,时钟有些偏差,都是可以接受的。独立看门狗有几个寄存器与我们这节相关,我们分别介绍这几个寄存器,首先是关键字寄存器IWDG_KR 在关键字寄存器(IWDG_KR)中写入0xCCCC,开始启用独立看门狗;此时计数器开始从其 复位值0xFFF递减计数。当计数器计数到末尾0x000时,会产生一个复位信号
[单片机]
STM32之USART串口通信<二>
一、简单demo 通过232串口,与上位机进行通信。首先保证单片机232串口与电脑的串口接口相连,当然电脑是USB接口,其实USB接口的实质也是串口。我们实现上位机发送一个16进制的数据,单片机接受到数据后显示,并且2倍发送给上位机。 1、usart_init();串口初始化 void usart_init() { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructrue; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA
[单片机]
在Keil V5下新建STM32F407工程
1、 建立工程目录 新建一个工程目录,用来存放工程文件,源文件,头文件等,例如在桌面上新建一个名称为My_Project的目录。 2、 建立工程子目录 在步骤1建立的工程文件夹中建立子目录,用来存储工程中用到的不同文件。建立CMSIS、Library、Listing、Output、Project、User六个子目录,如下图所示。 下面来讲一下这六个子目录的作用。 CMSIS目录:用来存放和内核相关的文件 Library目录:用来存放STM32F4 标准外设固件库源码文件和对应的头文件。 Listing目录:用来存放列表文件。 Output目录:用来存放编译过程中产生的中间文件。 Projec
[单片机]
AT91SAM3S串口UART初始化及收发数据
SAM3S中的UART串口是一个两线异步收发器。这个串口能用来通信或者跟踪。有两个DMA通道与UART串口关联,可通过使用DMA处理串口传输以节省CPU时间。 SAM3S4C中有两个UART。与外设引脚的对应关系如下: 板子上使用的是UART0,及PA9和PA10引脚。 SAM3S的UART结构框图 串口初始化,收发数据 的步骤如下: 1、配置相应IO口的引脚(设置IO时钟及引脚工作模式) 2、打开UART时钟 3、复位并停止UART 4、设置UART功能(奇偶校验UART_MR、波特率UART_BRGR、DMA UART_PTCR、收发使能UART_CR 等) 5、收发数据 UART_THR U
[单片机]
基于STM32L151//STM32F407的矩阵键盘程序(不规则接口)
最近在做一个有关按键的项目,需要用到矩阵键盘,上网找了很多都是基于一些规则接口的程序,感觉无语,因为画PCB由于布线原因 不太可能矩阵键盘的几条线是连接连续的GPIO口,所以经过我自己思考,做出了自己基于STM32的不规则程序, 由于每种矩阵键盘的连接原理有时是不同,所以首先先讲明我的矩阵键盘的连接原理 4条行线初始化时全为1,列线全为0,由于我的列先有接10K的电阻,有按键按下时,被按下的列线为1, 行线一次置为1、0、0、0,1,0,0�,0,1,0�,0,0,1 基于STM32L151//STM32F407的矩阵键盘程序(不规则接口): 行接口:PA8,PA12,PB3,PB4 列接口:PA11,P
[单片机]
STM32F407的定时器1之7路PWM输出
实验现象:输出频率为10K /**************************************************************************************** *函 数 名:bsp_InitTimer1GPIO *函数功能:初始化定时器1相关IO *形 参:无 *返 回 值:无 *****************************************************************************************/ void bsp_InitTimer1GPIO(void) { GPIO_InitTypeDef GPIO_InitStru
[单片机]
STM32F407中的192K SRAM问题
STM32中 192K分为128k和64k,这两个RAM物理地址是不连续的。 所以档程序超过128K的时候,需要直接定义存储地址,并且在OPTION中讲RAM2勾选,其值是根据所选芯片自动定义的。 KEIL中默认使用128K RAM (起始地址:0x20000000),如果添加上另外的64K CCM DATA RAM (起始地址:0X10000000)后,编译器会优先使用那64K RAM KEIL ARM下如何把函数定位到指定地址 __ at() 需要加载#include absacc.h ; char temp __at(0x10000000); 时出现上面的编译错误, 但将地址改为: char temp __at(
[单片机]
51单片机串口通信的注记
最近折腾51单片机,当然学到的都是比较基础的东西,可能我认为比较复杂的概念有 中断 和 串口通信 ,这篇主要是讲串口通信 使用的自然是山大王STC89C52RC的芯片来学习 串口通信主要是C51单片机的RXD 和TXD 与上位机进行通信,由于上位机一般是电脑,所以要TTL转成电脑能读出的RS232的电路来支持 一般使用MAX232 芯片 串口通信电路如下 之后就可以电脑的串口与这里的串口头子接了,注意 串口先要交叉一下 即电脑的TXD 对应下位机的RXD C51单片机串口通信模式有4种,最常用的是第一种 方式0 同步移位寄存器方式 ,一般用来扩展I/O口, 方式1 10位异步收发(8位数据),
[单片机]