|
附件是 末学做STM32 UART的例程: * f$ l5 q4 k/ g0 `4 ^9 l" R- j4 w9 E 主要想法是: 从A 串口收到 命令,根据需要传到 B或C串口 的设备。+ P# J0 l# N+ p B/C 串口收到的 数据反应回 A串口 打印出来。 参考论坛,5 n4 n% o5 E, z* c% @ 6 }- g+ w- {- Q2 V1 R 用cubeMX 工具设置 三个 串口LPUART1,USART2,UART4,比特率 及硬件; 打印参口了论坛的文章,由于该芯片 L476有浮点功能,浮点打印 加 %f 即可。 主要定义了 结构体 ( Z6 d3 W; s. l0 ^ #define BUFFER_SIZE 603 [& [; v. C; n typedef struct% Z, V' R2 Z0 u3 ] {; N) i& a( F3 G1 O) J3 G4 h uint8_t EndFlag:1; //空闲接收 uint16_t length; //接收长度7 ?2 X ^2 M. y9 V% r) u8 r uint8_t dmaBuf[BUFFER_SIZE]; //串口DMA接收缓冲 }UART_ReceiverDef; 中断处理稍加处理9 [2 U, }, X+ A9 A0 \7 H/ ~+ ~# L* o$ L+ p void USART2_IRQHandler(void)2 u: w8 _. d1 H; p1 k" r { /* USER CODE BEGIN USART2_IRQn 0 */: I9 E7 o# K$ O, B1 t' m uint32_t tmp_flag = 0;* D) c* B' N2 A3 B uint32_t temp;+ U* o6 ]3 O/ `/ O5 h, |3 b( k /* USER CODE END USART2_IRQn 0 */' S- w! y( v- S* N# s E" c# T9 N8 C HAL_UART_IRQHandler(&huart2); /* USER CODE BEGIN USART2_IRQn 1 */ tmp_flag = __HAL_UART_GET_FLAG(&huart2,UART_FLAG_IDLE); t( G- j4 o* K f if((tmp_flag != RESET)). `6 ?( B! j( G {5 C' ?- S2 b. V/ Z! n __HAL_UART_CLEAR_IDLEFLAG(&huart2); /* 读取串口状态寄存器(芯片型号不同,寄存器名称可能需要修改) */) w9 Y7 o5 M; _; E5 S F temp = huart2.Instance->ISR; /* 读取串口数据寄存器(芯片型号不同,寄存器名称可能需要修改) */4 E9 T0 |0 L5 _* h) |, l temp = huart2.Instance->RDR; ; C- W7 ~( E+ P/ E) v! }: N# X HAL_UART_DMAStop(&huart2); 9 T, G" ]& B- _* w2 K4 q2 b /* 读取DMA剩余传输数量(芯片型号不同,寄存器名称可能需要修改) */ temp = hdma_usart2_rx.Instance->CNDTR;1 j' H6 F7 o. Y huart2_rx.EndFlag = 1; huart2_rx.length = BUFFER_SIZE - temp; 6 c9 X$ ~% ~+ a) r* D# ~9 O7 o" @ } /* USER CODE END USART2_IRQn 1 */$ C) w9 {! F- J6 d1 r Y9 N6 U } 4 A& N8 j, D2 [& b main 函数 的 初始化:( r9 t0 P8 b0 m/ @1 A% ^4 A8 ? MX_USART2_UART_Init();7 H0 V: o3 e, x4 y8 ]/ [ MX_UART4_Init(); MX_LPUART1_UART_Init(); 启动 uart口: __HAL_UART_ENABLE_IT(&hlpuart1, UART_IT_IDLE); /*启动串口DMA接收*/7 H7 S( H- @% O; x HAL_UART_Receive_DMA(&hlpuart1,&huart2_rx.dmaBuf[0],BUFFER_SIZE); __HAL_UART_ENABLE_IT(&huart2, UART_IT_IDLE);9 Y7 h% h; }8 R( E) W5 t0 g /*启动串口DMA接收*/ HAL_UART_Receive_DMA(&huart2,&huart2_rx.dmaBuf[0],BUFFER_SIZE);% y0 S2 Q) `6 u6 s: w" h/ }- E 9 u h( `3 h+ k2 o7 a5 N __HAL_UART_ENABLE_IT(&huart4, UART_IT_IDLE); //UART_IT_IDLE /*启动串口DMA接收*/6 v) K+ P0 [1 P! v HAL_UART_Receive_DMA(&huart4,&huart4_rx.dmaBuf[0],BUFFER_SIZE);4 @& `% E: ~! o r" e 8 b$ z- y7 Q1 v# N 7 y0 L' D! x' ?+ H main 函数的while loop:( x1 c- K8 b: V2 E0 U if (1 == hlpuart1_rx.EndFlag) E& q) m. @( [: s, u { HAL_UART_Transmit(&hlpuart1,&hlpuart1_rx.dmaBuf[0],hlpuart1_rx.length,250); //送回验证 hlpuart1 是否 OK,若改hlpuart1为huart2,就发给另个串口 hlpuart1_rx.length = 0;: V. _0 W3 l$ l) {+ [! @! W hlpuart1_rx.EndFlag = 0; 0 Z. N7 {/ C# E; l, s' Y memset(&hlpuart1_rx.dmaBuf[0],0,BUFFER_SIZE); HAL_UART_Receive_DMA(&hlpuart1,&hlpuart1_rx.dmaBuf[0],BUFFER_SIZE); //其实不必每个 Loop用这个函数 接收DMA ,若是环型的话 } if (1 == huart2_rx.EndFlag) { HAL_UART_Transmit(&huart2,&huart2_rx.dmaBuf[0],huart2_rx.length,250); //修改 huart2 为 hlpuart1,就可发给打印口% ~# w& T; z1 k huart2_rx.length = 0;& f8 U( W7 \3 z' ]' P3 G/ ? huart2_rx.EndFlag = 0; - F2 d' i+ k. C* R& r; ` ; D/ V$ j% S4 U- f. F memset(&huart2_rx.dmaBuf[0],0,BUFFER_SIZE); HAL_UART_Receive_DMA(&huart2,&huart2_rx.dmaBuf[0],BUFFER_SIZE); //其实不必每个 Loop用这个函数 接收DMA ,若是环型的话。 } |
STM32L562DK探索板——串口通讯测试成功
OpenBLT移植到STM32F103战舰开发板上适用于所有STM32F103系列的Bootloader
NUCLEO-H723ZG开发板试用 ——串口点灯测试
MultiButton移植到STM32F103战舰开发板
汇编浮点库qfplib移植STM32F769I-DISCO开发板与硬件浮点运算性能测试对比
【STM32MP157】从ST官方例程中分析RPMsg-TTY/SDB核间通信的使用方法
S2LP 的 sniff 模式如何同时满足通讯和低功耗要求
双证齐发!移远通信通过ISO 26262功能安全流程认证及产品认证
意法半导体 STHV200超声波 IC单片简化设计
了解NFC技术优势与应用场景
微信公众号
手机版
3UartOk_org.rar
2019-7-26 11:29 上传
点击文件名下载附件
726.55 KB, 下载次数: 51