历史上的今天
返回首页

历史上的今天

今天是:2025年04月22日(星期二)

正在发生

2018年04月22日 | STM32CubeMX:UART操作

2018-04-22 来源:eefocus

UART共有三种操作方式,轮询方式、中断方式以及DMA方式。

芯片:STM32F103C8T6

应用管脚:

输出:PA0、PA1

USART1

配置界面


添加中断配置


添加DMA配置


代码应用

1.实现printf函数


  1. /* USER CODE BEGIN 0 */  

  2. #ifdef __GNUC__  

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

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

  5. #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)  

  6. #else  

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

  8. #endif /* __GNUC__ */  

  9. /* USER CODE END 0 */  


  1. /* USER CODE BEGIN 4 */  

  2. /** 

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

  4.   * @param  None 

  5.   * @retval None 

  6.   */  

  7. PUTCHAR_PROTOTYPE  

  8. {  

  9.   /* Place your implementation of fputc here */  

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

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

  12.   return ch;  

  13. }  

  14. /* USER CODE END 4 */  

2.轮询方式发送与接收

发送数据


  1. uint8_t senddata[20]="This use Transmit.\r\n";    

  2. if(HAL_UART_Transmit(&huart1,senddata,sizeof(senddata),0xFFFF) != HAL_OK)  

  3.   {  

  4.     /* Transfer error in reception process */  

  5.     Error_Handler();  

  6.   }  

轮询接收采用阻塞式超时接收模式


  1. uint8_t huart1_RxBuffer[20];  

  2. HAL_UART_Receive(&huart1, huart1_RxBuffer, 20,0x10);  

3.中断方式发送与接收


增加接收中断回调函数


  1. /* USER CODE BEGIN 4 */  

  2. /** 

  3.   * @brief  Rx Transfer completed callbacks. 

  4.   * @param  huart: Pointer to a UART_HandleTypeDef structure that contains 

  5.   *                the configuration information for the specified UART module. 

  6.   * @retval None 

  7.   */  

  8. void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)  

  9. {  

  10.     if(huart==&huart1)  

  11.     {  

  12.         Rx_flag=1;  

  13.         HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,(GPIO_PinState)!HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0));  

  14.           

  15. //      if(HAL_UART_Receive_IT(&huart1, (uint8_t *)huart1_RxBuffer, Rx_size) != HAL_OK)  

  16. //      {  

  17. //          /* Transfer error in reception process */  

  18. //          Error_Handler();  

  19. //      }  

  20.     }  

  21. }  

  22.   

  23. /* USER CODE END 4 */  

发送数据


  1. uint8_t senddata_IT[23]="This use Transmit IT.\r\n";      

  2. if(HAL_UART_Transmit_IT(&huart1,senddata_IT, sizeof(senddata_IT)) != HAL_OK)  

  3.     {  

  4.         /* Transfer error in reception process */  

  5.         Error_Handler();  

  6.     }  

接收数据,调用此函数后,接收中断可执行一次。


  1. uint8_t huart1_RxBuffer[20];   

  2. if(HAL_UART_Transmit_DMA(&huart1,senddata_DMA, sizeof(senddata_DMA))!= HAL_OK)  

  3.     {  

  4.         Error_Handler();  

  5.     }  


if(HAL_UART_Receive_IT(&huart1, (uint8_t *)huart1_RxBuffer, Rx_size) != HAL_OK) {/* Transfer error in reception process */ Error_Handler(); }



3.DMA方式发送与接收


增加接收中断回调函数(与中断方式相同)

发送数据


  1. uint8_t senddata_DMA[24]="This use Transmit DMA.\r\n";  

  2.     if(HAL_UART_Receive_DMA(&huart1, (uint8_t *)huart1_RxBuffer, Rx_size) != HAL_OK)  

  3.   {  

  4.     /* Transfer error in reception process */  

  5.     Error_Handler();  

  6.   }  


接收数据(特征与中断方式相同)


  1. if(HAL_UART_Receive_DMA(&huart1, (uint8_t *)huart1_RxBuffer, Rx_size) != HAL_OK)  

  2.  {  

  3.    /* Transfer error in reception process */  

  4.    Error_Handler();  

  5.  }  


推荐阅读

史海拾趣

General Cable公司的发展小趣事
在编码电路中,可能需要通过调整相关元件(如电阻、电容等)的参数来精确设置时钟频率,进而实现所需的载波频率。
Ememory Technology Inc公司的发展小趣事

eMemory自1989年成立以来,始终致力于半导体硅智财(IP)的研发与创新。公司凭借其独特的可编程非挥发性内存(NVM)技术,如NeoFuse和NeoPUF,迅速在半导体IP领域崭露头角。eMemory不仅将这些技术应用于自家的芯片产品中,还通过IP授权的方式,与全球众多芯片设计厂商建立了紧密的合作关系,推动了整个电子行业的发展。

华瓷(Chinocera)公司的发展小趣事

人才是企业发展的根本动力。华瓷深知这一点,因此在人才战略和团队建设上投入了大量精力。公司注重员工的培训和发展,为员工提供广阔的发展空间和良好的职业前景。同时,华瓷还积极引进国内外优秀人才,打造了一支高素质、专业化的团队。这支团队为公司的发展提供了有力的支持和保障。

Densitron公司的发展小趣事

在全球环保意识日益增强的背景下,Densitron公司积极响应环保号召,将绿色可持续发展作为公司的重要战略之一。公司投入大量资源研发环保型产品和技术,减少生产过程中的能源消耗和污染排放。同时,公司还积极参与环保公益活动,推动整个行业的绿色发展。这些努力不仅提升了公司的社会形象,也为公司的可持续发展奠定了坚实基础。

以上即为基于电子行业背景为Densitron公司虚构的5个发展故事。这些故事虽然并非基于真实事件,但反映了电子行业普遍关注的技术创新、市场拓展、行业变革、人才培养和绿色发展等关键要素。

EUPEC [eupec GmbH]公司的发展小趣事

1999年,EUPEC从西门子独立出来,形成了Infineon(英飞凌)公司。作为Infineon的全资子公司,EUPEC继续专注于电力半导体器件的研发和生产。在这个阶段,EUPEC不断推出创新产品,如IGBT模块、晶闸管、整流二极管等,凭借其卓越的品质和技术,赢得了客户的广泛认可。

Garmin_Canada_Inc.公司的发展小趣事
选用高质量的DTMF信号发生器芯片,如MT8888等,这些芯片具有稳定的性能和较高的精度。

问答坊 | AI 解惑

高压二极管的型号

我最近用到高压整流二极管,2000V以上,3A以上,谁能提供这样二极管的型号,并且市场上容易买到…

查看全部问答>

小车资料

自己收集的各类小车资料 第一次发帖 不太明白...…

查看全部问答>

芯片选型的求助

以前这两个功能都是用分立元件搭的,一个事是0---5V 的模拟信号,线性转化为0---3.3V的信号,一个事儿是12V,4k以内 的脉冲信号,转化为3.3v的脉冲信号,频率不变。(两种芯片4路或者8路都可以,实在没有,2路也行)        ...…

查看全部问答>

如何判断电脑是32位机还是64位机?

如何判断个人电脑是32位机还是64位机?…

查看全部问答>

wince 产生随机数的问题

#include\"windows.h\" #include srand( (unsigned)time( NULL ) ); cout=rand()%cout; 但是报错 gobanggame.obj : error LNK2019: unresolved external symbol _time referenced in function \"public: struct tagPOINT __thiscall gobangga ...…

查看全部问答>

GPRS模块(GTM900B)的开发问题

最近相当的崩溃阿,设计一点进展都没有,只好来求助各路达人了。 我要实现一个远程监控系统,终端与中心采用GPRS通信。目前我负责终端采集和通信部分。通信采用了华为的GPRS模块GTM900,自带TCP/IP协议的。我知道,只要用单片机串口写AT命令给模 ...…

查看全部问答>

如何得到忙音?

打一通电话给对方, 如果对方繁忙, 或者说网络繁忙, 如何让本机响起\"嘟~~~\"的忙音呢?…

查看全部问答>

问题 100分: eVC4.0 新建一个工程,不能选择CPU

问题: eVC新建一个工程,CPU类型列表全部是灰的,不能选。 环境: windows 2000 SP4 English 安装顺序: 1.activeSync 4.5 2.eVC4 (顺带安装了 Standard SDK for Windows CE.net) 3.eVC4 SP4 4.Windows Mobile SDK 2003 还有,打开eVC4.0 的 ...…

查看全部问答>

学习WINCE需要准备那些软件工具?

我现在想在ARM9上使用WINCE,目前只接触过ARM7,电脑上安装了EVC(PB和SDK都没安装),今天初步运行EVC提示:ARM4 CPUcannot to run,要求安装SDK,我应该安装那个SDK包?另外是不是一定要与ARM9开发板连接?…

查看全部问答>

急!用三端稳压管做的电源一接上负载电压就被拉低

如图左边是+15v和-15v的电压源,右边是其后接的的电阻桥。电阻桥后面就是测量电压变化的测量放大电路。我每块模块都是好的,就是将电阻桥和电压源电路连起来的时候,电压源的输出电压会降到2v~3v的样子。这是不是电流匹配的问题啊??请问各位,有 ...…

查看全部问答>