附件是 末学做STM32 UART的例程: ( j9 _/ F2 _8 |# u, F' ?; Y; q( ? 主要想法是: 从A 串口收到 命令,根据需要传到 B或C串口 的设备。 B/C 串口收到的 数据反应回 A串口 打印出来。5 ?% G, {6 U& n7 P7 n : }- M n9 e1 l$ S 参考论坛, 用cubeMX 工具设置 三个 串口LPUART1,USART2,UART4,比特率 及硬件;7 e4 |2 U" c2 b; X 打印参口了论坛的文章,由于该芯片 L476有浮点功能,浮点打印 加 %f 即可。' ~+ B; j: L3 o$ w* y2 e# M8 L ! d" a( P' x+ ?$ |) Q' F8 g 主要定义了 结构体 #define BUFFER_SIZE 60/ B% f8 s; g* n. {4 a typedef struct { uint8_t EndFlag:1; //空闲接收 uint16_t length; //接收长度 uint8_t dmaBuf[BUFFER_SIZE]; //串口DMA接收缓冲& _0 e6 T4 c6 z; b& q }UART_ReceiverDef;( ], ^) `8 S) p9 ? 3 C; x# M3 Z3 t" e% ^# Q 中断处理稍加处理 void USART2_IRQHandler(void) {" `: k/ ~" h, Q( K /* USER CODE BEGIN USART2_IRQn 0 */ uint32_t tmp_flag = 0;% G& X7 ?; K3 d# ~: Z uint32_t temp; /* USER CODE END USART2_IRQn 0 */ HAL_UART_IRQHandler(&huart2); /* USER CODE BEGIN USART2_IRQn 1 */ tmp_flag = __HAL_UART_GET_FLAG(&huart2,UART_FLAG_IDLE);+ d+ G/ K+ v9 E' a% c- v 2 x- P: i' ~( _( X; k if((tmp_flag != RESET)) {- d& u* e5 S: E$ Y __HAL_UART_CLEAR_IDLEFLAG(&huart2); % a0 A3 f- x' f; A' T /* 读取串口状态寄存器(芯片型号不同,寄存器名称可能需要修改) */ temp = huart2.Instance->ISR; /* 读取串口数据寄存器(芯片型号不同,寄存器名称可能需要修改) */. V! |- B3 W/ g% q0 p; B" N) Z temp = huart2.Instance->RDR; HAL_UART_DMAStop(&huart2); d/ l: u# @. a /* 读取DMA剩余传输数量(芯片型号不同,寄存器名称可能需要修改) */ temp = hdma_usart2_rx.Instance->CNDTR;5 p' W9 T; W3 R( a# r( i huart2_rx.EndFlag = 1;8 W4 X3 u( a7 C- f( u2 r huart2_rx.length = BUFFER_SIZE - temp; % q' l h3 H1 R5 w2 ?% i3 k } /* USER CODE END USART2_IRQn 1 */ }4 ^) g/ k$ G, l) U3 d0 \ main 函数 的 初始化:- ^4 H! S3 D/ U' { MX_USART2_UART_Init(); MX_UART4_Init();9 c7 c" ]- q; z/ J9 t: N MX_LPUART1_UART_Init(); 启动 uart口: __HAL_UART_ENABLE_IT(&hlpuart1, UART_IT_IDLE);* n& l5 h4 o8 g( j /*启动串口DMA接收*/! k' K7 I8 w8 @5 d0 {! h2 V: C HAL_UART_Receive_DMA(&hlpuart1,&huart2_rx.dmaBuf[0],BUFFER_SIZE);1 t3 g: i5 w( C 7 s! N6 C( t# G& e/ ]- N& j __HAL_UART_ENABLE_IT(&huart2, UART_IT_IDLE); /*启动串口DMA接收*/ HAL_UART_Receive_DMA(&huart2,&huart2_rx.dmaBuf[0],BUFFER_SIZE);, z, T3 R$ Q& I k' Z0 O) | 9 ]3 Z9 G R/ r/ @ __HAL_UART_ENABLE_IT(&huart4, UART_IT_IDLE); //UART_IT_IDLE% C1 s5 B4 C+ M* u* @ /*启动串口DMA接收*/ HAL_UART_Receive_DMA(&huart4,&huart4_rx.dmaBuf[0],BUFFER_SIZE);3 W, p0 @( M- Q4 w+ d Q/ g3 N8 w+ j d - F- Z: s+ [! l8 N5 O main 函数的while loop:) J5 b! j d# W: b' b- _: y7 R if (1 == hlpuart1_rx.EndFlag)5 [1 G9 N/ ~( n { HAL_UART_Transmit(&hlpuart1,&hlpuart1_rx.dmaBuf[0],hlpuart1_rx.length,250); //送回验证 hlpuart1 是否 OK,若改hlpuart1为huart2,就发给另个串口 hlpuart1_rx.length = 0; hlpuart1_rx.EndFlag = 0; 9 b9 p6 g3 {4 m: H memset(&hlpuart1_rx.dmaBuf[0],0,BUFFER_SIZE);/ F' n5 s9 e8 U) B HAL_UART_Receive_DMA(&hlpuart1,&hlpuart1_rx.dmaBuf[0],BUFFER_SIZE); //其实不必每个 Loop用这个函数 接收DMA ,若是环型的话 } # \" h2 p2 l6 b' _2 M1 ^! c if (1 == huart2_rx.EndFlag)6 w" ?" `) R4 a. K% P$ P { HAL_UART_Transmit(&huart2,&huart2_rx.dmaBuf[0],huart2_rx.length,250); //修改 huart2 为 hlpuart1,就可发给打印口2 x4 { _& i9 b/ d4 }: {7 ^& h7 U3 e huart2_rx.length = 0;. D0 }/ e. h1 h# P* p' ?% i4 [9 g huart2_rx.EndFlag = 0; & I5 l ~$ I7 b$ X' Q memset(&huart2_rx.dmaBuf[0],0,BUFFER_SIZE); HAL_UART_Receive_DMA(&huart2,&huart2_rx.dmaBuf[0],BUFFER_SIZE); //其实不必每个 Loop用这个函数 接收DMA ,若是环型的话。 9 ?0 z; w( S7 V* _" \0 n } % l4 |. `5 l9 @- i* C. X |
OpenBLT移植到STM32F103战舰开发板上适用于所有STM32F103系列的Bootloader
MultiButton移植到STM32F103战舰开发板
汇编浮点库qfplib移植STM32F769I-DISCO开发板与硬件浮点运算性能测试对比
【STM32MP157】从ST官方例程中分析RPMsg-TTY/SDB核间通信的使用方法
S2LP 的 sniff 模式如何同时满足通讯和低功耗要求
双证齐发!移远通信通过ISO 26262功能安全流程认证及产品认证
意法半导体 STHV200超声波 IC单片简化设计
了解NFC技术优势与应用场景
基于STM32软件实现底层函数经验分享—IIC通信
在 STM32 应用中虚拟增加串行通信外设数目
3UartOk_org.rar
2019-7-26 11:29 上传
点击文件名下载附件
726.55 KB, 下载次数: 48