1
完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
写在前面
bsp文件编写 bsp_uart.h代码 #ifndef __BSP_UART_H #define __BSP_UART_H #include "main.h" #define UART2_RX_MAX_LEN 400 #define UART2_TX_MAX_LEN 400 typedef struct { uint8_t *tx_data; }UartHead; typedef struct { UartHead uart2_head; }BspUartStr; uint8_t BspUartInit(void); void BspUartDeInit(void); uint8_t BspUart2Init(void); void BspUart2DeInit(void); void printf2(char* fmt,...); #endif bsp_uart.c代码 #include "bsp_uart.h" #include "FreeRTOS.h" #include "task.h" #include "cmsis_os.h" #include "stdarg.h" #include "stdio.h" #include "string.h" #include "usart.h" #include "semphr.h" #include extern UART_HandleTypeDef huart2; extern osSemaphoreId_t uart2TxIdleBinarySemHandle; BspUartStr* bsp_uart_str = NULL; /** * @name: * @description: 串口初始化,其中包含内存申请 * @msg: * @param {*} * @return {*} 0: 初始成功 bit 0 : 1结构体内存申请失败 * bit 1 : 1发送数据缓存内存申请失败 */ uint8_t BspUartInit(void) { if(bsp_uart_str != NULL) BspUartDeInit(); bsp_uart_str = pvPortMalloc(sizeof(BspUartStr)); if(bsp_uart_str == NULL) return 1; bsp_uart_str->uart2_head.tx_data = NULL; return BspUart2Init(); } /** * @name: * @description: 串口反初始化,内存释放 * @msg: * @param {*} * @return {*} */ void BspUartDeInit(void) { if(bsp_uart_str == NULL) return; BspUart2DeInit(); vPortFree(bsp_uart_str); bsp_uart_str = NULL; } /** * @name: * @description: 串口2初始化,其中包含内存申请 * @msg: * @param {*} * @return {*} 0: 初始成功 bit 0 : 1结构体内存申请失败 * bit 1 : 1发送数据缓存内存申请失败 */ uint8_t BspUart2Init(void) { if(bsp_uart_str == NULL) return 1; UartHead* uart2_head_str; uart2_head_str = &bsp_uart_str->uart2_head; if(uart2_head_str->tx_data != NULL) BspUart2DeInit(); uart2_head_str->tx_data = pvPortMalloc(UART2_TX_MAX_LEN); if(uart2_head_str->tx_data == NULL) return 2; MX_USART2_UART_Init(); //初始化串口 xSemaphoreGive(uart2TxIdleBinarySemHandle); //释放信号量 return 0; } /** * @name: * @description: 串口2反初始化,内存释放 * @msg: * @param {*} * @return {*} */ void BspUart2DeInit(void) { if(bsp_uart_str == NULL) return; if(bsp_uart_str->uart2_head.tx_data != NULL) { vPortFree(bsp_uart_str->uart2_head.tx_data); bsp_uart_str->uart2_head.tx_data = NULL; } } /** * @name: * @description: 串口打印函数重定义 * @msg: * @param {*} * @return {*} */ void printf2(char* fmt,...) { uint16_t i; va_list ap; if(xSemaphoreTake(uart2TxIdleBinarySemHandle,1000) == pdTRUE) { va_start(ap,fmt); if((bsp_uart_str == NULL)||(bsp_uart_str->uart2_head.tx_data == NULL)) { xSemaphoreGive(uart2TxIdleBinarySemHandle); //释放信号量 return ; } UartHead* uart_head_str; uart_head_str = &bsp_uart_str->uart2_head; i=vsnprintf((char*)uart_head_str->tx_data,UART2_TX_MAX_LEN,fmt,ap); va_end(ap); if(i == 0) { xSemaphoreGive(uart2TxIdleBinarySemHandle); //释放信号量 return; } HAL_UART_Transmit_DMA(&huart2,uart_head_str->tx_data,i); } } /** * @name: * @description: 串口发送完成回调函数 * @msg: * @param {*} * @return {*} */ //TX回调函数 void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart) { if(huart->Instance == USART2) { BaseType_t pxHigherPriorityTaskWoken; xSemaphoreGiveFromISR(uart2TxIdleBinarySemHandle,&pxHigherPriorityTaskWoken); //释放信号量 //如果需要的话进行一次任务切换 portYIELD_FROM_ISR(pxHigherPriorityTaskWoken); } } app文件编写 app_log.h代码 #ifndef __APP_LOG_H #define __APP_LOG_H #include "main.h" #define PRINTF_TASK_LOG 1 #define APP_LOG_DEBUG(...) printf2(__VA_ARGS__) #endif app_log.c代码 #include "app_log.h" #include "bsp_led.h" #include "FreeRTOS.h" #include "task.h" #include "cmsis_os.h" #include "bsp_uart.h" #include "tim.h" #include "string.h" void StartLogTask(void *argument) { uint16_t cnt_ms = 0; uint32_t test_cnt = 0; BspUartInit(); TickType_t last_time = xTaskGetTickCount(); for(;;) { vTaskDelayUntil(&last_time,10); cnt_ms++; if(cnt_ms >99) cnt_ms = 0; #if PRINTF_TASK_LOG if(cnt_ms == 0) { APP_LOG_DEBUG("当前未分配堆大小: %dBytern",xPortGetFreeHeapSize()); APP_LOG_DEBUG("未分配内存堆历史最小值 :%dByternn",xPortGetMinimumEverFreeHeapSize()); } #endif } } |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1767 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1619 浏览 1 评论
1069 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
724 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1673 浏览 2 评论
1935浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
727浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
567浏览 3评论
592浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
551浏览 3评论
小黑屋| 手机版| Archiver| 德赢Vwin官网 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-21 21:09 , Processed in 0.733587 second(s), Total 76, Slave 60 queries .
Powered by 德赢Vwin官网 网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
德赢Vwin官网 观察
版权所有 © 湖南华秋数字科技有限公司
德赢Vwin官网 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号