历史上的今天
返回首页

历史上的今天

今天是:2025年04月25日(星期五)

正在发生

2019年04月25日 | STM32Cube的串口配置与使用

2019-04-25 来源:eefocus

1、串口的配置

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


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


串口配置:

串口中断使能:

--------------------------------------------------------------------------------------------------------------------------------------------------------------------


2、查看串口内的函数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在过程开始时向设备发出“传送块数据”的命令,然后通过中断来得知过程是否结束和下次操作是否准备就绪。


--------------------------------------------------------------------------------------------------------------------------------------------------------------------


3、在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 */


--------------------------------------------------------------------------------------------------------------------------------------------------------------------


4、单独串口中断的使用

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 */

----------------------------------------------------------------------------------------------------------------

5、多个串口同时使用

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--------------------------------------------------------------------------

--------------------- 

推荐阅读

史海拾趣

Dynawave Incorporated公司的发展小趣事

Dynawave Incorporated的创始人李明,是一位在电子行业有着丰富经验的工程师。他深知随着科技的发展,无线通信技术将成为未来发展的重要方向。因此,李明带领一支技术团队,夜以继日地研发新型无线通信技术。经过数月的努力,他们成功开发出了一种具有高效能、低能耗特点的无线传输技术,这一技术为Dynawave在行业中赢得了初步声誉。

昆泰(CHRONTEL)公司的发展小趣事

1982年,Dennis Gillings博士在美国北卡罗莱纳州创立了Quintiles Transnational Inc.(昆泰)。成立之初,昆泰只是一家为药企提供数据服务的美国本土公司。凭借其独特的数据处理能力和对市场的敏锐洞察,昆泰迅速在行业内树立了良好的口碑。

高通(GENITOP)公司的发展小趣事

1964年,超霸电池的前身——金山工业集团在中国香港地区成立,最初专注于生产9伏干电池,以满足当时收音机等电子产品的需求。这一时期的超霸电池以其稳定的质量和可靠的性能迅速在市场上站稳脚跟。随着电子产品的普及,金山工业敏锐地捕捉到市场机遇,逐步扩大生产规模,为后续的发展奠定了坚实基础。

Hitron公司的发展小趣事

70年代,全球电子产品热潮兴起,金山工业决定进军这一领域。公司推出了碱性和氧化的银钮型电池,这些产品广泛应用于电子手表、计算机等小型电子设备中。这一战略转型不仅丰富了超霸电池的产品线,也进一步提升了其在电子行业的知名度。随着技术的不断积累,超霸电池逐渐在市场中占据了一席之地。

AD Semiconductor公司的发展小趣事

进入21世纪,超霸电池继续加大技术研发力度,推出了Recyko绿再系列高端绿色充电套装。这一系列产品不仅外观时尚、性能卓越,还实现了快速充电、低自放电等先进技术。其中,“十分充”产品更是将充电速度提升到了前所未有的高度,仅需10分钟即可将电池电量从0充至90%以上。Recyko绿再系列的成功推出,不仅为超霸电池赢得了更多用户的青睐,也推动了整个电池行业的技术进步。

Hammond公司的发展小趣事

70年代,全球电子产品热潮兴起,金山工业决定进军这一领域。公司推出了碱性和氧化的银钮型电池,这些产品广泛应用于电子手表、计算机等小型电子设备中。这一战略转型不仅丰富了超霸电池的产品线,也进一步提升了其在电子行业的知名度。随着技术的不断积累,超霸电池逐渐在市场中占据了一席之地。

问答坊 | AI 解惑

我郁闷的一年工作~

毕业于一所不出名的工科院校的电子信息工程专业,选择了一份和专业不靠谱的工作,浑浑噩噩的过了一年。公司做的是电动机,来公司之前,简单而又理所当然的认为差不多,等到了以后才发现自己的无知。这个时候,面临着诱惑,一个车间副主任的诱惑,我 ...…

查看全部问答>

与初学者谈电子制作

您一定玩过电子游戏机;使用过手电筒。如果让您亲手制作这些电子作品,您一定会感到很兴奋,很有趣。其实您只要花上几元钱,买几个电子元件,就可以通过自己的努力在几个小时内创造出自己的电子作品。通过一个小小电子产品的制作,不仅证明了您的智慧 ...…

查看全部问答>

如何学好rotel dxp2004

请教大家/我是一个刚开始学rotel dxp2004软件的。我应该从什么方面入手,学的过程应该注意些什么问题,大家有什么好的学习经验。对我们初学者指点下…

查看全部问答>

求助,关于含贴片元件的电路板制作

本帖最后由 paulhyde 于 2014-9-15 09:28 编辑 各位大侠,有没有人做过含贴片元件的印制电路板?是怎么打印到转印纸上的,怎么设置?我的pcb画在了toplayer上的  …

查看全部问答>

WinCE5.0的一个EDB应用程序Debug版可以运行Release版就是老出错

如题: WinCE5.0的一个EDB应用程序Debug版可以运行Release版就是老出错, 痛苦啊! 而且EDB容量还是比较小的,这是烦死了 …

查看全部问答>

急!!!怎么用platform builder生成lib文件!

手上已经有源码,请问怎么用PB5.0生成lib文件呢!!!很急!!!知道该怎么做的大哥大姐能不能把具体流程给我写一下!!!谢谢啦!!!…

查看全部问答>

一个关于DDS的问题

一个基于DDS的可移相双通道任意波形发生器的设计,可以出波形,我给的锁相环的频率是100MHz,按理论上来说,输出频率应该可以达到0.4*100MHz=40MHz,但是实际出的波形的频率却只有大概20MHz。我想请问各位大侠利用流水线设计的相位累加器可以提高输 ...…

查看全部问答>

无绳电话手机自动充电器电路图

本帖最后由 jameswangsynnex 于 2015-3-3 20:00 编辑 …

查看全部问答>

STM32F107的千片价格估计能够做到多少?

                                 在淘宝上看到的都不便宜哦…

查看全部问答>

关于F28335

请问F28335中的16路12bitAD是指可以同时对16路不同的模拟信号进行采样吗? [ 本贴由 xiancheng_2005 于 2008-5-11 02:53 PM 最后编辑 ]…

查看全部问答>