注意
首先要注意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;
}