历史上的今天
今天是:2025年07月31日(星期四)
2019年07月31日 | STM32CubeMX的串口配置,以及驱动代码
2019-07-31 来源:eefocus
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,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是同一个玩意儿


史海拾趣
|
本帖最后由 Fred_1977 于 2022-12-20 16:09 编辑 说实在的,学FPGA的时候真的是爱好,因为我本身就是做硬件开发设计的; FPGA功能确认很强大,所以就想试着自已做一块开发板出来,如果买的话确实挺贵的,当然这不是主要原因 ...… 查看全部问答> |
|
[ ST NUCLEO-U575ZI-Q 测评] HAL移植U8G2 原来在arduino上使用了u8g2.今天偿试用stm32cubeIde进行移植。 一、用stm32cubeIDE进行配置i2c: 这次用到的为PB8-SCL、PB9-SDA,在管脚上配置好: 保存生成工程文件。 二、下载u8g2源码:https://gitcode.net/mirrors ...… 查看全部问答> |
|
GD32450i-EVAL开发板U盘例程存储从内部sram改为外部flash芯片不成功的问题 项目开发中需要存图片到外部flash中,使用GD32450i-EVAL开发板U盘例程,修改存储空间从内部sram改为外部flash芯片,只改了STORAGE_Init、STORAGE_Read、STORAGE_Write三个函数,还有扇区大小和数量。修改后枚举可以成功,格式化也提示成功,但不可 ...… 查看全部问答> |
|
鄙人近期遇到几个问题,感觉超出了本人的能力范围,无奈只能寄希望于请教一下论坛的大神了,哎!怪自己学艺不精呐,在此留下了无能的眼泪 如图,从上电之初开始分析,(设上电前C1C2电压为0,L1电流为0,忽略D1D2的正向压降和内阻) ...… 查看全部问答> |
|
红外体温计标定方法是怎么样的? 用体温计去测试黑体炉温度?黑体炉设置不同的温度,体温计测试后再比对黑体炉显示的温度?如果有偏差就修正,找出对应的函数关系? 红外体温计标定的流程 说能123说说 另外 ...… 查看全部问答> |
|
本帖最后由 supertanglang 于 2022-12-20 22:22 编辑 各位大师,本人小白,手里有块电源板(接类似吸尘器的东西,满载功率大概260W左右,2路输出),大概逆了下原理图,但是电源管理芯片上没有丝印信息,所以确定不了型号。各位大师是否能够根据 ...… 查看全部问答> |
|
【Sipeed 博流BL808全能板】BL808最小系统验证 本帖最后由 单笑寒 于 2022-12-21 10:04 编辑 BL808最小系统验证 手册里说,BL808有3个RISC-V核:D0核(480MHz RV64)、M0核(320MHz RV32)、LP核(160MHz RV32),本次基于官方文档验证最小环境(基于Linux ...… 查看全部问答> |
|
[ ST NUCLEO-U575ZI-Q 测评] STM32U5超低功耗高性能Cortex_M33MCU技术解析培训资料 今天找到了在ST中文网上的中文培训资料,很详细的PPT。这里分享给需要的人。 里面主要有: 1-市场部分 V1.3 2-硬件部分-v1.0 3-STM32U5对比STM32L5有哪些更新-v1.0 4-系统和架构-v1.0 5-DMA-v1.0 6-电源管理和低功耗-v1.0 ...… 查看全部问答> |
|
【Sipeed 博流BL808全能板】- 例子使用一 资料&&sdk结构分析整理 本帖最后由 damiaa 于 2022-12-21 09:57 编辑 【Sipeed 博流BL808全能板】- 例子使用一 资料&&sdk结构分 ...… 查看全部问答> |




