【STM32代码移植问题2:串口(printf、发送与接收)】

以hal为例,从stm32f103rct6移植带stm32f030。
参考https://blog.csdn.net/as480133937/article/details/99073783?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522167869666116782428613076%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=167869666116782428613076&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_ecpm_v1~rank_v31_ecpm-1-99073783-null-null.142v73insert_down2,201v4add_ask,239v2insert_chatgpt&utm_term=HAL_UART_Transmit%E5%90%8E%E6%97%A0%E6%B3%95printf&spm=1018.2226.3001.4187

注意

首先要注意UART结构体定义,即uart串口的别名,这个结构体中存放了UART所有用到的功能。
串口1默认为huart1,但是,stm32f103rct6中的例程为UART1_Handler(本人踩的一个坑,注意统一)

.c文件中

UART_HandleTypeDef UART1_Handler; //UART句柄

.h文件中

extern UART_HandleTypeDef UART1_Handler; 	//声明串口

重新定义printf函数

在 .c 中重写fput函数,例如main.c

int fputc(int ch, FILE *f)
{
  HAL_UART_Transmit(&UART1_Handler, (uint8_t *)&ch, 1, 0xffff);
  return ch;
}

发送与接收

1

在io初始化的时候,开启中断(HAL_NVIC_EnableIRQ、HAL_NVIC_SetPriority)
stm32f0xx_hal_msp.c

/**
* @brief UART MSP Initialization
* This function configures the hardware resources used in this example
* @param huart: UART handle pointer
* @retval None
*/
void HAL_UART_MspInit(UART_HandleTypeDef* huart)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0};
  if(huart->Instance==USART1)
  {
  /* USER CODE BEGIN USART1_MspInit 0 */

  /* USER CODE END USART1_MspInit 0 */
    /* Peripheral clock enable */
    __HAL_RCC_USART1_CLK_ENABLE();
  
    __HAL_RCC_GPIOA_CLK_ENABLE();
    /**USART1 GPIO Configuration    
    PA2     ------> USART1_TX
    PA3     ------> USART1_RX 
    */
    GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_3;//|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_15
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    GPIO_InitStruct.Alternate = GPIO_AF1_USART1;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  /* USER CODE BEGIN USART1_MspInit 1 */
	HAL_NVIC_EnableIRQ(USART1_IRQn);		//ʹÄÜUSART1ÖжÏͨµÀ
	HAL_NVIC_SetPriority(USART1_IRQn,0,0);			
  /* USER CODE END USART1_MspInit 1 */
  }

}

2

串口初始化,并设置中断函数、中断回调函数,并注意在开头函数申明(不过本人中断函数、中断回调函数未申明,好像无影响,只申明了MX_USART1_UART_Init)
static void MX_USART1_UART_Init(void);

main.h

#define USART_REC_LEN  			200  		//¶¨Òå×î´ó½ÓÊÕ×Ö½ÚÊý 200 
#define EN_USART1_RX 			1			//ʹÄÜ£¨1£©/½ûÖ¹£¨0£©´®¿Ú1½ÓÊÕ  enable
#define RXBUFFERSIZE   256 					//»º´æ´óС   buff
#define u8  unsigned char
#define u16 unsigned short int 
#define u32 long int

extern u8  USART_RX_BUF[USART_REC_LEN]; 	//½ÓÊÕ»º³å,×î´óUSART_REC_LEN¸ö×Ö½Ú.Ä©×Ö½ÚΪ»»Ðзû 
extern u16 USART_RX_STA;         			//½ÓÊÕ״̬±ê¼Ç	
extern UART_HandleTypeDef UART1_Handler; 	//UART¾ä±ú

main.c



/**
  * @brief USART1 Initialization Function
  * @param None
  * @retval None
  */


// .h add #define  

//´®¿Ú1ÖжϷþÎñ³ÌÐò
//×¢Òâ,¶ÁÈ¡USARTx->SRÄܱÜÃâĪÃûÆäÃîµÄ´íÎó   	
u8 USART_RX_BUF[USART_REC_LEN];     //½ÓÊÕ»º³å,×î´óUSART_REC_LEN¸ö×Ö½Ú.
//½ÓÊÕ״̬
//bit15£¬	½ÓÊÕÍê³É±êÖ¾
//bit14£¬	½ÓÊÕµ½0x0d
//bit13~0£¬	½ÓÊÕµ½µÄÓÐЧ×Ö½ÚÊýÄ¿
u16 USART_RX_STA=0;       //½ÓÊÕ״̬±ê¼Ç	  
u8 aRxBuffer[RXBUFFERSIZE];//HAL¿âʹÓõĴ®¿Ú½ÓÊÕ»º³å
UART_HandleTypeDef UART1_Handler; //UART¾ä±ú



static void MX_USART1_UART_Init(void)
{

		//UART ³õʼ»¯ÉèÖÃ
	UART1_Handler.Instance=USART1;					    //USART1
	UART1_Handler.Init.BaudRate=9600;				    //²¨ÌØÂÊ
	UART1_Handler.Init.WordLength=UART_WORDLENGTH_8B;   //×Ö³¤Îª8λÊý¾Ý¸ñʽ
	UART1_Handler.Init.StopBits=UART_STOPBITS_1;	    //Ò»¸öֹͣλ
	UART1_Handler.Init.Parity=UART_PARITY_NONE;		    //ÎÞÆæżУÑéλ
	UART1_Handler.Init.HwFlowCtl=UART_HWCONTROL_NONE;   //ÎÞÓ²¼þÁ÷¿Ø
	UART1_Handler.Init.Mode=UART_MODE_TX_RX;		    //ÊÕ·¢Ä£Ê½
	HAL_UART_Init(&UART1_Handler);					    //HAL_UART_Init()»áʹÄÜUART1
  /* USER CODE BEGIN USART1_Init 2 */
	HAL_UART_Receive_IT(&UART1_Handler, (u8 *)aRxBuffer, RXBUFFERSIZE);//¸Ãº¯Êý»á¿ªÆô½ÓÊÕÖжϣº±ê־λUART_IT_RXNE£¬²¢ÇÒÉèÖýÓÊÕ»º³åÒÔ¼°½ÓÊÕ»º³å½ÓÊÕ×î´óÊý¾ÝÁ¿
	
  /* USER CODE END USART1_Init 2 */

}

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	if(huart->Instance==USART1)//Èç¹ûÊÇ´®¿Ú1
	{
		if((USART_RX_STA&0x8000)==0)//½ÓÊÕδÍê³É
		{
			if(USART_RX_STA&0x4000)//½ÓÊÕµ½ÁË0x0d
			{
				if(aRxBuffer[0]!=0x0a)USART_RX_STA=0;//½ÓÊÕ´íÎó,ÖØпªÊ¼
				else USART_RX_STA|=0x8000;	//½ÓÊÕÍê³ÉÁË 
			}
			else //»¹Ã»ÊÕµ½0X0D
			{	
				if(aRxBuffer[0]==0x0d)USART_RX_STA|=0x4000;
				else
				{
					USART_RX_BUF[USART_RX_STA&0X3FFF]=aRxBuffer[0] ;
					USART_RX_STA++;
					if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//½ÓÊÕÊý¾Ý´íÎó,ÖØпªÊ¼½ÓÊÕ	  
				}		 
			}
		}

	}
}
 
//´®¿Ú1ÖжϷþÎñ³ÌÐò
void USART1_IRQHandler(void)                	
{ 
	u32 timeout=0;
	
	HAL_UART_IRQHandler(&UART1_Handler);	//µ÷ÓÃHAL¿âÖжϴ¦Àí¹«Óú¯Êý
	
	timeout=0;

    while (HAL_UART_GetState(&UART1_Handler) != HAL_UART_STATE_READY)//µÈ´ý¾ÍÐ÷
	{
	 timeout++;³¬Ê±´¦Àí
     if(timeout>HAL_MAX_DELAY) break;		
	
	}
     
	timeout=0;
	while(HAL_UART_Receive_IT(&UART1_Handler, (u8 *)aRxBuffer, RXBUFFERSIZE) != HAL_OK)//Ò»´Î´¦ÀíÍê³ÉÖ®ºó£¬ÖØпªÆôÖжϲ¢ÉèÖÃRxXferCountΪ1
	{
	 timeout++; //³¬Ê±´¦Àí
	 if(timeout>HAL_MAX_DELAY) break;	
	}
} 

3

最后,在sensor.c中使用

		unsigned char len;
		unsigned short int  times=0;
		unsigned char USART_BUF[12]; 
		int DF5,DF6,CS;
		DF5=(int)(temperature*10)/256;
		DF6=(int)(temperature*10)%256;
		CS=256-32-DF1-DF2-DF3-DF4-DF5-DF6;
            printf("\r\n");  //send
			USART_BUF[0]=0x16;
			USART_BUF[1]=0x09;
			USART_BUF[2]=0x01;
			USART_BUF[3]=DF1;//DF1
			USART_BUF[4]=DF2;//DF2
			USART_BUF[5]=DF3;//DF3
			USART_BUF[6]=DF4;//DF4
			USART_BUF[7]=DF5;//DF5
			USART_BUF[8]=DF6;//DF6
			USART_BUF[9]=0x00;//DF7
			USART_BUF[10]=0x00;//DF8
			USART_BUF[11]=CS;//CS
			HAL_UART_Transmit(&UART1_Handler,(uint8_t*)USART_BUF,12,1000);//send
		  while(__HAL_UART_GET_FLAG(&UART1_Handler,UART_FLAG_TC)!=SET);		//µÈ´ý·¢ËͽáÊø

		if(USART_RX_STA&0x8000)//receive
		{					   
			len=USART_RX_STA&0x3fff;//µÃµ½´Ë´Î½ÓÊÕµ½µÄÊý¾Ý³¤¶È
			//printf("\r\nÄú·¢Ë͵ÄÏûϢΪ:\r\n");
			//HAL_UART_Transmit(&UART1_Handler,(uint8_t*)USART_RX_BUF,len,1000);	//·¢ËͽÓÊÕµ½µÄÊý¾Ý
			if(USART_RX_BUF[0]==0x11  &&USART_RX_BUF[1]==0x01 &&USART_RX_BUF[2]==0x1F &&USART_RX_BUF[3]==0xCF)
			{
			USART_BUF[0]=0x16;
			USART_BUF[1]=0x0B;
			USART_BUF[2]=0x1F;
			USART_BUF[3]=0x00;//SN1
			USART_BUF[4]=0x00;
			USART_BUF[5]=0x00;
			USART_BUF[6]=0x00;
			USART_BUF[7]=0x01;//SN5	
			USART_BUF[8]=192-1;//CS
			HAL_UART_Transmit(&UART1_Handler,(uint8_t*)USART_BUF,9,1000);
			}
			while(__HAL_UART_GET_FLAG(&UART1_Handler,UART_FLAG_TC)!=SET);		//µÈ´ý·¢ËͽáÊø
			//printf("\r\n\r\n");
			USART_RX_STA=0;
		}

		
		
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Dawn Yue

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值