你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32串口空闲中断

[复制链接]
久远寺有珠 发布时间:2021-6-7 14:21
这里介绍一种比较简单好用的串口接收方法——空闲中断6 h/ [6 R, t5 N5 }- Z; g
原理就是使能非空中断,在接收到数据的时候进入中断。进入后再使能空闲中断,然后不断接收数据。在接收不到数据之后,触发空闲中断,设置对应标志位,说明完成了一次接收。
7 \6 W  W6 n; G
9 q: A( ?' e9 H- s8 Z2 r% w5 E一、CubeMX, o2 c% s, {% G, @+ w" ]% j
1.新建工程,选择芯片,F103RCT66 i- k$ _9 M- s9 R: R. Q
2.设置RCC时钟,选用外部晶振,设置时钟为72MHz" B6 x  O  k( d! i" r) P  L
3.使能串口一,设置波特率为1152002 n8 t* X3 P9 ?- ~7 o( [
4.使能串口一中断
4 e" p; M& A  F% m% h5.生成MDK工程
; G& V" s' m) A( w1 y$ z7 b: F8 V
1 Q' w8 U8 O* s- Y3 b, X: t- {二、编写代码+ x. L: s- `# m  ]' K) n
1.重定向printf
& U2 |+ E; g8 I( q
  1. #include "stdio.h"7 P$ n+ @) F0 S% K, O
  2. int fputc(int ch, FILE *f)5 \; y8 W9 {. X* m
  3. {
    ' d, e+ i" Y. r; Q# d- p9 Y
  4.   HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);
    # w3 z( F2 X9 Q) N% z8 W& b4 j
  5.   return ch;
    4 \! `0 ?( Y/ T; E
  6. }
复制代码
2.使能非空中断
: b3 b0 }; H" Q/ f# k2 \3 i
  1. __HAL_UART_ENABLE_IT(&huart1, UART_IT_RXNE);
复制代码
3.编写中断接收函数
7 Y6 {0 }, T: w5 b- f+ Q6 _% B  |2 W* D  v
  1. void USART1_IRQHandler(void)
    8 i$ j7 w6 }9 s2 ?7 ]8 b
  2. {3 q5 ~. k' n% z) d: R( p
  3.   /* USER CODE BEGIN USART1_IRQn 0 */- @) Y, m  [/ f: a2 J0 p
  4.         if((__HAL_UART_GET_FLAG(&huart1, UART_FLAG_RXNE) != RESET))% S1 z6 b& z6 I# F; ?, s  B% i
  5.         {( |# H; e$ `2 i: p( }
  6.                 __HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);0 `3 h* v7 Q1 A; I% a7 k
  7.                 aRxBuffer[aRxCount++] = (uint8_t)(huart1.Instance->DR & (uint8_t)0x00ff);# ]0 D# G, i' {" A
  8.                 __HAL_UART_CLEAR_FLAG(&huart1, UART_FLAG_RXNE);" `& q% d0 a+ B+ y$ F. ?) j& K' P
  9.         }# _$ M# q: G5 B. ~+ D9 {, t
  10.        
    - t4 B$ m/ {, `
  11.         if((__HAL_UART_GET_FLAG(&huart1, UART_FLAG_IDLE) != RESET))
    $ C8 D8 Q1 r2 g' z: [: d
  12.         {9 K! M7 S2 }8 f1 d7 `
  13.                 __HAL_UART_DISABLE_IT(&huart1, UART_IT_IDLE);, O' D" C, ~/ o0 _6 A3 p5 `
  14.                 aRxState = 1;) i" N# J( I" G( W1 E7 H- u
  15.         }% p! c' P; T) q% Q
  16.         return;7 M$ \. P+ u0 s! T0 R1 E6 s
  17.   /* USER CODE END USART1_IRQn 0 */
    , |' p; g) ]5 {) q7 ]
  18.   HAL_UART_IRQHandler(&huart1);
    + m# E6 F9 I% N! y" r* m3 E
  19.   /* USER CODE BEGIN USART1_IRQn 1 */
    $ L) S3 H+ X( b6 K
  20. 3 V8 j8 W  O3 Q; {' u5 ~
  21.   /* USER CODE END USART1_IRQn 1 */# `% T: T7 @" I3 D% s/ E
  22. }
复制代码
5.接收完成后的输出代码1 Q/ M3 u8 i$ f! x9 b, \  E' b8 J# Y
  1.   while (1)
    ' u2 A( q  _; D# {: W! G
  2.   {
    / }/ ]2 n, m$ c9 C9 S1 f7 v' }
  3.     if(aRxState == 1)
    - H7 B8 I- U3 b4 u+ b3 V
  4.     {/ k9 s. w) _& h, z+ E
  5.       aRxState = 0;8 H0 V) _1 Y' t. W: N& ?
  6.       HAL_UART_Transmit(&huart1, aRxBuffer, aRxCount, HAL_MAX_DELAY);9 l  P- [- J  T8 C; E2 L3 k
  7.       aRxCount = 0;8 T4 F2 t9 p! [( t/ V( \4 W% e8 ~7 O
  8.       memset(aRxBuffer, 0, aRxSize);
    0 Q  ~; [- ~/ g
  9.     }4 k' Z, p+ C; w2 e
  10.     /* USER CODE END WHILE */
    # p8 T) t4 h5 X7 z# ~. W
  11. ' Q9 z2 _+ e) b& S
  12.     /* USER CODE BEGIN 3 */
    ) m! G2 o/ e+ o2 A0 R4 o, g: p
  13.   }
复制代码
6.下载代码
3 F$ y- l* M& q6 P' z1 L7 x, U  Z
% e, Q) g' p, L8 x! E- w  ^

时钟树

时钟树

串口配置

串口配置

开启中断

开启中断

效果

效果

" g* z1 m: C1 `& m2 ?3 B, h7 a+ R3 A4 b1 H6 q; t

7 ~5 [( l8 [9 P- @9 ^+ [; m+ W idleTest.rar (504.71 KB, 下载次数: 6)
收藏 评论0 发布时间:2021-6-7 14:21

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版