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

STM32CubeMX的串口配置,以及驱动代码的更多相关文章

  1. 三星framebuffer驱动代码分析

    一.驱动总体概述 本次的驱动代码是Samsung公司为s5pv210这款SoC编写的framebuffer驱动,对应于s5pv210中的内部外设Display Controller (FIMD)模块. ...

  2. [置顶] 自娱自乐7之Linux UDC驱动2(自编udc驱动,现完成枚举过程,从驱动代码分析枚举过程)

    花了半个月,才搞定驱动中的枚举部分,现在说linux的枚举,windows可能有差别. 代码我会贴在后面,现在只是实现枚举,你可能对代码不感兴趣,我就不分析代码了,你可以看看 在<自娱自乐1&g ...

  3. 小草手把手教你 LabVIEW 串口仪器控制——VISA 串口配置

    建议大家按我发帖子的顺序来看,方便大家理解.请不要跳跃式的阅读.很多人现在看书,都跳跃式的看,选择性的看,导致有些细节的部分没有掌握到,然后又因为某个细节耽误很多时间.以上只是个人建议,高手可以略过本 ...

  4. JBOSS EAP 6 系列三 Oracle、Mysql数据源的配置(驱动)—认识模块的使用

    本文介绍JBOSS EAP 6.2中Oracle数据源的配置方式.结合之前JBOSS EAP 6.2新功能,本文初识JBOSS模块申明式容器这一特性. 模块申明式容器:JBOSS EAP不再有lib的 ...

  5. Linux时间子系统之(十七):ARM generic timer驱动代码分析

    专题文档汇总目录 Notes:ARM平台Clock/Timer架构:System counter.Timer以及两者之间关系:Per cpu timer通过CP15访问,System counter通 ...

  6. Linux时间子系统(十七) ARM generic timer驱动代码分析

    一.前言 关注ARM平台上timer driver(clocksource chip driver和clockevent chip driver)的驱动工程师应该会注意到timer硬件的演化过程.在单 ...

  7. DHT11温湿度传感器模块使用方法和驱动代码实现

    DHT11模块简介 DHT11是一款价格便宜,易于使用的温度湿度测量二合一传感器.它具有超小体积.极低功耗的特点.它使用单根总线与单片机进行双向的串行数据传输,信号传输距离可达20米以上.非常适用于对 ...

  8. 【STM32】STM32串口配置的一般步骤(库函数)

    STM32串口配置的一般步骤(库函数)(1)串口时钟使能:RCC_APBxPeriphClockCmd();    GPIO时钟使能:RCC_AHBxPeriphClockCmd();(2)引脚复用映 ...

  9. eclipse代码自动提示设置、如何配置eclipse的代码自动提示功能(同时解决自动补全变量名的问题)?

    对于编程人员来说,要记住大量的类名或类方法的名字,着实不是一件容易的事情.如果要IDE能够自动补全代码,那将为我们编程人员带来很大帮助. eclipse代码里面的代码提示功能默认是关闭的,只有输入“. ...

随机推荐

  1. material palette

    https://www.materialpalette.com/

  2. CentOS7+CDH5.14.0安装CDH错误排查:该主机与 Cloudera Manager Server 失去联系的时间过长。 该主机未与 Host Monitor 建立联系

    主机错误: 该主机与 Cloudera Manager Server 失去联系的时间过长. 该主机未与 Host Monitor 建立联系 解决办法: 首先查看该主机NTP服务是否启动:https:/ ...

  3. golang 安装tensorflow

    TF_TYPE="cpu" # Change to "gpu" for GPU support  //设置环境变量   TARGET_DIRECTORY='/u ...

  4. 在Linux 安装Python3.5.6详细文档!!!!

    在Linux 安装Python3.5.6详细文档!!!! 1.安装相关依赖库(工具包) yum install gcc patch libffi-devel python-devel  zlib-de ...

  5. mysql启动服务

    mysql.server start 启动mysql服务mysql.server stop 停止mysql服务 mysql密码:123456Az_

  6. 如何修改PCB后更新到原理图(以AD为例)

    实际绘图过程中会有多种情况发生,例如根据以前的项目做修改应用于新的项目.只有PCB没有原理图....... 如何通过修改PCB后更新到原理图(主要在PCB中增加元器件以及添加网络标号进行连线后更新到原 ...

  7. hbase-数据恢复流程

    引用<https://blog.csdn.net/nigeaoaojiao/article/details/54909921> hlog介绍: hlog构建: 从图中可以看出,对于一个hl ...

  8. Django实现文件的上传

    Django实现文件的上传 1.前端页面:使用file对象,读取文件对象传递到views中.需要设定enctype="multipart/form-data",表明不对字符进行编码 ...

  9. sql_calc_found_rows原理

  10. PHP日期格式化函数

    date函数 描述:格式化一个本地时间/日期 语法:string date(string format [,int timestamp]) format字符 说明 format字符 说明 Y 4位数字 ...