本次程序使用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版权协议,转载请附上原文出处链接和本声明。