历史上的今天
返回首页

历史上的今天

今天是:2024年08月26日(星期一)

正在发生

2019年08月26日 | 5、STM32Cube的串口配置与使用

2019-08-26 来源:eefocus

一、串口的配置

1)首先打开你的工程,在STM32Cube里面找到USART1,此时串口默认是Disanle的,我们要使能它,选择Asynchronous.


2)然后点击Configuration,就会有一个串口的配置图框,点进去配置串口,如果需要用到中断,选择NVIC进去进行相关配置。


串口配置:

串口中断使能:


点击NVIC选项,设置优先级和分组

二、查看串口内的函数API

Keil工程内选择{ }Functions,然后选择你需要查看的目标源文件,展开既是该源码内的函数


串口的发送接收函数:


HAL_UART_Transmit();//串口轮询模式发送,使用超时管理机制

 

HAL_UART_Receive();//串口轮询模式接收,使用超时管理机制

 

HAL_UART_Transmit_IT();//串口中断模式发送

 

HAL_UART_Receive_IT();//串口中断模式接收

 

HAL_UART_Transmit_DMA();//串口DMA模式发送

 

HAL_UART_Receive_DMA();//串口DMA模式接收

串口相关的中断函数:


HAL_UART_TxHalfCpltCallback()://一半数据(half transfer)发送完成后,通过中断处理函数调用。

 

HAL_UART_TxCpltCallback()://发送完成后,通过中断处理函数调用。

 

HAL_UART_RxHalfCpltCallback()://一半数据(half transfer)接收完成后,通过中断处理函数调用。

 

HAL_UART_RxCpltCallback():///接收完成后,通过中断处理函数调用。

 

HAL_UART_ErrorCallback():/传输过程中出现错误时,通过中断处理函数调用。

串口有三种通信模式:


第一种是轮询的模式。CPU不断查询IO设备,如设备有请求则加以处理。例如CPU不断查询串口是否传输完成,如传输超过则返回超时错误。轮询方式会占用CPU处理时间,效率较低。


第二种就是中断控制方式。当I/O操作完成时,输入输出设备控制器通过中断请求线向处理器发出中断信号,处理器收到中断信号之后,转到中断处理程序,对数据传送工作进行相应的处理。


第三种就是直接内存存取技术(DMA)方式。所谓直接传送,即在内存与IO设备间传送一个数据块的过程中,不需要CPU的任何中间干涉,只需要CPU在过程开始时向设备发出“传送块数据”的命令,然后通过中断来得知过程是否结束和下次操作是否准备就绪。


三、在main.c文件添加printf支持

/* USER CODE BEGIN 1 */

 

#ifdef __GNUC__

 

       /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf

     set to 'Yes') calls __io_putchar() */

 

#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)

 

#else

  #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)

 

#endif /* __GNUC__ */

 

/**

  * @brief  Retargets the C library printf function to the USART.

  * @param  None

  * @retval None

  */

PUTCHAR_PROTOTYPE

{

 /* Place your implementation of fputc here */

  /* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */

  HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);

  return ch;

}

 

/* USER CODE END 1 */


四、单独串口中断的使用

1)在main函数前面添加两个数组变量


uint8_t aTxStartMessage[] = "rn UART-communication based on IT rn";

 

uint8_t aRxBuffer[20];

/* USER CODE END PV */

2)在main函数中添加语句接收数据10个字符,保存在数组aRxBuffer中。


HAL_UART_Receive_IT(&huart1, (uint8_t *)aRxBuffer, 10);//串口接收中断使能,如果要循环使用就放到while(1)里面


3)在main.c文件添加中断接收完成回调函数。中断回调函数中将接收到的数据又通过串口发送回去。


/* USER CODE BEGIN 4 */

/**

  * @brief Rx Transfer completed callbacks

  * @param huart: uart handle

  * @retval None

  */

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)

{

  /* Prevent unused argument(s) compilation warning */

  UNUSED(huart); 

 

  /* NOTE : This function should not be modified, when the callback is needed,

            the HAL_UART_RxCpltCallback can be implemented in the user file

   */

    HAL_UART_Transmit(&huart1, (uint8_t *)aRxBuffer, 10,0xFFFF);//发送10个数据给串口1

    HAL_UART_Receive_IT(&huart1,aRxBuffer,10);      // 重新使能串口1接收中断  

}

 

/* USER CODE END 4 */

五、多个串口同时使用

1)定义串口1和串口3的接收数据变量

2)中断回调函数


void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)

{

 /* Prevent unused argument(s) compilation warning */

  UNUSED(huart);

 

  /* NOTE : This function should not be modified, when the callback is needed,

            the HAL_UART_RxCpltCallback can be implemented in the user file

   */

        if(huart->Instance ==  USART1)//串口1做调试

        {

           // HAL_UART_Transmit(&huart1, (uint8_t *)aRxBuffer1, 10,0xFFFF);

 

             RECV_FLAG1 = 1;

 

            HAL_UART_Receive_IT(&huart1,aRxBuffer1,10);  // 再次串口接收中断使能 

        }

 

        else if(huart->Instance ==  USART2)//串口2接蓝牙

        {

           HAL_UART_Transmit(&huart1, (uint8_t *)aRxBuffer2, 3,0xFFFF);

 

             RECV_FLAG2 = 1;

 

            HAL_UART_Receive_IT(&huart2,aRxBuffer2,3);  //再次串口接收中断使能  

        }   

}


3)主函数编写


Int mai(void)

{

     While(1)

    {

        if(RECV_FLAG2 == 1)

       {

          RECV_FLAG2= 0;

 

        Car_contrl(aRxBuffer2[0]);  //控制协议cmd[3]:cmd[0]=控制码  cmd[1]=0xD   cmd[2]= 0xA   

       }

 

    HAL_UART_Receive_IT(&huart1, (uint8_t *)aRxBuffer1, 10); //串口1接收中断使能

 

    HAL_UART_Receive_IT(&huart2, (uint8_t *)aRxBuffer2, 3); //串口3接收中断使能,所以大小为3:0D 0A 01

 

    }

 

}


--------------------------------------END-----------------------------------------------


推荐阅读

史海拾趣

问答坊 | AI 解惑

谁用过win7?那个声卡怎么弄啊?

本信息来自合作QQ群:电子工程师技术交流(12425841)   群主在坛子ID:Kata --------------------------------------------------------------------------------------------- 我换了好几个声卡驱动都不行,没有声音啊~…

查看全部问答>

请教:wifi通信程序

  我现在的开发板有一个WIFI模块,支持802.11b/g.OS为WINCE5.0,开发工具为VS2005,用C/C++语言。 我需要开发它与AP的通信程序,传一些音视频数据。请问该看些什么资料?怎么下手!非常感谢!感觉网上这方面资料好少!…

查看全部问答>

利尔达的430仿真器接线头做法

   弄了个利尔达的LSD-FET430 UIF 仿真器,14芯双排。现在想只接TEST、REST、GND,但这样接后我不清楚两排最中间两根针(是这两根吧,引脚定义也没找到。。。)之间应该个多大的电阻才合适,有知道的朋友么?很简单的问题,但没找到确切 ...…

查看全部问答>

出几块闲置开发板

铁电开发板 FR5739 原装 未拆封http://item.taobao.com/item.htm?id=14747986224 LM3S811 原装开发板 只是最小系统 未拆封http://item.taobao.com/item.htm?id=14754673183 LM8962 开发板 焊接过排针http://item.taobao.com/item.htm?id=14754673 ...…

查看全部问答>

STM32的程序是下载到哪里去的?

如题。如果说是下载到flash,那么在我买的开发板的例程中有读写片上128k flash的例子,那岂不是会修改了程序导致程序崩溃?多谢解答。…

查看全部问答>

12864

求一个fm12864串行读程序或者打点画圆程序…

查看全部问答>

WiFi介绍

德州仪器产品市场营销工程师,将为您概括介绍wifi技术,敬请收看。 $(\'swf_HCf\').innerHTML=AC_FL_RunContent(\'width\', \'550\', \'height\', \'400\', \'allowNetworking\', \'internal\', \'allowScriptAccess\', \'never\', \'src\', encod ...…

查看全部问答>

z-stack路由表

请问各位协议栈里关于路由表那部分代码是开放的吗,如何获得路由表的数据呢,十分感谢………

查看全部问答>

出飞思卡尔xs128核心板+bdm下载器+ov7620数字摄像头

电子版资料齐全,是DEMOK工作室的产品,性能稳定,全新。 xs128,¥80包邮,bdm,¥40包邮。 xs128+bdm,¥100包邮。 ov7620,¥80包邮。 全要,¥160包邮。 …

查看全部问答>

晒WEBENCH设计的过程+峰值电流可调电路设计

用WEBENCH设计一款峰值电流可调电路DC-DC电路,在电路设计过程中使用较为方便,可以调节输出的峰值电流大小, …

查看全部问答>