USART、485、DMA深度解析

本次程序使用STM32CubeMX软件生成

实验一:阻塞式发送数据 “test”

int main(void)
{
  uint8_t temp[]="test";//要发送的数据
  HAL_Init();//硬件初始化
  SystemClock_Config();//时钟初始化
  MX_GPIO_Init();//GPIO端口初始化
  MX_USART1_UART_Init();//串口初始化
  while (1)
  {
  HAL_Delay(200);//延时200ms
  HAL_UART_Transmit(&huart1,temp,5,50);//参数:句柄结构体的地址,要发送的数据,长度,发送的时间
  }
  }

实验二:重定向,直接printf打印

1、#include <stdio.h>添加库
2、添加重定向函数
3、直接printf打印

/*重定向函数
函数功能: 重定向c库函数printf到USARTx
*/
int fputc(int ch, FILE *f)
{
	HAL_UART_Transmit(&huart1,(uint8_t *)&ch,1,0xFFFF);
	return ch;
}
/**
  * 函数功能: 重定向c库函数getchar,scanf到DEBUG_USARTx
  * */
int fgetc(FILE * f)
{
  uint8_t ch = 0;
  HAL_UART_Receive(&huart1,&ch, 1, 0xffff);
  return ch;
}

实验三:串口接收中断
uint8_t rxbuf;
在main函数值开启中断
HAL_UART_Receive_IT(&huart1,&rxbuf,1);
下面是接收到中断的回调函数,

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *UartHandle)
{
	if(UartHandle->Instance==USART1)//判断是哪个串口
	{
	HAL_UART_Transmit(&huart1,&rxbuf,1,0); //发送接收到的数据    
    HAL_UART_Receive_IT(&huart1,&rxbuf,1); //再次开启接收中断
	}
}

实验四:DMA发送
printf是一个字节一个字节的发送,效率低,使用DMA直接从内存到串口,大大的提高效率
改了之前接收中断,回调函数里的内容,接收到数据就发送100个Y
#define SENDBUFF_SIZE 100
uint8_t rxbuf;
uint8_t aTxBuffer[SENDBUFF_SIZE];

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *UartHandle)
{
	uint16_t i;
	if(UartHandle->Instance==USART1)
	{
		 for(i=0;i<SENDBUFF_SIZE;i++)
  {
    aTxBuffer[i]	 = 'Y';
  }
	HAL_UART_Transmit_DMA(&huart1,aTxBuffer, SENDBUFF_SIZE);     
    HAL_UART_Receive_IT(&huart1,&rxbuf,1);//重新开启接收中断
	}
}

重定义DMA发送函数,类似重定向

void print_usart1(const char *format, ...)
{
	static char buf[128];
	va_list ap;
	va_start(ap,format);
	while(HAL_UART_GetState(&huart1)==HAL_UART_STATE_BUSY_TX){}
		if(vsprintf(buf,format,ap)>0)
		{
			HAL_UART_Transmit_DMA(&huart1,(uint8_t *)buf,strlen(buf));
		}
}

.


版权声明:本文为weixin_44922452原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。