历史上的今天
返回首页

历史上的今天

今天是: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;

}


推荐阅读

史海拾趣

迦美信芯(CanaanTek)公司的发展小趣事

在导航芯片领域,迦美信芯也取得了显著成就。由公司董事长兼CTO倪文海主导开发的兼容“GPS+北斗导航”的射频芯片,被国内主要基带厂商广泛采用,占据了北斗细分市场60%的份额。这一成就不仅彰显了迦美信芯在导航芯片领域的强大实力,也为其在物联网和汽车电子等领域的应用奠定了坚实基础。

Centellax Inc公司的发展小趣事

随着技术的成熟和市场的扩大,Centellax开始积极拓展国内外市场。公司通过与全球知名的通信设备制造商、电信运营商等建立合作关系,成功将产品打入国际市场。此外,Centellax还积极参与行业展会、研讨会等活动,提升品牌知名度和影响力。

在战略合作方面,Centellax注重与产业链上下游企业的协同发展。通过与供应商、客户等建立紧密的合作关系,实现资源共享和优势互补。这些合作不仅有助于提升公司的运营效率和市场竞争力,还为公司的长期发展提供了有力保障。

Dearborn Electronics Inc公司的发展小趣事

Dearborn Electronics Inc.注重国际合作与交流,与全球多家知名企业和研究机构建立了紧密的合作关系。通过引进国外先进的技术和管理经验,公司不断提升自身的核心竞争力。同时,公司也积极参与国际市场竞争,拓展海外市场,为未来的发展奠定了坚实的基础。

以上这些故事框架仅供参考,你可以根据这些框架进行深入的调查和研究,撰写出具体、详细的发展故事。

法思特(FAST)公司的发展小趣事
通过有序地控制电热水器的启动时间,可以避免同时启动多个电热水器造成的电网负载急剧增加。
ETC1公司的发展小趣事

万集科技是ETC行业中另一家知名的企业。公司专注于ETC设备的研发、生产和销售,以及ETC系统的集成与服务。在市场拓展方面,万集科技采取了多元化的策略,不仅与国内众多高速公路管理机构建立了合作关系,还积极开拓海外市场。通过不断的市场拓展和品牌建设,万集科技逐渐成为了ETC行业中的佼佼者。

Cofan Usa Inc公司的发展小趣事

随着产品线的不断丰富和技术实力的提升,Cofan Usa Inc公司开始积极拓展国内外市场。通过与各大电商平台和实体零售商建立合作关系,公司成功将产品推向更广泛的消费者群体。同时,公司注重品牌建设,通过精准的市场定位和有效的营销策略,逐渐树立了独特的品牌形象。

问答坊 | AI 解惑

PLD器件在红外遥控解码中的应用

摘 要: 介绍了红外遥控发射和接收的原理,提出了一种用PLD(可编程逻辑器件)进行解码的方案,并分别用EPROM和GAL实现。该方案思路新颖、原理简单、工作可靠,可用于各种以键盘扫描为输入方式的智能仪器系统中。       关键词 ...…

查看全部问答>

MCF52211 USB虚拟串口的例子

这个demo是在一个项目中用于测试的例程。测试MCF52211的USB模块,实现了CDC协议,从而在PC上虚拟出一个串口。MCF52211集成了一个USB OTG的模块,它是freescale coldfire v2核心的一款MCU。相关介绍请参考http://www.freescale.com …

查看全部问答>

代做毕业设计

代做电子类毕业设计,价格实惠,速度从优,服务至上,有兴趣联系QQ691423819…

查看全部问答>

为什么设计芯片时有的将芯片管脚使用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模组和灯具的典型失效模式包含了不同层次的失效模式,涉及到LED封装结构以及工艺过程(如表1)。LED在实际使用中,由于复杂的环境以及封装工艺局限性从而使封装材料退化、荧光粉退化、金属电迁移、局部温度过高产生的热应力所引起的芯片和硅胶 ...…

查看全部问答>

STM8编绎报这个是什么意思

> 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 ...…

查看全部问答>

各位高手帮我看看我2812AD

我的2812怎么转换精度那么差,本来是3V的时候应该是4095的,但是我的片子转换出来是3953,并且2.75V的时候转换出来只有3652,与理想值几乎相差100。 这样是不是2812转换精度太差了?? 各位高手请指点一下小妹,谢谢啦…

查看全部问答>

PADS2007如何使用PADS2005中的元件封装库

PADS2007如何使用PADS2005中的元件封装库本人从事PCBLAYOUT现在转做PCB业务,专业生产铝基板和FR4板,希望大家多多关照。QQ: 520122524Skype:xcq185388740msn: xcq185388740@live.cn邮箱:xcq185388740@163.com…

查看全部问答>