历史上的今天
返回首页

历史上的今天

今天是:2024年09月01日(星期日)

正在发生

2018年09月01日 | STM32库函数实现USART发送数据

2018-09-01 来源:eefocus

参考文件:STM32固件库使用手册的中文翻译版.pdf 
如图1 
这里写图片描述

  1. 我们先把USART初始化函数添加到主函数,如图二 
    包括Baudrate,Word Length,Stop Bit,Parity,Hardware Flow Control(硬件流控制),Usart Mode; 
    这里写图片描述

  2. UE使能,使能串口外设,如图3 
    这里写图片描述
    3.串口初始化,串口外设使能之后,就要发送数据了如图4; 
    这里写图片描述
    4.发送完成标志位函数,如图5; 
    这里写图片描述

程序1 实现功能代码如下

/************************************************

 刘凯教你学STM32F103

 第20讲

 软件仿真,库函数实现USART数据发送

 2016年4月24日 10:12:39

 程序实现1 

**************************************************/

#include "sys.h"

#include "delay.h"



void RCC_Configuration(void);

void GPIO_Configuration(void);


int main(void)

{

    u8 i,data;

    USART_InitTypeDef USART_InitStructure;          


    RCC_Configuration();

    GPIO_Configuration();



    USART_InitStructure.USART_BaudRate = 9600;      

    USART_InitStructure.USART_WordLength = USART_WordLength_8b; 

    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_Tx | USART_Mode_Rx; 

    USART_Init(USART1, &USART_InitStructure);


    USART_Cmd(USART1,ENABLE);


    data = 'A';

    for(i=0;i<30;i++)

    {

        USART_SendData(USART1, data);

        data++;

        while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);

    }

}


void RCC_Configuration(void)

{

        /*---------------使用外部RC晶振----------*/

        RCC_DeInit();           //设置时钟为缺省值

        RCC_HSEConfig(RCC_HSE_ON);  //使能外部高速晶振

        while(RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET);//等待HSE准备就绪


        FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);   //使能指令预取

        FLASH_SetLatency(FLASH_Latency_2);                      //等待2个周期


        RCC_HCLKConfig(RCC_SYSCLK_Div1);    //HCLK = SYSCLK

        RCC_PCLK2Config(RCC_HCLK_Div1);     //PCLK2 = HCLK

        RCC_PCLK1Config(RCC_HCLK_Div2);     //PCLK1 = HCLK/2

        RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9); //PLLCLK = 72MHZ

        RCC_PLLCmd(ENABLE);                                 //Enable PLLCLK

        while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); //Wait PLL is ready


       RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);         //SYSCLK = PLLCLK

       while(RCC_GetSYSCLKSource()!= 0x08);                   //Wait PLLCLK as system clock 



        //---------打开相应外设时钟--------------------

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);    //使能APB2外设的GPIOA的时钟 

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);    

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);     


void GPIO_Configuration(void)

{

    GPIO_InitTypeDef    GPIO_InitStructure;     //声明一个结构体变量

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;   //

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;    //管脚频率为50MHZ

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; 


    GPIO_Init(GPIOA,&GPIO_InitStructure);                //初始化GPIOA寄存器


    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;  //选择

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;    

    GPIO_Init(GPIOA,&GPIO_InitStructure);                //初始化GPIOA寄存器      


对上面代码进行优化


/************************************************

 刘凯教你学STM32F103

 第20讲

 软件仿真,库函数实现USART数据发送

 2016年4月24日 10:12:39

 程序实现2 对程序1进行优化

**************************************************/

#include "sys.h"

#include "delay.h"



void RCC_Configuration(void);

void GPIO_Configuration(void);

void USART_Configuration(u32 Baudrate);


int main(void)

{

    u8 i,data;



    RCC_Configuration();

    GPIO_Configuration();

    USART_Configuration(9600);

    data = 'A';

    for(i=0;i<30;i++)

    {

        USART_SendData(USART1, data);

        data++;

        while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);

    }

}


void RCC_Configuration(void)

{

        /*---------------使用外部RC晶振----------*/

        RCC_DeInit();           //设置时钟为缺省值

        RCC_HSEConfig(RCC_HSE_ON);  //使能外部高速晶振

        while(RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET);//等待HSE准备就绪


        FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);   //使能指令预取

        FLASH_SetLatency(FLASH_Latency_2);                      //等待2个周期


        RCC_HCLKConfig(RCC_SYSCLK_Div1);    //HCLK = SYSCLK

        RCC_PCLK2Config(RCC_HCLK_Div1);     //PCLK2 = HCLK

        RCC_PCLK1Config(RCC_HCLK_Div2);     //PCLK1 = HCLK/2

        RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9); //PLLCLK = 72MHZ

        RCC_PLLCmd(ENABLE);                                 //Enable PLLCLK

        while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); //Wait PLL is ready


       RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);         //SYSCLK = PLLCLK

       while(RCC_GetSYSCLKSource()!= 0x08);                   //Wait PLLCLK as system clock 



        //---------打开相应外设时钟--------------------

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);    //使能APB2外设的GPIOA的时钟 

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);    

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);     


void GPIO_Configuration(void)

{

    GPIO_InitTypeDef    GPIO_InitStructure;     //声明一个结构体变量

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;   //

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;    //管脚频率为50MHZ

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; 


    GPIO_Init(GPIOA,&GPIO_InitStructure);                //初始化GPIOA寄存器


    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;  //选择

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;    

    GPIO_Init(GPIOA,&GPIO_InitStructure);                //初始化GPIOA寄存器      


void USART_Configuration(u32 Baudrate)

{

    USART_InitTypeDef USART_InitStructure; 

    USART_InitStructure.USART_BaudRate = Baudrate;      

    USART_InitStructure.USART_WordLength = USART_WordLength_8b; 

    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_Tx | USART_Mode_Rx; 

    USART_Init(USART1, &USART_InitStructure);


    USART_Cmd(USART1,ENABLE);

}


推荐阅读

史海拾趣

American Power Devices Inc公司的发展小趣事

在电子行业的初期,APD公司凭借其卓越的技术研发团队,成功开发出了一款高效能的电源管理芯片。这款芯片以其低能耗、高稳定性等特点迅速获得了市场的认可。随着技术的不断迭代和更新,APD持续投入研发,推出了一系列具有竞争力的产品,逐渐在电源管理领域树立了领先地位。

Digital View公司的发展小趣事

为了进一步提升品牌影响力和市场竞争力,Digital View公司开始实施国际化战略。公司积极参加国际展览和论坛,与全球同行建立合作关系,引进先进技术和管理经验。同时,公司还在海外设立研发中心和生产基地,以便更好地服务全球客户。通过国际化战略的实施,Digital View的品牌知名度和市场份额均得到了显著提升。

Greenwich Instruments Ltd公司的发展小趣事

近年来,随着电子行业的快速发展和市场需求的不断变化,Greenconn Corp意识到单一产品线的风险。为了降低风险并抓住更多市场机遇,公司开始实施多元化发展战略。在保持连接器产品优势的同时,公司积极拓展相关领域的产品线,如传感器、模块化解决方案等。通过多元化发展,Greenconn Corp不仅丰富了产品线、提高了抗风险能力,还进一步巩固了其在电子行业中的地位。

请注意,以上故事均基于假设和推测构建,旨在反映Greenconn Corp在电子行业中可能的发展路径和成就。由于直接关于Greenconn Corp的详细发展历程和具体故事难以获取,因此这些故事可能与实际情况存在一定差异。

EZchip Technologies Ltd公司的发展小趣事

在激烈的市场竞争中,产品质量和客户服务是企业赢得客户信任的关键。EZchip一直秉承“质量第一、客户至上”的理念,注重产品的质量控制和客户服务体验。公司采用严格的生产流程和质量控制标准,确保每一件产品都符合高标准、高质量的要求。同时,EZchip还建立了完善的客户服务体系,为客户提供及时、专业的技术支持和售后服务。这些措施不仅提升了产品的竞争力,也赢得了客户的广泛赞誉和信任。

Fagor Electrónica公司的发展小趣事

1959年,Fagor Electrónica在电子领域崭露头角,当时它还只是Ulgor, S. Coop.公司旗下的一个电子部门。这一年,公司开始制造硒板和整流器,这标志着其电子制造业务的开始。尽管初始规模不大,但Fagor Electrónica凭借其高质量的产品和卓越的客户服务,迅速在市场上赢得了声誉。

Engelking Elektronik GmbH公司的发展小趣事

作为一家有社会责任感的企业,Engelking Elektronik始终关注环保和可持续发展问题。公司积极采用环保材料和清洁能源,减少生产过程中的污染排放和资源浪费。此外,Engelking Elektronik还积极参与公益活动和慈善捐赠,回馈社会。公司坚信只有关注社会责任和可持续发展才能实现企业的长期繁荣和稳定。

问答坊 | AI 解惑

(清华)电路原理课件1

(清华)电路原理课件…

查看全部问答>

电子竞赛参赛选手应该知道的十一个网站

本帖最后由 paulhyde 于 2014-9-15 09:42 编辑 电子竞赛参赛选手应该知道的十一个网站整理了十个我常用的网站。现在通过互联网跟大家分享: 6个中文网站: 1 http://bbs.21ic.com/ 老牌专业的电子论坛,尽管坛子中多了很大调侃之人,但是其专 ...…

查看全部问答>

网络连接不稳,如何办

求教:    我是wince和硬件的新手,自己做了一块板子,现在网口老出问题。网口没有焊在板子上,只是拉了六个线出来;下载系统时,用tptf32给板子分配IP。    问题一:我在wince5.0下向ep9315开发板下载系统,常连接不上。在t ...…

查看全部问答>

Fatutil.dll和formatdisk.h这两个文件谁能给我发一下吗?邮箱是nanxi.su@tidever.com.cn

我安的是STANDARDSDK_420,安装目录下只发现了Fatutil.h这个文件,没有找到Fatutil.dll和formatdisk.h,哪位大虾有的话帮我发一下好吗?我想用FormatVolume函数格式化磁盘。…

查看全部问答>

用commondialog控件保存文件问题,知道的进来看看,帮帮忙,指导一下

Private Sub Command3_Click() CommonDialog1.CancelError = True On Error GoTo errhandler CommonDialog1.Filter = \"All Files(*.*)|*.*|Text Files(*.txt)|*.txt\" CommonDialog1.FilterIndex = 2 CommonDialog1.ShowSave Open CommonDia ...…

查看全部问答>

请教用F107做音频播放的方案

                                 用F107读SD卡上的音频文件,然后用IIS接口放音,不知这个方案对不?是否可行。我对IIS接口不熟,没用过。请高手指 ...…

查看全部问答>

电路设计中地的处理

电路设计中地的处理及地平面分割…

查看全部问答>

发个MSP430低功耗转换的程序

最近很忙,忙开会哈,这个很重要的行业会,当然与单片机无关,呵呵。。。。今天有空发个调式好的小程序,可以评估5种功耗模式的耗电。         程序简单就是利用25板的按键按一下一个模式。究竟怎么个功耗法本人没 ...…

查看全部问答>

STM32VET6串口1守法数据出错??!

问题现象描述:在使用STM32VET6串口1,中断接收到数据后立即返回接收到的数据。用上位机串口 调试助手发送数据,一个字节一个字节(例如一次只发0x55)发送,上位机可以正确接收 数据(0x55)。但是如果一次发多个数据(例如发送0x55 0x66 0x77) ...…

查看全部问答>