历史上的今天
返回首页

历史上的今天

今天是:2025年01月15日(星期三)

正在发生

2019年01月15日 | STM32Cube的串口配置与使用

2019-01-15 来源: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[] = "\r\n UART-communication based on IT \r\n";

 

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



推荐阅读

史海拾趣

Etron公司的发展小趣事

面对未来电子行业的发展趋势和挑战,钰创科技始终保持着清醒的认识和前瞻性的思考。公司将继续加大研发投入和人才培养力度,推动技术创新和产业升级;同时加强与国际知名企业的合作与交流,拓展国际市场;并积极响应国家政策和市场需求变化,不断调整和优化产品结构和市场布局;为实现公司的可持续发展和长远目标奠定坚实基础。

请注意,以上故事为虚构内容,旨在展示Etron公司(钰创科技)在电子行业中的发展历程和可能遇到的挑战与机遇。实际情况可能因各种因素而有所不同。

3D PLUS公司的发展小趣事

为了更好地满足客户需求,3D PLUS公司不仅提供硬件设备,还积极构建3D生态圈。公司推出了一系列3D个性化产品,包括3D全彩婚纱人像、3D梦幻水晶摆件等,这些产品独具潮流气息,深受市场欢迎。同时,公司还提供软件开发、定制开发等服务,帮助客户在移动端构建感性的3D商业场景,实现O2O移动营销的有效联动。这些举措不仅丰富了公司的产品线,也为客户提供了全方位的3D解决方案。

Chengdu Sino Microelectronics Technology Co Ltd公司的发展小趣事

在集成电路设计领域,技术的突破是赢得市场的关键。成都华微科技始终坚持以技术研发为核心,不断投入巨资进行技术研发和创新。经过多年的努力,公司在可编程逻辑器件、系统级芯片、存储器和模数/数模转换器(AD/DA)芯片等领域取得了重大突破,产品性能达到了国内领先水平。这些技术突破不仅为公司赢得了市场的认可,也提升了中国集成电路设计行业的国际地位。

Hantronix公司的发展小趣事

面对电子行业日益激烈的竞争环境,HANBIT Electronics深刻认识到供应链整合的重要性。2015年,公司启动了全面的供应链优化项目,通过引入先进的ERP系统和自动化生产设备,实现了生产流程的数字化和智能化改造。同时,公司加强与上下游合作伙伴的沟通与协作,建立了稳定的供应链体系。这一举措不仅提高了生产效率和产品质量,还有效降低了库存成本和运营风险。

格瑞宝(GP)公司的发展小趣事

在发展过程中,格瑞宝始终秉持开放合作的理念,积极寻求与行业内外的合作伙伴建立长期稳定的合作关系。例如,公司与唯样商城等元器件线上平台达成战略合作,成为其代理商之一。这一合作不仅进一步扩充了格瑞宝的产品线,也为广大客户提供了更多的产品选择和服务支持。通过合作与共赢的模式,格瑞宝不断拓宽业务边界,提升市场竞争力,实现了更快速的发展。

Fischer Connectors公司的发展小趣事

为了更好地服务客户和市场,格瑞宝在深圳、南京等地设立了分公司等派出机构。这些分公司的设立不仅加强了公司在华南、华东等地区的业务覆盖能力,也提高了公司的市场响应速度和客户服务水平。通过区域布局的优化,格瑞宝能够更加灵活地应对市场变化,抓住发展机遇,实现更快速的发展。

问答坊 | AI 解惑

详解Linux电源管理

1.概述   虽然Linux可以在任何一台386以上的PC上运行,目前大多数人使用的都是新型的,带有各种外设的桌面PC或者笔记本电脑,这样,电源管理功能(PM)就逐渐变得越来越重要。在笔记本电脑上电源管理可以节能,延长电池寿命,而在桌面PC上它 ...…

查看全部问答>

ARM基础实验教材 适合初学者 word版 经排版可打印

整理了一天,打印时记得用双面A4,因为是按照双面排版的!     下载了记得顶一下,本人刚注册的号,积分不多,帮忙挣点积分了好下载资料,在此谢过了!!      (本教材中有少部分图片不是很清楚,不过不影响大局 ...…

查看全部问答>

音调调节电路

请求各位朋友帮组。希望能给小弟我讲解一下这个电路。谢谢!!…

查看全部问答>

STM32-uCOS-II_UAV

STM32-uCOS-II_UAV very useful, my favoriti.…

查看全部问答>

WINCE,以完成输入,现需关联词库输入英文和中文,求高手指点,有词库

按键全部完成,现在有词库,求算法能完成词典或输入法的功能。…

查看全部问答>

嵌入式培训咨询

我收到一份站内信,自己对嵌入式不了解,所以来请教各位版友~ 信内容: 你好! 看见你在计算机系的发帖想必是很了解计算机知识的,所以很冒昧地写信,想向你请教一 下嵌入式的问题。 我是南大的一名毕业生,现在一所大学工作,最近有个培训机 ...…

查看全部问答>

pos端疑问(请有实际开发经验的同仁帮忙解答) (有分连接)

本人目前所在项目是做一个pos对端服务系统,通过socket负责解析pos传送过来的封包数据。现在pos那端提出他们不支持断点续传功能,也就是假设时间段内发送1000个数据包,有任意一条出错就必须从头再传,基于程序设计逻辑考虑这样肯定是不合适的。pos ...…

查看全部问答>

要用C#开发WINDOWS CE的应用程序,学习的资料谁能给点啊?

用VS2005开发WINDOWS CE的资料好少啊,尤其是中文的,谁能给点啊? 原来一直开发桌面程序的,现在单位需要,要开发WINDOWS CE下的应用程序。 谁能给点学习资料啊?最好是中文的。…

查看全部问答>

CE程序的移值

请教高手,以前的CE项目要移植到PC中,要求尽可能写的修改代码,尽可能的保存原来的界面,最后可生成独立的执行程序(不依赖于仿真器),谢谢!…

查看全部问答>

安富利ARM系统设计策略研讨会图文报道

     阿牛哥6月28日去北京国际会议中心参加安富利ARM系统设计策略研讨会。 这是安富利ARM系统设计策略研讨会在亚洲第一站,这个研讨会将持续三个月时间,在大陆8个城市举办,后续还会在台湾,新加坡 ,韩国 ,印度等举行,真是 ...…

查看全部问答>