博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
STM32CubeMX的串口配置,以及驱动代码
阅读量:6294 次
发布时间:2019-06-22

本文共 2249 字,大约阅读时间需要 7 分钟。

1.STM32CubeMX的配置没啥子好说的,使能然后改一下波特率和字长,然后在将中断勾选,把中断等级调到1(一定要比systick的优先级垃圾!!!)

2.驱动代码

在生成的it.c文件中,例如用的是串口3,防止串口的ORE的bug粗现

 

void USART1_IRQHandler(void){  /* USER CODE BEGIN USART1_IRQn 0 */	  if(__HAL_UART_GET_FLAG(&huart1, UART_FLAG_ORE)!=RESET)     __HAL_UART_CLEAR_OREFLAG(&huart1);  /* USER CODE END USART1_IRQn 0 */  HAL_UART_IRQHandler(&huart1);  /* USER CODE BEGIN USART1_IRQn 1 */  /* USER CODE END USART1_IRQn 1 */}

  

 

在用户文件userUtility.c中,第一个函数也是为了防止串口出ORE的bug,第二个函数用于接收

 

void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart){	  if(__HAL_UART_GET_FLAG(huart, UART_FLAG_ORE)!=RESET)     __HAL_UART_CLEAR_OREFLAG(huart);}/*-----------------------------------------------------------*//*-----------------------------------------------------------*/void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){    if(huart == &huart1)    {      vUart1RecData();    }		else if(huart == &huart4)		{			vUart4RecData();		}}

  

串口的驱动文件中

#define UARTX_RX_BUF_MAX_LEN 32#define UARTX_TX_BUF_MAX_LEN 32static uc prv_ucUartxRxBuf[UARTX_RX_BUF_MAX_LEN];static uc prv_ucUartxRxLen;static uc prv_ucUartxTxBuf[UARTX_TX_BUF_MAX_LEN];static uc prv_ucUartxTxLen;void vStartUartxRecIt(void)//初始化函数,开启串口接收中断{    HAL_UART_Receive_IT(&huart1, prv_ucUartxRxBuf,1);}void vUartxRecData(void){    prv_ucUartxRxLen=1;    while(HAL_UART_Receive(&huart1, &prv_ucUartxRxBuf[prv_ucUartxRxLen], 1, 2)==HAL_OK)//进入阻塞接收2ms接不到就不算在同一包数据中,就是因为这里内部用了sysytick来延时,所以要注意中断优先级    {        prv_ucUartxRxLen++;        if(prv_ucUartxRxLen>=UARTX_RX_BUF_MAX_LEN)        {            break;        }    }    controlData.ucUart1RxFlg=1;    }void vHandleUartxRxBuf(void){    if(controlData.ucUart1RxFlg==1)//通过一个Flg来耦合接收和处理函数,处理函数看情况放在userWhile中或者直接放在TIM6的回调函数中,多少ms执行一次,充当实时任务    {        //        //Handle code        //    memset((uc *)&prv_ucUartxRxBuf,0,sizeof(prv_ucUartxRxBuf));    controlData.ucUart1RxFlg=0;    vStartUartxRecIt();    }}

 

 3.串口发送数据的时候

HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)

这个函数最好用

__disable_irq();

__enable_irq();

夹起来,一来是为了防止发送的时候,有中断来造成数据传输有“断包”的现象,二来是避免发送数据的时候同时接到数据

产生ORE这种BUG

PS;有的人看到可能会说CLEAR_LG这个宏函数,要求输入的参数和GET_ERROR返回的值,参数类型不一样,但其实看一下底层的宏定义会发现,

就tm是同一个玩意儿

 

转载于:https://www.cnblogs.com/ma77045728/p/8422780.html

你可能感兴趣的文章
MyBatis-Plus | 最简单的查询操作教程(Lambda)
查看>>
rpmfusion 的国内大学 NEU 源配置
查看>>
spring jpa 配置详解
查看>>
IOE,为什么去IOE?
查看>>
Storm中的Worker
查看>>
dangdang.ddframe.job中页面修改表达式后进行检查
查看>>
Web基础架构:负载均衡和LVS
查看>>
Linux下c/c++相对路径动态库的生成与使用
查看>>
SHELL实现跳板机,只允许用户执行少量允许的命令
查看>>
SpringBoot 整合Redis
查看>>
2014上半年大片早知道
查看>>
Android 6.0指纹识别App开发案例
查看>>
正文提取算法
查看>>
轻松学PHP
查看>>
Linux中的网络监控命令
查看>>
this的用法
查看>>
windows下安装redis
查看>>
CentOS7 yum 安装git
查看>>
启动日志中频繁出现以下信息
查看>>
httpd – 对Apache的DFOREGROUND感到困惑
查看>>