历史上的今天
返回首页

历史上的今天

今天是:2024年12月29日(星期日)

2018年12月29日 | STM32l151低功耗芯片串口通信(HAL库)

2018-12-29 来源:eefocus

参考原子的stm32f系列的串口通信实验,移植到stm23l系列的程序代码。


1、采用串口中断方式,串口接收到消息产生中断,因此需要使能RXNE寄存器。HAL库函数的调用方式是__HAL_UART_ENABLE_IT(&UartHandle1, UART_IT_RXNE);


 UartHandle1是UART_HandleTypeDef类型,具体参考stm32lxx_hal_uart.h文件。


2、关于串口初始化,由于HAL库中的串口初始化函数HAL_UART_Init();会调用HAL_UART_MspInit();后者是一个关于串口1和串口2的I/O端口模式选择及初始化的函数。


 为了使程序能顺利进入中断,可在MspInit()函数或者HAL_UART_Init()函数中使能串口并在这里设置优先级,HAL_NVIC_SetPriority(USART1_IRQn,0,1);

HAL_NVIC_EnableIRQ(USART1_IRQn);


3、编写串口中断函数。采用一个unsigned char类型数组作为串口缓存,一个unsigned short int 作为串口接收缓存区的指针。


      需要注意的是发生了中断必须要清除中断标志,否则程序将一直处于该中断。但是从参考手册可以得知,在中断中对数据寄存器进行一次读操作,即可清除RXNE寄存器的标志位,所以,在中断里读取并且保存DR寄存器中的内容是一个很好的选择。


4、部分代码


1.串口初始化


bool InitSerial(uint32_t  BaudRate)

{

UartHandle1.Instance        = USART1;

  UartHandle1.Init.BaudRate   = BaudRate;

  UartHandle1.Init.WordLength = UART_WORDLENGTH_8B;

  UartHandle1.Init.StopBits   = UART_STOPBITS_1;

  UartHandle1.Init.Parity     = UART_PARITY_NONE;

  UartHandle1.Init.HwFlowCtl  = UART_HWCONTROL_NONE;

  UartHandle1.Init.Mode       = UART_MODE_TX_RX;

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


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

  if (HAL_UART_Init(&UartHandle1) != HAL_OK)

  {

    /* Initialization Error */

Print("USART1 Init failed.");

  }

__HAL_UART_ENABLE_IT(&UartHandle1, UART_IT_RXNE);

return true;

}

2. MspInit

void HAL_UART_MspInit(UART_HandleTypeDef *huart)

{

  GPIO_InitTypeDef  GPIO_InitStruct;

 

  /*##-1- Enable peripherals and GPIO Clocks #################################*/

  /* Enable GPIO TX/RX clock */

  __HAL_RCC_GPIOA_CLK_ENABLE();

  __HAL_RCC_GPIOA_CLK_ENABLE();

 

  /* Enable USARTx clock */

  __HAL_RCC_USART1_CLK_ENABLE();

__HAL_RCC_USART2_CLK_ENABLE();

 

  /*##-2- Configure peripheral GPIO ##########################################*/

  /* UART TX GPIO pin configuration  */

  GPIO_InitStruct.Pin       = GPIO_PIN_9;

  GPIO_InitStruct.Mode      = GPIO_MODE_AF_PP;

  GPIO_InitStruct.Pull      = GPIO_PULLUP;

  GPIO_InitStruct.Speed     = GPIO_SPEED_HIGH;

  GPIO_InitStruct.Alternate = GPIO_AF7_USART1;

 

  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

 

  /* UART RX GPIO pin configuration  */

  GPIO_InitStruct.Pin = GPIO_PIN_10;

  GPIO_InitStruct.Alternate = GPIO_AF7_USART1;

 

  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);


HAL_NVIC_SetPriority(USART1_IRQn,0,1);

HAL_NVIC_EnableIRQ(USART1_IRQn);



//UART2

GPIO_InitStruct.Pin = GPIO_PIN_2;

  GPIO_InitStruct.Alternate = GPIO_AF7_USART2;


HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);


GPIO_InitStruct.Pin = GPIO_PIN_3;

  GPIO_InitStruct.Alternate = GPIO_AF7_USART2;


HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

HAL_NVIC_SetPriority(USART2_IRQn,2,2);

HAL_NVIC_EnableIRQ(USART2_IRQn);

}


3.中断程序

void USART1_IRQHandler(void)

{

uint8_t Res;

if(__HAL_USART_GET_FLAG(&UartHandle1,USART_FLAG_RXNE)!=RESET) //´®¿Ú1½ÓÊÕµ½ÏûÏ¢

{

Res=(uint16_t)(USART1->DR & (uint16_t)0x01FF); //¶ÁÈ¡Êý¾Ý¼Ä´æÆ÷£¬´Ë²Ù×÷»áÇå³ýÖжϱê־λ

if((USART1_STA&0x8000)==0){ //½ÓÊÕ»¹Î´Íê³É

if(USART1_STA&0x4000){

if(Res!=0x0a)USART1_STA=0;

else USART1_STA|=0x8000;

}

else

{

if(Res==0x0d)USART1_STA|=0x4000;

else{

USART1_RX_BUF[USART1_STA&0x3FFF]=Res;

USART1_STA++;

if(USART1_STA>255)USART1_STA=0;

}

}

}

}

}

4.主函数测试代码

Print("USART1_Test: USART1_STA=%d\r\n",USART1_STA);

while(1)

{

if(USART1_STA&0x8000)

{

len=USART1_STA&0x3fff;

Print("Receive message from PC,Length is %d\r\n",len);

Print("USART1_RX_BUF is :\t");

HAL_UART_Transmit(&UartHandle1,USART1_RX_BUF,len,20);

Print("\r\n");

USART1_STA=0;

}

else

{

cnt++;

if(cnt==500){

Print("test!\r\n");

ToggleLed();

cnt=0;

}

}

HAL_Delay(10);

}



串口间通信方法(示例:串口1发送给串口2)

void USART1_TO_USART2(void)

{     

unsigned char len = 0;

    unsigned char i = 0;

len = USART1_STA;             

    if ((USART1_STA&0x8000) != 0 )

    {

HAL_Delay(10);

len = USART1_STA&0x3FFF;

USART1_RX_BUF[len] ='\n';    /* ¸ø×Ö·û½áβ²¹½áÊøÎ» */      

      USART1_RX_BUF[len+1] ='\n';    /* ¸ø×Ö·û½áβ²¹½áÊøÎ» */                

for ( i = 0; i <= len+1; i++ )

{

RX1_Buff[i] = USART1_RX_BUF[i];

      }

      USART1_STA = 0;      /* ÖØÖÃÖ¸Õë */

HAL_UART_Transmit(&UartHandle2,(uint8_t*)RX1_Buff,len+1,20);

#ifdef DEBUG

Print("Receive message from USART1:\r\n");

// Print("%s",RX1_Buff); //°Ñ·¢Ë͸øUSART2µÄÄÚÈÝÏÔʾ³öÀ´

#endif

}

}


推荐阅读

史海拾趣

Axiomtek公司的发展小趣事

由于Axiomtek公司的发展涉及众多方面,并且具体的内部故事和详细事实可能不为公众所知,因此我无法直接提供5个具体的故事。但我可以根据公开资料,概括性地描述Axiomtek公司在电子行业中的发展历程,以及可能促成其发展的几个关键因素。

Axiomtek,也称为艾讯科技,自1990年在台湾成立以来,凭借其创新的设计、高质量的品质保证和高客户满意度的服务态度,逐步发展成为世界工业计算机领域的领先设计者和制造商。以下是根据公开资料概括的Axiomtek公司发展的几个关键阶段和因素:

一、创业初期:创新与技术的奠基

在创业初期,Axiomtek由一群充满创新精神和干劲的资深工程师创立。他们凭借对计算机技术的深刻理解和对工业需求的敏锐洞察,开始研发并生产一系列具有创新性的工业计算机产品。这些产品不仅满足了当时市场的迫切需求,还以其卓越的性能和稳定性赢得了客户的广泛认可。

二、研发与制造能力的不断提升

随着市场的不断扩大和竞争的加剧,Axiomtek意识到只有不断提升研发与制造能力,才能在激烈的市场竞争中立于不败之地。因此,公司投入大量资源用于研发新技术和新产品,并建立了完善的制造体系,以确保产品的高质量和稳定性。同时,Axiomtek还积极与全球知名的供应商和合作伙伴建立战略合作关系,共同推动工业计算机领域的技术进步和产业发展。

三、全球化布局与市场拓展

为了进一步扩大市场份额和提高品牌影响力,Axiomtek开始实施全球化战略。公司在全球多个国家和地区设立了分支机构,并建立了完善的销售和服务网络。通过这些分支机构,Axiomtek能够更好地了解当地市场需求和客户需求,提供更加贴近市场的产品和服务。同时,公司还积极参加各种国际展览和交流活动,与全球客户建立更加紧密的合作关系。

四、持续创新与技术升级

在快速发展的电子行业中,技术创新是保持竞争力的关键。Axiomtek始终坚持以创新为核心的发展战略,不断投入研发资源,推动技术升级和产品创新。公司不仅关注现有产品的优化和改进,还积极探索新的应用领域和市场机会,开发具有前瞻性的新产品和解决方案。这些创新成果不仅增强了Axiomtek的市场竞争力,还为公司的持续发展奠定了坚实的基础。

五、品质管理与客户服务的持续优化

品质和客户满意度一直是Axiomtek非常重视的方面。公司建立了严格的质量管理体系,从原材料采购到产品生产、测试和交付等各个环节都进行严格把控,确保产品的高品质。同时,Axiomtek还注重提升客户服务水平,通过提供专业的技术支持和售后服务,赢得了客户的信任和好评。这种以客户为中心的经营理念不仅提升了公司的品牌形象,还为公司赢得了更多的商业机会。

这些只是根据公开资料概括的Axiomtek公司发展的几个关键方面,具体的故事和细节可能需要根据公司内部的资料和档案进行进一步的挖掘和整理。但无论如何,Axiomtek作为电子行业中的佼佼者,其发展历程无疑是一个充满创新、挑战和机遇的传奇故事。

CLAIREX公司的发展小趣事

随着市场的不断发展,Clairex意识到,要想在激烈的竞争中脱颖而出,必须不断创新。于是,公司加大了对研发的投入,积极探索新技术、新材料和新工艺。经过数年的努力,Clairex成功开发出了一系列具有自主知识产权的光电子组件。这些组件不仅性能优异,而且成本更低、更易于集成。它们的推出,不仅进一步巩固了Clairex在市场上的地位,也为公司带来了可观的利润。

天钰(FITIPOWER)公司的发展小趣事

随着市场的不断发展,Clairex意识到,要想在激烈的竞争中脱颖而出,必须不断创新。于是,公司加大了对研发的投入,积极探索新技术、新材料和新工艺。经过数年的努力,Clairex成功开发出了一系列具有自主知识产权的光电子组件。这些组件不仅性能优异,而且成本更低、更易于集成。它们的推出,不仅进一步巩固了Clairex在市场上的地位,也为公司带来了可观的利润。

Crameda Intersys公司的发展小趣事

作为一家有社会责任感的企业,Crameda Intersys公司不仅关注自身的经济效益,还积极履行社会责任。公司积极参与公益事业,支持教育、环保等领域的发展。同时,公司还注重环保和可持续发展,通过采用环保材料和节能技术,降低生产过程中的能耗和排放。这些举措不仅提升了公司的社会形象,也为社会的可持续发展做出了积极贡献。

这五个故事只是Crameda Intersys公司发展历程中的一部分,但它们足以展现出公司在电子行业中的成长轨迹和不懈追求。在未来的发展中,Crameda Intersys公司将继续以技术创新为引领,积极拓展市场渠道,培养更多优秀人才,加强质量管理和社会责任履行,为电子行业的发展贡献更多的力量。

CHONGQING PINGYANG ELECTRONICS CO.,LTD.公司的发展小趣事

在技术创新的基础上,重庆平洋电子有限公司积极拓展市场,不断提升品牌影响力。公司积极参与国内外各种电子展览和交流活动,与多家知名企业建立了战略合作关系。同时,公司还注重产品质量和售后服务,赢得了客户的信任和好评。随着品牌知名度的提升,公司的市场份额也逐年增长。

DOMINANT公司的发展小趣事

为了进一步提升市场竞争力,统明亮公司在2016年推出了一款新型直角DomiLED产品。这款LED产品具有高光照强度、低热阻等特点,广泛应用于测光照明领域。新型直角DomiLED的推出,不仅丰富了统明亮的产品线,也进一步巩固了其在LED市场的领先地位。这款产品的成功推出,也充分展示了统明亮公司在LED技术创新方面的实力。

问答坊 | AI 解惑

有没有纯数字的精确测量信号时间间隔的方法?

十个ns左右的误差范围啊,疯了都,目前我想到两个方法,一个是精确扩展计数时间,一个是多测几次,牺牲测量速度,不好弄…

查看全部问答>

HI-TECH C V9.70 和谐文件

HI-TECH C Compiler for PIC10-12-16 MCUs V9.70 已经测试过,破解成功! 1,先安装HI-TECH C Compiler for PIC10-12-16 MCUs V9.70  安装路径为默认路径 \"C 盘下\" 激活PICC 45天试用版! 2,破解,先写入注册文件,运行破解文件, ...…

查看全部问答>

DDRAW程序问题,在全屏方式下,用创建程序的方式打开一个程序后,程序的界面显示不出来,LCD上显示的还是DDRAW的画面

请问如何解决这个问题 // // Copyright (c) Microsoft Corporation.  All rights reserved. // // // Use of this source code is subject to the terms of the Microsoft end-user // license agreement (EULA) under which you l ...…

查看全部问答>

求助 :最近学习uc/os-ii 用的任哲写的《嵌入式实时操作系统uc/os-ii原理及应用》编译无法通过

最近学习uc/os-ii  用的任哲写的《嵌入式实时操作系统uc/os-ii原理及应用》,把他书中的源码在网上找到了。书中是用的BORLAND C++ 3.1编译的,我用borland c v3.1 dos 界面下直接建立工程文件编译,可是搞了很久编译都无法通过,而且试了 ...…

查看全部问答>

wince usb 驱动问题

我在看wince5.0 usb从驱动源代码具体位置是:/%wince500boot%/public/common/oak/usbfn 这个文件下有3个文件夹: 1.CLASS文件: RNDIS,SERIAL, STORAGE三个文件夹 2.CONTROLLER文件: MDD,NET2280 3.UFNCLIENLIB文件 请问这三个文件都有什 ...…

查看全部问答>

求助 AT89S51与C8051F单片机有什么区别啊?(急)

   各位前辈,我是一名学生菜鸟,要用单片机做采集器,遇到了这么一个问题,AT89S51与C8051F单片机有什么区别,请各位帮忙解决,谢谢!…

查看全部问答>

有木有CH4浓度传感器啊,急求资料,帮忙呀

最还好有单片机程序代码,电路图等等,越全越好.谢谢啊 …

查看全部问答>

4-20ma转换成0-5V

各位高手,本人摸电只是懂点基本的.想请教大家个问题.传感器输出的4-20ma如何转换成0-5V.我以前一直就是用250欧电阻将4-20ma转换成1-5V,再进行A/D转换,感觉这样处理没有0-5V方便.比如4-20ma表示0-50度的温度,0V的时候就表示温度是0度,5V的时候就表示 ...…

查看全部问答>

MSP430 LaunchPad学习笔记之uart

一、摘要本应用报告介绍了如何使用Timer_A实现UART功能。该包括例子是专门为MSP430x11x家庭,但他们能适应任何MSP430家族成员纳入Timer_A。使用硬件UART的功能在Timer_A功能和软件。执行是半双工的,事件驱动,它支持的8N1波特率协议从1200到115200 ...…

查看全部问答>

求一个G2452 SPI模式传输的例程

如题,望大家帮忙,谢谢!!…

查看全部问答>