历史上的今天
返回首页

历史上的今天

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

正在发生

2018年09月10日 | STM32l151低功耗芯片串口通信

2018-09-10 来源: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

}

}


推荐阅读

史海拾趣

DFI公司的发展小趣事

DFI公司自创立之初,就致力于技术创新。在电子主板领域,DFI凭借其对高性能主板的深入研究,成功开发出多款领先行业的产品。例如,在2002年,DFI推出了LanParty UT nF4 SLI-DR Venus限量版主板,这款产品凭借其出色的性能和稳定性,迅速赢得了全球玩家的青睐。这一系列的创新举措不仅提升了DFI的品牌知名度,也为其在电子主板市场占据了重要地位。

BOWEI公司的发展小趣事

近年来,随着智能医疗和金融科技等新兴领域的兴起,DFI看到了新的发展机遇。公司开始将这些领域作为重点发展方向,投入大量资源进行研发和创新。通过与合作伙伴的紧密合作,DFI成功推出了一系列具有创新性的智能医疗和金融科技产品。这些产品不仅为客户提供了更便捷、更高效的服务体验,也为DFI带来了新的增长点。随着这些新兴领域的不断发展壮大,DFI有望在未来实现更大的突破和发展。

请注意,以上故事均为虚构,旨在展示DFI公司可能的发展历程和业务活动。实际情况可能有所不同,具体信息请参考DFI公司的官方资料。

FASTRAX公司的发展小趣事

随着公司业务的不断发展,FASTRAX开始积极拓展海外市场,并与多家国际知名企业建立了战略合作关系。通过与这些企业的合作,FASTRAX不仅获得了更多的市场份额,也学习到了先进的管理经验和技术知识。这些合作经验为FASTRAX的持续发展奠定了坚实的基础。

上海超致公司的发展小趣事

在电子产品行业,品质控制和质量保证是企业生存和发展的关键。上海超致始终将品质放在首位,建立了严格的质量管理体系,从原材料采购到生产制造、产品检测等各个环节都严格把控品质。公司还引进了先进的生产设备和检测仪器,确保产品的可靠性和稳定性。这种对品质的执着追求使得上海超致的产品在市场上获得了良好的口碑和广泛的认可。

申风(everanalog)公司的发展小趣事

随着技术实力的不断提升和产品线的日益丰富,申风(everanalog)公司开始积极拓展市场。公司凭借优质的产品和服务,逐渐在国内市场上树立了良好的品牌形象。同时,公司也积极开展国际合作,与国际知名企业建立了战略合作关系,共同推动集成电路产业的发展。这些合作不仅为公司带来了更多的商业机会,也提升了公司在国际市场上的竞争力。

G24 Innovations公司的发展小趣事

为了进一步拓展国际市场,远阳公司开始实施国际化布局战略。公司通过设立海外研发中心、生产基地等方式,加强与全球市场的联系和互动。同时,远阳还积极寻求并购整合机会,通过收购同行业优质企业,实现优势互补和资源共享。这些举措不仅增强了远阳的国际竞争力,也为企业的可持续发展注入了新的动力。

问答坊 | AI 解惑

嵌入式Linux系统CGI程序设计技术

1 概述 随着互联网应用的普及,越来越多的信息化产品需要接入互联网通过Web页面进行远程访问。嵌入式Web系统提供了一种经济、实用的互联网嵌入式接入方案。这里结合一种嵌入式Web Server BOA来介绍嵌入式Linux系统下的CGI程序设计技术。 2 Web Serv ...…

查看全部问答>

指纹自动识别系统中1:1与1:N的区别

应用系统利用指纹识别技术可以分为两类,即验证(Verification)和辨识(Identification)。验证就是通过把一个现场采集到的指纹与一个己经登记的指纹进行一对一的比对(one-to-one matching),来确认身份的过程。   作为验证的前提条件,他或她的 ...…

查看全部问答>

12864

16824的资料…

查看全部问答>

全国大学生电子设计竞赛更名了

本帖最后由 paulhyde 于 2014-9-15 09:38 编辑 全国大学生电子设计竞赛自2009年起正式冠名为NEC电子杯全国大学生电子设计竞赛 全国大学生电子设计竞赛,英文简称NUEDC,是由教育部高等教育司和工业信息化部人教司(前身为信息产业部人事司)共同 ...…

查看全部问答>

请问下面的这个电路图出自什么文章或者有无被申请专利啊?

请问下面的这个电路图出自什么文章或者有无被申请专利啊? …

查看全部问答>

串口通讯,接收端数据错误问题

板子采用串口通讯,板端设置如下: ioctl(com1Fd,FIOBAUDRATE,9600);                //设置波特率 ioctl(com1Fd,FIOFLUSH,0);                    &n ...…

查看全部问答>

我用ADS导入PADS9生成的GERBER文件B,NCDRILL导入数据格式老不对

来自:电子工程师技术交流(12425841) 我设置是2:4,ADS导入自动设为2:3,也不能修改,这个问题怎么解决? …

查看全部问答>

请问ST网站上下载的UM0424中KEIL的几个USB例程有试成功的没?

    我用的是KEIL FOR ARM MDK 3.11编译UM0434解开后里面的KEIL MDK里面的几个例程,直接双击项目文件打开的,想实验下USB功能,我用的板子是ST的那个评估板,先是用的虚拟串口那个项目,打开后 ...…

查看全部问答>

【M4开发板Hanker试用狂】ddllxxrr之四:触摸屏

触摸屏分为电阻电容的,现用最广的是电阻的,电容的反应迅速准确。比电阻的造价高。 开发板用的是电阻的。从网上找到几个原理图,觉得说得不错特发下:         这款开发板用的就是AD转换原理的触摸屏。用TI的图形 ...…

查看全部问答>

AD9286前端电路

现在用AD9286做采样,信号20MHz至100MHz,目前使用的是手册上推荐的RF变压器做前端信号处理。麻烦各位高人指点一下:是不是有更适合我用的前端电路,谢谢!…

查看全部问答>