STM32CubeMX:UART操作

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

芯片:STM32F103C8T6

应用管脚:

输出:PA0、PA1

USART1

配置界面


添加中断配置


添加DMA配置


代码应用

1.实现printf函数

/* USER CODE BEGIN 0 */
#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__ */
/* USER CODE END 0 */


/* USER CODE BEGIN 4 */
/**
  * @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 USART1 and Loop until the end of transmission */
  HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
  return ch;
}
/* USER CODE END 4 */

2.轮询方式发送与接收

发送数据

</pre><pre name="code" class="cpp">uint8_t senddata[20]="This use Transmit.\r\n";  
if(HAL_UART_Transmit(&huart1,senddata,sizeof(senddata),0xFFFF) != HAL_OK)
  {
    /* Transfer error in reception process */
    Error_Handler();
  }

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

  uint8_t huart1_RxBuffer[20];
  HAL_UART_Receive(&huart1, huart1_RxBuffer, 20,0x10);
3.中断方式发送与接收

增加接收中断回调函数

/* USER CODE BEGIN 4 */
/**
  * @brief  Rx Transfer completed callbacks.
  * @param  huart: Pointer to a UART_HandleTypeDef structure that contains
  *                the configuration information for the specified UART module.
  * @retval None
  */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	if(huart==&huart1)
	{
		Rx_flag=1;
		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,(GPIO_PinState)!HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0));
		
//		if(HAL_UART_Receive_IT(&huart1, (uint8_t *)huart1_RxBuffer, Rx_size) != HAL_OK)
//		{
//			/* Transfer error in reception process */
//			Error_Handler();
//		}
	}
}

/* USER CODE END 4 */
发送数据

uint8_t senddata_IT[23]="This use Transmit IT.\r\n";	
if(HAL_UART_Transmit_IT(&huart1,senddata_IT, sizeof(senddata_IT)) != HAL_OK)
	{
		/* Transfer error in reception process */
		Error_Handler();
	}
接收数据,调用此函数后,接收中断可执行一次。

<pre name="code" class="cpp">uint8_t huart1_RxBuffer[20];	
if(HAL_UART_Transmit_DMA(&huart1,senddata_DMA, sizeof(senddata_DMA))!= HAL_OK)
	{
		Error_Handler();
	}

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


3.DMA方式发送与接收

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

发送数据

uint8_t senddata_DMA[24]="This use Transmit DMA.\r\n";
	if(HAL_UART_Receive_DMA(&huart1, (uint8_t *)huart1_RxBuffer, Rx_size) != HAL_OK)
  {
    /* Transfer error in reception process */
    Error_Handler();
  }

接收数据(特征与中断方式相同)
	if(HAL_UART_Receive_DMA(&huart1, (uint8_t *)huart1_RxBuffer, Rx_size) != HAL_OK)
  {
    /* Transfer error in reception process */
    Error_Handler();
  }
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值