历史上的今天
今天是:2024年09月13日(星期五)
2018年09月13日 | stm32f407的串口使用集合(USART1,USART2,USART3,USART6)
2018-09-13 来源:eefocus
由于项目需要使用多串口,因此基于正点原子探索者开发板的串口例程里的串口不够用,在此基础之上,自己对需要用的几个串口操作做了简要的封装,其中已经实现的串口有串口1,串口2,串口3以及串口六,如果有大神能够帮忙完善,本菜鸟在此先谢过,请多多指教
其中的头文件内容如下:
/*
* file: usart.h
* author: Jeans Oyoung
* create on June 23, 2016
*/
#include
#define USE_USART1
#define USE_USART2
#define USE_USART3
#define USE_USART4
#define USE_USART5
#define USE_USART6
struct Usart_TypeDef;
class Usart
{
public:
typedef enum {
#ifdef USE_USART1
UC_1,
#endif
#ifdef USE_USART2
UC_2,
#endif
#ifdef USE_USART3
UC_3,
#endif
#ifdef USE_USART4
UC_4,
#endif
#ifdef USE_USART5
UC_5,
#endif
#ifdef USE_USART6
UC_6
#endif
} UsartCode;
static Usart& use(UsartCode code);
Usart(const Usart& usart);
Usart& operator =(const Usart& usart);
static Usart Null;
bool isValid() const {
return raw_usart != nullptr;
}
int write(const void *data, unsigned length);
int read(void *data, unsigned length);
int send(const char *string);
private:
Usart() : raw_usart(0) { }
Usart(Usart_TypeDef *usart): raw_usart(usart) {}
#ifdef USE_USART1
static Usart& useUsart1();
#endif
#ifdef USE_USART2
static Usart& useUsart2();
#endif
#ifdef USE_USART3
static Usart& useUsart3();
#endif
#ifdef USE_USART4
static Usart& useUsart4();
#endif
#ifdef USE_USART5
static Usart& useUsart5();
#endif
#ifdef USE_USART6
static Usart& useUsart6();
#endif
private:
Usart_TypeDef *raw_usart;
};
extern Usart usart[];
#endif
/*----------------------end-------------------*/
以下是未完成的源文件,具体实现部分由读者自行添加,笔者只是提供一个接口思路
/*
* file: usart.cpp
* author: Jeans Oyoung
* create on June 23, 2016
*/
/*+++++++++++++++++includes++++++++++++++++*/
Usart Usart::Null;
Usart usart[] = {
Usart::Null,
#ifdef USE_USART1
Usart::use(Usart::UC_1),
#endif
#ifdef USE_USART2
Usart::use(Usart::UC_2),
#endif
#ifdef USE_USART3
Usart::use(Usart::UC_3),
#endif
#ifdef USE_USART4
Usart::use(Usart::UC_4),
#endif
#ifdef USE_USART5
Usart::use(Usart::UC_5),
#endif
#ifdef USE_USART6
Usart::use(Usart::UC_6),
#endif
};
Usart::Usart(const Usart &usart)
: raw_usart(usart.raw_usart)
{
}
Usart& Usart::operator =(const Usart& usart)
{
raw_usart = usart.raw_usart;
}
Usart& Usart::use(UsartCode code)
{
switch (code) {
#ifdef USE_USART1
case UC_1:
return useUsart1();
break;
#endif
#ifdef USE_USART2
case UC_2:
return useUsart2();
break;
#endif
#ifdef USE_USART3
case UC_3:
return useUsart3();
break;
#endif
#ifdef USE_USART4
case UC_4:
return useUsart4();
break;
#endif
#ifdef USE_USART5
case UC_5:
return useUsart5();
break;
#endif
#ifdef USE_USART6
case UC_6:
return useUsart6();
break;
#endif
default:
return Null;
break;
}
}
int Usart::write(const void *data, unsigned length)
{
//TODO:
}
int Usart::read(void *data, unsigned length)
{
//TODO:
}
int Usart::send(const char *string)
{
unsigned length = strlen(string);
return write(string, length);
}
#ifdef USE_USART1
Usart& Usart::useUsart1()
{
static struct Static {
Usart usart;
Static(): usart(USART1) {
//TODO
}
} _S_;
return _S_.usart;
}
#endif
#ifdef USE_USART2
Usart& Usart::useUsart2()
{
static struct Static {
Usart usart;
Static(): usart(USART2) {
//TODO
}
} _S_;
return _S_.usart;
}
#endif
#ifdef USE_USART3
Usart& Usart::useUsart3()
{
static struct Static {
Usart usart;
Static(): usart(USART3) {
//TODO
}
} _S_;
return _S_.usart;
}
#endif
#ifdef USE_USART4
Usart& Usart::useUsart4()
{
static struct Static {
Usart usart;
Static(): usart(USART4) {
//TODO
}
} _S_;
return _S_.usart;
}
#endif
#ifdef USE_USART5
Usart& Usart::useUsart5()
{
static struct Static {
Usart usart;
Static(): usart(USART5) {
//TODO
}
} _S_;
return _S_.usart;
}
#endif
#ifdef USE_USART6
Usart& Usart::useUsart6()
{
static struct Static {
Usart usart;
Static(): usart(USART6) {
//TODO
}
} _S_;
return _S_.usart;
}
#endif
以下是测试代码:
int main()
{
usart[0]; //表示Usart::Null; 不可用
usart[1].send("helloworld");
return 0;
}
史海拾趣
|
摘 要: 介绍了红外遥控发射和接收的原理,提出了一种用PLD(可编程逻辑器件)进行解码的方案,并分别用EPROM和GAL实现。该方案思路新颖、原理简单、工作可靠,可用于各种以键盘扫描为输入方式的智能仪器系统中。 关键词 ...… 查看全部问答> |
|
这个demo是在一个项目中用于测试的例程。测试MCF52211的USB模块,实现了CDC协议,从而在PC上虚拟出一个串口。MCF52211集成了一个USB OTG的模块,它是freescale coldfire v2核心的一款MCU。相关介绍请参考http://www.freescale.com … 查看全部问答> |
|
为什么设计芯片时有的将芯片管脚使用1作为有效(及高电平有效),而有的却使用0为有效(及低电平有效)? 为什么设计芯片时有的将芯片管脚使用1作为有效(及高电平有效),而有的却使用0有效(及低电平有效)? 为什么不统一使用高电平有效或低电平有效?这样有什么好处? 是什么因素决定该管脚需采用高电平还是低电平有效的? /Jack… 查看全部问答> |
|
写了个USB转COM口的驱动,但是为何系统启动过程中装载完驱动就迅速卸载? 打印信息, USBToCOM::Process Attach USBToCOM::Process Detach sources文件 RELEASETYPE=PLATFORM TARGETNAME=ucom TARGETTYPE=DYNLINK DLLENTRY=DllEntry DEF ...… 查看全部问答> |
|
LED模组和灯具的典型失效模式包含了不同层次的失效模式,涉及到LED封装结构以及工艺过程(如表1)。LED在实际使用中,由于复杂的环境以及封装工艺局限性从而使封装材料退化、荧光粉退化、金属电迁移、局部温度过高产生的热应力所引起的芯片和硅胶 ...… 查看全部问答> |
|
> Loading file E:\\车机项目\\A5V5_MA\\A5V5_v1\\Debug\\a5v5.s19 in PROGRAM MEMORY area ... FILE : line 195: Address 0x1019 is out of range and is ignored! FILE : line 195: Address 0x101A is out of range and is i ...… 查看全部问答> |
|
我的2812怎么转换精度那么差,本来是3V的时候应该是4095的,但是我的片子转换出来是3953,并且2.75V的时候转换出来只有3652,与理想值几乎相差100。 这样是不是2812转换精度太差了?? 各位高手请指点一下小妹,谢谢啦… 查看全部问答> |
|
PADS2007如何使用PADS2005中的元件封装库本人从事PCBLAYOUT现在转做PCB业务,专业生产铝基板和FR4板,希望大家多多关照。QQ: 520122524Skype:xcq185388740msn: xcq185388740@live.cn邮箱:xcq185388740@163.com… 查看全部问答> |




