历史上的今天
返回首页

历史上的今天

今天是:2024年10月23日(星期三)

正在发生

2019年10月23日 | STM32串口USART1程序

2019-10-23 来源:eefocus

原理图:

 头文件及完整例程下载:http://www.51hei.com/f/stm32标准例程库函数.rar
程序分析:
main.c

#include "stm32f10x.h"

#include "stm32f10x_usart.h"

#include "misc.h"

#include "stdarg.h"

 

/* Private variables ---------------------------------------------------------*/

USART_InitTypeDef USART_InitStructure;

uint8_t TxBuffer1[] = "USART Interrupt Example: This is USART1 DEMO";  

uint8_t RxBuffer1[],rec_f,tx_flag;

__IO uint8_t TxCounter1 = 0x00;

__IO uint8_t RxCounter1 = 0x00; 

 

uint32_t Rec_Len;

 

/* Private function prototypes -----------------------------------------------*/

void RCC_Configuration(void);

void GPIO_Configuration(void);

void NVIC_Configuration(void);

 

void Delay(__IO uint32_t nCount);

void USART_OUT(USART_TypeDef* USARTx, uint8_t *Data,...);

char *itoa(int value, char *string, int radix);

void USART_Config(USART_TypeDef* USARTx);

 

GPIO_InitTypeDef GPIO_InitStructure;

USART_InitTypeDef USART_InitStruct;

USART_ClockInitTypeDef USART_ClockInitStruct;

 

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

* 名    称:USART_Config(USART_TypeDef* USARTx)

* 功    能:配置串口

* 入口参数:

* 出口参数:无

* 说    明:

* 调用方法:例如: USART_Config(USART1)

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

void USART_Config(USART_TypeDef* USARTx){

  USART_DeInit(USART1);

  USART_InitStructure.USART_BaudRate = 9600;//速率115200bps

  USART_InitStructure.USART_WordLength = USART_WordLength_8b;//数据位8位

  USART_InitStructure.USART_StopBits = USART_StopBits_1;//停止位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;//收发模式

 

  /* Configure USART1 */

  USART_Init(USARTx, &USART_InitStructure);//配置串口参数函数

 

  /* Enable USART1 Receive and Transmit interrupts */

  USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);                    //使能接收中断

//  USART_ITConfig(USART1, USART_IT_TXE, ENABLE);//使能发送缓冲空中断   

USART_ClearFlag(USART1, USART_FLAG_TC );

  /* Enable the USART1 */

  USART_Cmd(USART1, ENABLE);

}

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

* 名    称:int main(void)

* 功    能:奋斗板主函数

* 入口参数:无

* 出口参数:无

* 说    明:

* 调用方法:无 

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

int main(void)

{

   uint8_t a=0;

  /* System Clocks Configuration */

  RCC_Configuration();  //系统时钟设置

       

  /*嵌套向量中断控制器配置了USART1的优先级分组为0,抢占优先级级别0(无) ,和响应优先级级别0(0-7) */ 

  NVIC_Configuration(); //中断源配置

 

  /*对控制LED指示灯的IO口进行了初始化,将端口配置为推挽上拉输出,口线速度为50Mhz。PA9,PA10端口复用为串口1的TX,RX。

  在配置某个口线时,首先应对它所在的端口的时钟进行使能。否则无法配置成功,由于用到了端口B, 因此要对这个端口的时钟

  进行使能,同时由于用到复用IO口功能用于配置串口。因此还要使能AFIO(复用功能IO)时钟。*/

  GPIO_Configuration(); //端口初始化

 

  USART_Config(USART1); //串口1初始化

  

  USART_OUT(USART1,"****(C) COPYRIGHT 2013 奋斗嵌入式开发工作室 *******rn");   //向串口1发送开机字符。

  USART_OUT(USART1,"*                                                 *rn");    

  USART_OUT(USART1,"*         奋斗版STM32开发板 USART1 实验           *rn");  

  USART_OUT(USART1,"*                                                 *rn");      

  USART_OUT(USART1,"*  以HEX模式输入一串数据,以16进制0d 0a作为结束   *rn");    

  USART_OUT(USART1,"*                                                 *rn");    

  USART_OUT(USART1,"*  奋斗STM32论坛:www.ourstm.net                  *rn");   

  USART_OUT(USART1,"*                                                 *rn");     

  USART_OUT(USART1,"***************************************************rn"); 

  USART_OUT(USART1,"rn"); 

  USART_OUT(USART1,"rn");    

   while (1)

  {

if(rec_f==1){//判断是否收到一帧有效数据

rec_f=0;

USART_OUT(USART1,"rn您发送的信息为: rn");    

USART_OUT(USART1,&TxBuffer1[0]);

if(a==0) {GPIO_SetBits(GPIOB, GPIO_Pin_5); a=1;}      //LED1  V6(V3V5板) V2(MINI板) 明暗闪烁                

else {GPIO_ResetBits(GPIOB, GPIO_Pin_5);a=0;  }

}

  }

}

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

* 名    称:void Delay(__IO uint32_t nCount)

* 功    能:延时函数

* 入口参数:无

* 出口参数:无

* 说    明:

* 调用方法:无 

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

void Delay(__IO uint32_t nCount)

{

  for(; nCount != 0; nCount--);

}

 

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

* 名    称:void USART_OUT(USART_TypeDef* USARTx, uint8_t *Data,...)

* 功    能:格式化串口输出函数

* 入口参数:USARTx:  指定串口

Data:   发送数组

...:     不定参数

* 出口参数:无

* 说    明:格式化串口输出函数

         "r"回车符   USART_OUT(USART1, "abcdefgr")   

"n"换行符   USART_OUT(USART1, "abcdefgrn")

"%s"字符串   USART_OUT(USART1, "字符串是:%s","abcdefg")

"%d"十进制   USART_OUT(USART1, "a=%d",10)

* 调用方法:无 

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

void USART_OUT(USART_TypeDef* USARTx, uint8_t *Data,...){ 

const char *s;

    int d;

    char buf[16];

    va_list ap;

    va_start(ap, Data);

 

while(*Data!=0){                //判断是否到达字符串结束符

if(*Data==0x5c){//''

switch (*++Data){

case 'r'://回车符

USART_SendData(USARTx, 0x0d);   

Data++;

break;

case 'n'://换行符

USART_SendData(USARTx, 0x0a);

Data++;

break;

default:

Data++;

     break;

}

else if(*Data=='%'){//

switch (*++Data){

case 's'://字符串

                 s = va_arg(ap, const char *);

                 for ( ; *s; s++) {

                     USART_SendData(USARTx,*s);

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

                 }

 Data++;

                 break;

case 'd'://十进制

                 d = va_arg(ap, int);

                 itoa(d, buf, 10);

                 for (s = buf; *s; s++) {

                     USART_SendData(USARTx,*s);

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

                 }

Data++;

                 break;

default:

Data++;

     break;

}

else 

USART_SendData(USARTx, *Data++);

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

}

}

 

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

整形数据转字符串函数

        char *itoa(int value, char *string, int radix)

radix=10 标示是10进制非十进制,转换结果为0;  

 

    例:d=-379;

执行itoa(d, buf, 10); 后

buf="-379"     

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

char *itoa(int value, char *string, int radix)

{

    int     i, d;

    int     flag = 0;

    char    *ptr = string;

 

    /* This implementation only works for decimal numbers. */

    if (radix != 10)

    {

        *ptr = 0;

        return string;

    }

 

    if (!value)

    {

        *ptr++ = 0x30;

        *ptr = 0;

        return string;

    }

 

    /* if this is a negative value insert the minus sign. */

    if (value < 0)

    {

        *ptr++ = '-';

 

        /* Make the value positive. */

        value *= -1;

    }

 

    for (i = 10000; i > 0; i /= 10)

    {

        d = value / i;

 

        if (d || flag)

        {

            *ptr++ = (char)(d + 0x30);

            value -= (d * i);

            flag = 1;

        }

    }

 

    /* Null terminate the string. */

    *ptr = 0;

 

    return string;

 

} /* NCL_Itoa */

 

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

* 名    称:void RCC_Configuration(void)

* 功    能:系统时钟配置为72MHZ, 外设时钟配置

* 入口参数:无

* 出口参数:无

* 说    明:

* 调用方法:无 

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

推荐阅读

史海拾趣

上海如韵(CONSONANCE)公司的发展小趣事

随着电子行业的快速发展,市场竞争日益激烈。为了应对这一挑战,如韵不断调整和优化产品线,加强与国际知名企业的合作,引进先进的技术和设备。同时,公司加大了对研发团队的投入,鼓励员工进行创新实践和技术交流。

在面对行业内的价格战和恶性竞争时,如韵始终坚持产品质量和客户满意度为首要原则。通过不断提升产品质量和服务水平,如韵赢得了客户的信任和口碑。即使在行业面临困境的时期,如韵也凭借着强大的技术实力和良好的市场口碑保持了稳健的发展态势。

General Transistor Corp公司的发展小趣事

随着全球化进程的加速推进,GTC将目光投向了更广阔的国际市场。公司积极在亚洲、欧洲等地区设立分支机构和生产基地,加强与全球客户的合作与交流。同时,GTC还注重可持续发展,致力于绿色生产和环保技术的研发与应用。公司通过采用环保材料、优化生产工艺等措施,降低了产品对环境的影响,实现了经济效益与社会效益的双赢。

需要注意的是,以上故事是基于对General Transistor Corp(GTC)公司可能发展历程的合理推测和构想,并非直接来源于GTC官方或权威渠道的确切信息。如需了解更多关于GTC公司的具体发展情况,建议直接访问其官方网站或查阅相关行业报告。

Dongguan Jingyue Electronics Co Ltd公司的发展小趣事

随着公司业务的不断扩大,Dongguan Jingyue Electronics Co Ltd面临着越来越复杂的供应链管理问题。为了降低成本、提高效率,公司决定对供应链进行优化。通过引入先进的供应链管理软件和系统,加强与供应商和物流公司的合作,公司成功实现了供应链的数字化和智能化管理,提高了整体运营效率。

Antenova公司的发展小趣事

Antenova公司积极寻求与其他行业领导者的战略合作,以推动公司的成长和发展。通过与全球知名的芯片制造商、设备生产商等建立合作关系,Antenova得以将其天线产品集成到更广泛的电子产品中,从而进一步扩大了市场份额。这些战略合作不仅提升了Antenova的品牌知名度,还为公司的长期发展提供了有力支持。

以上是关于Antenova公司发展起来的五个相关故事,这些故事展示了公司在技术创新、市场拓展、产品推出、专业服务以及战略合作等方面的努力和成就。这些成就为Antenova在电子行业中的成功奠定了坚实基础,并为公司未来的持续发展提供了有力保障。

General Instrument Optoelectronics公司的发展小趣事
发声电路中的元件(如三极管、蜂鸣器等)可能损坏,或者驱动电路设置不正确。
Glorious Sources Co Ltd公司的发展小趣事
由于光电传感器输出的电信号往往较弱,需要进行放大处理;同时,为了去除噪声和干扰,还需要设计合适的滤波电路。

问答坊 | AI 解惑

单片机的状态迁移与复位操作

作者:李学海 孙群中 李聪聪 来源:单片机与嵌入式系统应用 本文以经典的80C51单片机为例,利用工作状态及其状态迁移的新概念、新观点和新方法,揭示一些单片机运作的内在规律,对于单片机学习者和应用开发者具有一定的启迪作用和实际意义。 1 单片 ...…

查看全部问答>

许霆案的元凶是谁? 谜底破解

沸沸扬扬的“许霆取款案”终于结束,虽然法院的判决在网民中仍旧存在争议。但是尘埃落定后我们还在反思一个问题;这场官司中的一个重要物证——ATM机所起到的作用。           在许霆案后的一段时间里,也有多起国 ...…

查看全部问答>

摄像机的集中供电有什么缺点?咋么解决?

不同的摄像机采用集中供电时会发生什么问题?我发现有的摄像机画面暗淡。摄像机电源电路是怎样的结构???????????这样的问题怎么解决? 请高手指点.。。。…

查看全部问答>

创建wince SDK ListCtrl控件,不显示,怎么回事

这是我创建ListCtrl的代码,可是不显示 我在Dialog对话框中拖放了一个ListCtrl也不显示,Wince SDK 不支持ListCtrl吗?         HWND hWndListView;         RECT rcl;         I ...…

查看全部问答>

请教city_lovelace (四少爷)??????

请问如何实现在CE下用PPPOE拨号上网?? 我在PB下添加PPPOE特征后并不能拨号成功 更别说上网了! 请问你是怎么做的 谢谢! 我的联系方式: QQ:502240410 MSN:wangxin_801115@hotmail.com…

查看全部问答>

ADS 1.2安装后有问题

我近来安装了一个ADS1.2的破解版,可是点击 CodeWarror for ARM Develop Suite就会出现 The unexpected failure of a COM opertion suggests that MWComHelpers may be missing这个错误提示呢。 我的license已经按照安装方法来装的了,可是就 ...…

查看全部问答>

用CH341A转SPI模式

用CH341A转SPI模式,AT89S51可以正常下载程序,为什么AVR的无法下载?并且老是提示无法识别此类MCU.请高手指教!,AT89S51可以正常下载程序,为什么AVR的无法下载?并且老是提示无法识别此类MCU.请高手指教!…

查看全部问答>

关于STM32利用PWM和SPWM驱动步进电机的问题

本帖最后由 lizoyu 于 2016-3-27 22:36 编辑     最近在做毕业设计,其中涉及到了步进电机,本来用驱动器驱动得很顺利的,但是因为便携的需求改用了小得多驱动模块,tb买了用2个L9110的驱动模块,如下图. 电路图如下:     首 ...…

查看全部问答>

南京鼓楼地铁附近找硬件工程师

公司:深圳前海全民健康科技有限公司南京分公司 地点:南京市玄武区中山路338号1606室 网址:www.healthme100.com 智联:http://company.zhaopin.com/CC336120681.htm 产品:健康监测、智能穿戴 待遇:面谈(不低于南京地区业内平均水平) 联 ...…

查看全部问答>