其他分享
首页 > 其他分享> > CubeMX创建usart启动文件[嵌入式学习]

CubeMX创建usart启动文件[嵌入式学习]

作者:互联网

 所使用板子:野火指南者

配置系统时钟、调试方式之后,对connect下的usart1进行asynchronous(异步)激活,记得激活NVIC。记住此时GPIO初始化无法将USART1_RX的Pin10的普通输入模式改为复用输入。要在后续生成的.c文件中修改(usart的RX、TX是对GPIO相应Pin口的复用)。

打开keil后,先从别的地方找到对应芯片初始化文件,并添加。

编译之后即可使用函数跳转

 进入usart.c的usart结构体初始化中添加串口中断使能语句,选择产生中断的事件。

huart1为串口外设的句柄。

  __HAL_UART_ENABLE_IT(&huart1,UART_IT_RXNE);

在usart.c末尾添加printf和scanf的重定向函数。

在首部添加c语言标准库函数stdio.h才可使用printf和scanf。

//重定向c库函数printf到串口DEBUG_USART,重定向后可使用printf函数
int fputc(int ch, FILE *f)
{
	/* 发送一个字节数据到串口DEBUG_USART */
	HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 1000);	
	
	return (ch);
}

//重定向c库函数scanf到串口DEBUG_USART,重定向后可使用scanf、getchar等函数
int fgetc(FILE *f)
{		
	int ch;
	HAL_UART_Receive(&huart1, (uint8_t *)&ch, 1, 1000);	
	return (ch);
}

因为是要将单片机与电脑上位机进行通信,所以要配置中断,将上位机发送的数据原封不动的送回去(中断服务函数名要在刚开始添加的startup_stm32f1xx.s文件中寻找)

void USART1_IRQHandler(void)
{
    uint8_t cu;

  if(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_RXNE)!=RESET)
  {
    cu = READ_REG(huart1.Instance->DR);
    WRITE_REG(huart1.Instance->DR,cu);  
  }  
}

其中所使用的READ_REG与WRITE_REG在stm32f1xx.h中存在,是分别是读取寄存器和向寄存器写入的功能。

到此时,主函数main.c中就可以使用printf函数进行字符输出给上位机

  printf("请输入下列字符控制LED\n");

 或者在串口调试助手的发送栏发送数据,串口接收后会在接收栏显示。

 可以使用如下两个函数实现printf相同的功能

  uint8_t a[]={"你好"};
  HAL_UART_Transmit(&huart1, (uint8_t *)&a, 4,  500);
/*****************  发送字符串 **********************/
void Usart_SendString(uint8_t *str)
{
	unsigned int k=0;
  do 
  {
      HAL_UART_Transmit(&huart1,(uint8_t *)(str + k) ,1,1000);
      k++;
  } while(*(str + k)!='\0');
  
}

HAL_UART_Transmit函数为usart.h头文件中的发送函数。     不那么好用...........

后期可以使用getchar获得电脑上位机发送的字符,用以控制片上外设运行,记得字符的辨别要使用  ‘ ’ ,eg:

if(a == '2')
{
    。。。。。。
}

一切只是刚刚开始......

标签:printf,HAL,usart,UART,huart1,uint8,嵌入式,CubeMX,串口
来源: https://blog.csdn.net/weixin_62762094/article/details/121872694