历史上的今天
返回首页

历史上的今天

今天是:2025年04月22日(星期二)

正在发生

2019年04月22日 | stm32之USART/UART应用实例

2019-04-22 来源:eefocus

硬件:STM32F103VCT6

开发工具:Keil uVision4

下载调试工具:ARM仿真器

USART与UARTD的区别: 

usart:全双工通用异步串行收发器 

uart:全双工通用同步/异步串行收发器 

usart支持同步通讯时比uart多一条时钟线,usart用于异步通讯时跟uart一样。


单工: 只能单向传输数据 

半双工:某一个时刻只能接受或者发送的双向传输数据 

全双工:**可以同时进行接收和发送数据


异步:发送方发送一帧数据后不需要接受方应答继续发送下一帧 

同步:发送方发送完一帧数据后需要等待接受方应答才能发下一帧


串行:每一传输按位进行,在一个导线上一位一位一次传输 

并行:每次传输按两位或者两位以上进行,通过几根导线同一时刻可以进行多位传输


波特率:一秒钟内传输多少位数据,单位:Bps(byte 字节每秒),发送设备与接收设备的波特率必须一致。


USART/UART是一种通用的标准接口,根据导线的电压等不同也分为很多的同类,比如: RS485, RS422,RS232


stm32的usart编程应用的步骤: 

1.串口设备的的初始化 

2.串口中断优先级的定义 

3.发送函数USART_SendData、接收函数USART_ReceiveData


第二步是为了当串口接收到数据的时候系统会从主程序中跳转到中断里面去,然后再进行数据的读取,当然如果少了这一步也是可以通讯的,方法就是在主函数中不断查询是否收到数据,如此会占用很多资源,所以在所用的芯片有中断的情况下最好使用中断。


void USART1_Config(unsigned int bound)

{

    GPIO_InitTypeDef GPIO_InitStructure;

    USART_InitTypeDef USART_InitStructure;


    /*使能端口时钟*/

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);


    /*USART1-TX输出脚配置*/

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;

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

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_Init(GPIOA, &GPIO_InitStructure);


    /*USART1-RX接收脚配置*/

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;

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

    GPIO_Init(GPIOA, &GPIO_InitStructure);


    /*串口参数配置*/

    USART_InitStructure.USART_BaudRate = bound;//设置波特率

    USART_InitStructure.USART_WordLength = USART_WordLength_8b;//一帧中传输或者接收的数据位数(8位/9位)

    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);


    /*使能接收终端*/

    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);

    /*配置好参数之后,使能USART1外设*/

    USART_Cmd(USART1, ENABLE); 

    /*USART1终端优先级的配置*/

}   

void NVIC_Configuration(void)

{

    NVIC_InitTypeDef NVIC_InitStructure; 

    /*设置优先级分组*/

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);


    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//指定IRQ通道   

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;//指定先占优先级

    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;//从优先级


    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //定义的IRQ是被使能还是失能

    NVIC_Init(&NVIC_InitStructure);

}


/*重定向c库函数printf到USART1,调用printf会将需要打印的数据从串口发送出去*/

int fputc(int ch, FILE *f)

{

    USART_SendData(USART1, (unsigned char) ch);

    while( USART_GetFlagStatus(USART1,USART_FLAG_TC)!= SET);     //等到USART1发送完成

    return (ch);

}


/*串口发送一个字符*/

void USART_SendChar(USART_TypeDef* pUSARTx, uint8_t c)

{

    USART_SendData(pUSARTx, c);

    while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET);

}

/

*串口发送一个字符串*/

void USART_SendString(USART_TypeDef* pUSARTx, char* str)

{

    uint32_t n = 0;


    while (*(str + n) != '')

    {

        USART_SendChar(pUSARTx, *(str + n));

        n++;

    }

    while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET);

}


int main(void)

{

    USART1_Config(9600);

    NVIC_Configuration();

    printf(“********************************”);

    printf(“hello ward!rn”);

    printf(“********************************”);

    While(1){} //阻止程序结束


}


还要在stm32f10x_it.c(中断函数一般都会放在这里)文件里面实现串口中断的处理函数:


void USART1_IRQHandler(void)

{

    unsigned char code;

    if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)

    {   

        code=USART_ReceiveData(USART1);

        printf("%c",code);    //将接受到的数据直接返回打印

    }

}


完成以上步骤,接好线就可以在电脑上使用串口调试助手进行调试,stm32会将所接收到的数据从串口再发送出去。 

重定向c库的printf函数还需要在项目设置里勾选: 

这里写图片描述

推荐阅读

史海拾趣

DOMINANT公司的发展小趣事

随着公司业务的不断发展,统明亮开始积极拓展全球市场。它通过与国内外知名企业的合作,不断提升自身的品牌影响力和市场竞争力。同时,统明亮还积极参加各类国际展会和交流活动,与全球各地的客户建立了紧密的合作关系。这些努力使得统明亮在全球LED市场中的份额不断扩大,其品牌影响力也得到了进一步提升。

请注意,由于篇幅限制,以上仅为三个简要故事。如果需要更多关于DOMINANT公司的发展故事,建议查阅相关报道和资料。

Component General Inc公司的发展小趣事

Component General Inc公司深知品质是企业的生命线。因此,公司建立了严格的质量管理体系,从原材料的采购到产品的生产、检测、包装等每一个环节都进行严格把控。这种对品质的执着追求,使得公司的产品赢得了客户的广泛信任和好评。

Data Translation Inc公司的发展小趣事

Data Translation Inc公司成立于1973年,初期专注于数据采集和处理技术的研发。在成立初期,公司就凭借对技术的深刻理解和敏锐的市场洞察力,成功开发了一系列具有创新性的数据采集和处理产品。这些产品不仅满足了当时工业界对高精度、高速度数据采集的需求,还引领了整个行业的发展方向。随着技术的不断进步和市场需求的不断变化,Data Translation不断推出新产品,逐渐确立了其在数据采集和处理领域的领先地位。

Alpha Semiconductor公司的发展小趣事

1994年,Alpha Semiconductor迎来了另一个重要的里程碑——公司成功研发出了自己的电源管理产品。这一产品的推出标志着Alpha Semiconductor在半导体技术领域的自主创新能力得到了显著提升。电源管理产品的成功研发不仅为公司带来了可观的收益,也进一步巩固了Alpha Semiconductor在半导体行业中的地位。

AXSEM公司的发展小趣事

Alpha Semiconductor公司于1983年创立,成立之初,公司主要从事代工服务业务。这一策略为Alpha Semiconductor在半导体行业打下了坚实的基础。通过为其他公司提供高质量的代工服务,Alpha Semiconductor逐渐积累了技术实力和行业经验,为后续的自主研发和产品创新奠定了坚实的基础。

E-San Electronic Co Ltd公司的发展小趣事

随着市场的不断变化和消费者需求的升级,E-San Electronic Co Ltd意识到技术创新是企业持续发展的关键。公司投入大量资金和资源,建立了自己的研发团队,并与多所高校和研究机构建立了合作关系。经过数年的努力,公司成功研发出了一系列具有自主知识产权的核心技术,这些技术不仅提升了产品的性能和质量,也为企业赢得了更多的市场份额。

问答坊 | AI 解惑

技术教程:面向汽车应用的线性调整器与开关调整器的比较

多年来,人们一直预测低压差线性调整器(LDO)要退出在汽车领域的应用。但是,LDO调整器持续生存着甚至茁壮成长,因为它们的价格便宜且使用方便。本文中,我将阐述LDO调整器的复杂性,考察市场上的最新进展(确实有一些进展),并分析随着汽车电源需求 ...…

查看全部问答>

DDS的资料和使用程序

DDS芯片AD9851的一些资料和一种做好的模块调试程序…

查看全部问答>

如何选用热继电器、?实际为电机额定电流多少

选用热继电器一般以电机额定电流为准.如电机额定电流为3A,而选择热继电器为1.5~3.5间.设定时以电机的负载为准.如负载比较稳定时,热继电器设定的电流为电机额定电流.如负载波动比较大时可稍微加大些. 如果是电机直接启动开关设备热继电器电流应选 ...…

查看全部问答>

请问rom和bootloader是什么关系?

我公司的开发板上既有rom又有bootloader,我搞不懂这两者的关系了 请各位帮忙解释下好吗?谢谢。…

查看全部问答>

问个WINCE调试的基本方法问题

我在PB5.0中调试单一的工程可以么?就是我不想每次都生成新的系统镜像。就像在VS2005中调试一样,修改代码、F5就开始编译链接、部署、断点,这样就方便多了阿,要不我不是在PB中每次都得从新生成系统镜像了?多麻烦…

查看全部问答>

急需人员加盟

本公司因业务需要,急需招聘WincE开发工程师,待遇从优。有意者请将简历发送至liuyh0105@126.com刘月红收。有IC卡、条形码行业工作经验者优先。电话:010-51265035、68219720、68219760…

查看全部问答>

STM8S103K使用I2C通信经常出错

103K作为从属, 另外一块CPU作为主控, 时钟频率大概200HZ 在103K这边经常会收到错误的地址 但使用逻辑分析仪看波形是正确的 可能是哪里出错了呢?…

查看全部问答>

关于触屏问题!

DK-LM3S9B96第一次搞触屏谁有关于触摸屏的详解! #include \"grlib/widget.h\"           #include \"grlib/canvas.h\"        #include \"grlib/pushbutton.h\" 这几个头文件是啥意思? ...…

查看全部问答>

镁海水燃料电池

由古河电池和日本东北大学合作开发的镁燃料电池实现商业化。 图为Green House公司LED手提灯(内有碳棒和镁金属棒组成镁燃料电池), 加入一次350ml水和16g盐即可提供8小时电力,点亮内置LED灯或通过USB接口为手机充电, 工作120小时后更换内部镁 ...…

查看全部问答>

运放构成的压控恒流源的问题

本帖最后由 paulhyde 于 2014-9-15 03:19 编辑 这是我用OP07构成的简单恒流源,第一个运放是隔离输入端对恒流源的影响,但是发现当负载端接上电阻,无论输入端电压 怎么调,J4端电压都没改变,而且负载电阻变化时,J4端电压变化,达不到恒流源 ...…

查看全部问答>