STM32之旅4——USART

发布时间:2024-08-13  

串口也是用的比较多的,在STM32CubeMX中生成代码后,需要添加一些代码才可以用。


drv_usart.h:


#ifndef __DRV_USART_H

#define __DRV_USART_H


#define USART1_MAX_LEN 64 //接收区长度

#define USART1_BUFF_CACHE_LEN 1 //接收缓冲区长度


extern uint16_t g_usart1_sta; //接收状态[1:15],最高位为接收完成标志

extern uint8_t g_usart1_buff[USART1_MAX_LEN]; //接收buff

extern uint8_t g_usart1_buff_cache[USART1_BUFF_CACHE_LEN]; //接收缓存


#endif

使用printf()发送的时候需要重定向,没有fputc()是不行的;使用中断接收的时候,并不是在USART1_IRQHandler()里面添加代码,而是在回调函数HAL_UART_RxCpltCallback()中写,接收完成时要在后面加上HAL_UART_Receive_IT(),串口初始化时也要加上HAL_UART_Receive_IT(),否则不能进中断。


drv_usart.c:


#include 'stm32f1xx.h'

#include 'drv_usart.h'

#include 'stdio.h'

#include 'usart.h'


uint16_t g_usart1_sta;//接收状态[1:15],最高位为接收完成标志

uint8_t g_usart1_buff[USART1_MAX_LEN];

uint8_t g_usart1_buff_cache[USART1_BUFF_CACHE_LEN];


/***********printf函数重写,有了这个函数就可以使用printf()发送串口数据了**********/

int fputc(int ch,FILE *f)

{

    uint8_t temp[1]={ch};

    HAL_UART_Transmit(&huart1,temp,1,2);


    return 0;

}

/****************************串口中断回调函数*************************************/

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)

{

    if(USART1 == huart->Instance)

    {

          if(0 == (g_usart1_sta & 0x8000))//接收未完成

          {

                g_usart1_buff[g_usart1_sta++] = g_usart1_buff_cache[0];


                if(0x0A == g_usart1_buff_cache[0])//如果接收到回车,就接收完成

                {

    g_usart1_sta |= 0x8000;

                }

          }

          HAL_UART_Receive_IT(&huart1,(uint8_t *)g_usart1_buff_cache,USART1_BUFF_CACHE_LEN);

    }

}

这里没加HAL_UART_Receive_IT()是不会进进中断的。


usart.c:


void MX_USART1_UART_Init(void)

{

    huart1.Instance = USART1;

    huart1.Init.BaudRate = 115200;

    huart1.Init.WordLength = UART_WORDLENGTH_8B;

    huart1.Init.StopBits = UART_STOPBITS_1;

    huart1.Init.Parity = UART_PARITY_NONE;

    huart1.Init.Mode = UART_MODE_TX_RX;

    huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;

    huart1.Init.OverSampling = UART_OVERSAMPLING_16;

    if (HAL_UART_Init(&huart1) != HAL_OK)

    {

          Error_Handler();

    }

    HAL_UART_Receive_IT(&huart1,g_usart1_buff_cache,USART1_BUFF_CACHE_LEN);

}


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>