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

ARM CMSIS Driver 学习 之 USART

[复制链接]
XinLiYF 发布时间:2018-4-6 19:47
本帖最后由 XinLiYF 于 2018-4-14 18:02 编辑
( A& c4 O9 R& N5 x  Z# M# T2 o# s6 p/ b) n
ARM CMSIS Driver 学习 之 USART+ i4 ]. t. m4 |6 v* o
) U6 g+ g" A( `$ _- p' p. N* n/ H: p. j
       最近把 MDK 升级到了 V5.25 ,发现 Managing Run-Time Environment 中已经有好多好多的库。相比之前已经好了太多太多,从底层驱动,到上层协议栈,常用的有不常用的也有。发现 ARM 对这套系统的更新速度加快了一些,觉得有必要学习一下。从驱动开始学起,先学 USART API 详细介绍见 CMSIS Driver USART API
, Q- u  J% n2 H5 ^' Q1 X. X8 i' r2 T: g! ~. O: g& u" I
USART 把收到的数据再发出去程序
. T- e2 V/ L7 ]5 y
  1. /**$ k  _$ f8 E3 W0 N4 q
  2.   ******************************************************************************
    0 w  U( G5 Q$ T
  3.   * @file    main.c
    4 d" s7 o. I9 X8 b$ @; ]3 A( I! y% Q
  4.   * @author  XinLi( G( x! M7 a) t+ }& p& r9 h
  5.   * @version v1.0/ d1 P" v, k0 D6 d) J4 W
  6.   * @date    20-March-2018& Q5 t# H" h  z2 F' C( S  c
  7.   * @brief   Main program body.3 g* _$ R) V* g+ J
  8.   ******************************************************************************
    9 n8 v, k) r1 o4 I* Y
  9.   * @attention+ o1 Y6 p  r4 n; Y7 T& Q
  10.   *' I; k: d* G9 g# m' N
  11.   * <h2><center>Copyright © 2018 XinLi</center></h2>
    ) m- c/ b. p& ?& q; N
  12.   *
    ) D# i$ y1 Z+ N, h: a( ]
  13.   * This program is free software: you can redistribute it and/or modify
    8 W7 p( X" N; n; r7 P+ ^! e
  14.   * it under the terms of the GNU General Public License as published by4 q: y1 ^0 \5 }& }
  15.   * the Free Software Foundation, either version 3 of the License, or" R# r% X/ Q+ j7 x& k
  16.   * (at your option) any later version.' e$ W* `) Y. I) ~) J& M" r
  17.   *
    & P" o- q  e: t+ n7 ^
  18.   * This program is distributed in the hope that it will be useful,
    . ]$ v5 U. @8 Z) Q% f5 {! K
  19.   * but WITHOUT ANY WARRANTY; without even the implied warranty of! f5 A* z; Z6 j; E
  20.   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the$ ^& p& H  L2 M. P7 b8 A8 B
  21.   * GNU General Public License for more details.
    4 M& ~" T# s' z5 e: O0 t2 L
  22.   *
    + d& S0 F6 G$ t" X* G
  23.   * You should have received a copy of the GNU General Public License
    ( |9 U- b% d) G" q" h
  24.   * along with this program.  If not, see <http://www.gnu.org/licenses/>.
    ; Y. L% t# x+ Z5 ]& [" ?; N
  25.   *
    ! O* |- v6 \) \  U
  26.   ******************************************************************************# W* j+ B2 p; |; |. C  m
  27.   */) f% e9 B3 Q% P1 ~
  28. : g* V& O. O' {2 X# M! s5 }
  29. /* Header includes -----------------------------------------------------------*/
    ; N4 ?: w/ n6 x  ^
  30. #include "stm32f4xx.h"% f) K1 _! R& p: O# d) Y$ V
  31. #include "Driver_USART.h"
    5 o2 y( @- y3 S" a. P& v7 X) x
  32. #include <string.h>
    7 O2 J7 l, n1 R' u. D

  33. " p4 O& u/ @9 p
  34. /* Macro definitions ---------------------------------------------------------*/
    ' b/ U' v7 _# m  k7 ~7 T( q
  35. /* Type definitions ----------------------------------------------------------*/
    9 Z2 V* r1 @  y* W' G9 Y* y
  36. /* Variable declarations -----------------------------------------------------*/
    ' f1 r: I( E) i# x
  37. extern ARM_DRIVER_USART Driver_USART1;
    - B1 ^- [* P$ l
  38. % b: M3 ~: A2 i2 \
  39. /* Variable definitions ------------------------------------------------------*/- n2 ~' E# h& F: G% l7 [
  40. static uint8_t rxBuffer[1024] = {0};
    ' e" r3 p9 a* ?6 G
  41. static uint8_t txBuffer[1024] = {0};
    ; [; _2 Y% J3 m# Y; X

  42. 4 I# G3 y3 U/ K% M7 z
  43. /* Function declarations -----------------------------------------------------*/
    / f* c9 n/ E) j9 ^2 z+ X6 Z
  44. static void USART1_Callback(uint32_t event);
      B' Q; y, A+ J/ u+ \
  45. static void SystemClock_Config(void);' ]; I: N1 G% e9 x- S* \" B2 Y

  46. 1 v$ C3 J: z5 o' H
  47. /* Function definitions ------------------------------------------------------*/* s: g+ L3 i0 R/ I6 k4 U
  48. 3 V  Y/ C  S8 M$ i7 s6 P
  49. /**
    - L* a7 Z8 e# G1 }8 w5 I6 n7 Z8 Z
  50.   * @brief  Main program.% p( y: |1 g& s! G4 t. d
  51.   * @param  None.+ \9 v5 w, L8 W# c) V/ }  z) E3 p9 v
  52.   * @return None.+ s4 `' W  F9 I
  53.   */1 D8 E6 A! Z8 Q% D, ?* _
  54. int main(void)
    ( @8 |; @. E9 E. L( M
  55. {4 d, v' }& j* a, s6 [
  56.   /* STM32F4xx HAL library initialization:8 f& ~, l$ F  v+ A- h' O% c
  57.        - Configure the Flash prefetch, instruction and Data caches& g9 b' i0 X. Y* S# |
  58.        - Configure the Systick to generate an interrupt each 1 msec
    1 a, ^  T5 Y; {. y- n; U1 L
  59.        - Set NVIC Group Priority to 4
    3 @& |& x! P7 ~4 m( s% W% i
  60.        - Global MSP (MCU Support Package) initialization; y. a/ @! L( W# d+ P4 C8 E! Q
  61.      */
    5 P; x% o! h7 j+ ~8 M2 O2 V* G2 T
  62.   HAL_Init();9 G$ H& C. H! |
  63.   
    1 N" @. g( Y! ~' T( ^% _" L" t: Y, n
  64.   /* Configure the system clock to 168 MHz */
    + S. e* `, i9 B) d, C; D
  65.   SystemClock_Config();3 ^1 P2 Z; z. A5 J5 L) ^
  66.   6 C+ f: }7 u5 q& z
  67.   Driver_USART1.Initialize(USART1_Callback);
    2 a4 \. S# S1 F8 w# q0 @( m
  68.   Driver_USART1.PowerControl(ARM_POWER_FULL);
    . S" h5 e) ?5 v, C8 u( b* Q" X' v: J
  69.   Driver_USART1.Control(ARM_USART_MODE_ASYNCHRONOUS |
    - U& u2 K4 w; w: y: y4 @9 w6 }3 z- M
  70.                         ARM_USART_DATA_BITS_8 |- o/ J$ g/ V* T' O
  71.                         ARM_USART_PARITY_NONE |" M: p" D, G+ t0 A. D
  72.                         ARM_USART_STOP_BITS_1 |" ]  A8 Z# F0 f& D( o
  73.                         ARM_USART_FLOW_CONTROL_NONE, 115200);
    ' t/ O& j/ x0 s% l! A
  74.   Driver_USART1.Control(ARM_USART_CONTROL_TX, 1);
    ! _; p. G0 D* |2 k' W9 \
  75.   Driver_USART1.Control(ARM_USART_CONTROL_RX, 1);+ `: v) g3 @0 A8 t9 R( g' |
  76.   
    ) X  {" ^# |- ?
  77.   Driver_USART1.Receive(rxBuffer, sizeof(rxBuffer));3 \( i; c. G( a' g4 P  g
  78.   
    2 m. j  j4 ]+ }6 g) U
  79.   for(;;)) I, B8 \% y( o* D. s! \  D# @9 m+ z* ?
  80.   {
    4 _/ @& V" I& P0 c9 A
  81.    
    ) A; ^- v0 Q. i6 Y) a$ z
  82.   }
    ! X5 ]' {& e" J7 O8 p
  83. }. W# _. R5 z- N' T

  84. 9 f7 Q8 v9 Z  e* e" [
  85. /**
    % {  w% u$ p# x- x* J' \4 _! G
  86.   * @brief  USART1 callback function.
    & T; O/ v) f9 S3 z" R
  87.   * @param  event: USART events notification mask.4 H4 o2 d- G( L" O' v( f* h
  88.   * @return None.
    3 p* ^) m7 ~, Q2 l% n2 f
  89.   */; L& A& V+ l; ?. h" W) f
  90. static void USART1_Callback(uint32_t event)
    % b" H/ [( \+ F# P$ l. t
  91. {
    6 A* y0 p/ R( ^, |/ e+ C
  92.   if(event & ARM_USART_EVENT_RX_TIMEOUT)
    # `. @7 S' R: A& m" g7 @
  93.   {
    2 ]( S0 V9 C/ [# Z* }8 }- O
  94.     Driver_USART1.Control(ARM_USART_ABORT_RECEIVE, 1);3 C+ l8 d- [1 N/ q: s5 T
  95.     * g& _6 v- S3 ], Q- h$ h7 L
  96.     uint32_t length = Driver_USART1.GetRxCount();9 S/ m9 p* A5 q9 X
  97.    
    ) C2 i* Y9 h  L) X# p
  98.     memcpy(txBuffer, rxBuffer, length);
    ' _: K5 P( g' n* e/ F; }5 d, `3 o! g4 P
  99.    
    9 Q$ o2 o9 n& U& Y0 Q  d! i- S
  100.     Driver_USART1.Send(txBuffer, length);5 K* w, H( ^3 l' o! g% o
  101.     Driver_USART1.Receive(rxBuffer, sizeof(rxBuffer));
    ) j* w( D1 ]) ]6 s5 h4 o7 c: X
  102.   }( i  G3 ~9 n2 H: k& x/ `- o
  103. }! J  J$ m* W& a7 P! o1 T0 R$ Q
  104. + }/ A( K$ [; f
  105. /**
    * x5 H6 s+ i1 |3 P: X7 A7 g, J
  106.   * @brief  System Clock Configuration
    $ Y+ q( L+ d  o
  107.   *         The system Clock is configured as follow :
    ! \" k: E. }, `- w
  108.   *            System Clock source            = PLL (HSE)9 P6 m8 Q* `5 V& Q. B# T1 J
  109.   *            SYSCLK(Hz)                     = 168000000/ F; Y$ T! ~. i# C
  110.   *            HCLK(Hz)                       = 1680000006 |0 v" ?1 Z% X1 m% p9 g1 G
  111.   *            AHB Prescaler                  = 1' s8 f4 E3 q& T/ |
  112.   *            APB1 Prescaler                 = 4( U) B/ [& }/ [+ U* U; h( m
  113.   *            APB2 Prescaler                 = 2
      _% G1 g& s1 l. I& I' c- j+ W
  114.   *            HSE Frequency(Hz)              = 8000000/ O* a7 g' Y1 [7 d' w
  115.   *            PLL_M                          = 8
    - D6 G4 [+ D& X
  116.   *            PLL_N                          = 336  k. ~# T/ h( G) a$ F. ~# G
  117.   *            PLL_P                          = 2, Y, q) f6 @" V6 D
  118.   *            PLL_Q                          = 7
    1 }! q2 E5 d4 |* l% z
  119.   *            VDD(V)                         = 3.3. P. |) Y( Q0 _
  120.   *            Main regulator output voltage  = Scale1 mode3 m6 g* b1 j- C3 ^$ C# d$ A
  121.   *            Flash Latency(WS)              = 5
    1 e0 `, D5 t9 V: F  ]8 o
  122.   * @param  None
    6 I; z# [- J. u2 Z$ X5 M* q
  123.   * @retval None+ p. X' O2 j' K% f, C/ v  m1 u
  124.   */  Z  X2 J* V* m  k
  125. static void SystemClock_Config(void)* |; G9 t% l+ Z" u6 Q5 o5 I; G# n: G
  126. {
    / Z4 w6 s  A8 z: E' @; s
  127.   RCC_ClkInitTypeDef RCC_ClkInitStruct;6 x/ R( X$ L* h2 z- i, s
  128.   RCC_OscInitTypeDef RCC_OscInitStruct;- c  u5 v& K5 C6 A# T
  129.   v* t4 ]2 y  y) t
  130.   /* Enable Power Control clock */
    - o4 |! p& ^. R
  131.   __HAL_RCC_PWR_CLK_ENABLE();  @) [2 q9 d6 Z# }  E- o
  132. # s8 S4 w# P# x, n
  133.   /* The voltage scaling allows optimizing the power consumption when the device is
    ( ]# B. d+ J1 e
  134.      clocked below the maximum system frequency, to update the voltage scaling value . p4 Q0 ~7 t1 f
  135.      regarding system frequency refer to product datasheet.  */3 k' O2 @" T2 K- v9 a4 T
  136.   __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
    & }, G% p6 V! [" ?0 {2 G3 b

  137. # z6 Y2 `  a  ~, X0 F  q
  138.   /* Enable HSE Oscillator and activate PLL with HSE as source */5 U. E$ D2 A. R7 r7 i! o
  139.   RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
    : Y: y$ O/ j/ Z+ c1 f9 q
  140.   RCC_OscInitStruct.HSEState = RCC_HSE_ON;
    - u9 c% e, ]1 U/ R8 ~! C  X
  141.   RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
    ) m9 Z$ O! d2 w0 H# z
  142.   RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
    % s% }1 r3 h( d) q
  143.   RCC_OscInitStruct.PLL.PLLM = 8;1 H' W; x) v4 P; g8 Q+ e
  144.   RCC_OscInitStruct.PLL.PLLN = 336;
    6 }; _! e& P# N+ G9 q' i
  145.   RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
    " Z- F0 z) ~0 O- D
  146.   RCC_OscInitStruct.PLL.PLLQ = 7;
    # i3 o$ y4 v# w( u) S# e
  147.   HAL_RCC_OscConfig(&RCC_OscInitStruct);
    3 u! P- _7 x/ B- H) v# j$ b
  148.   
    + d8 M5 e+ d- N3 f
  149.   /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2 5 Y$ n  U8 l/ g' ^/ N' Q8 t
  150.      clocks dividers */  _* v' F4 t1 q8 x9 H" l, `
  151.   RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);; K+ W# G% |' j! G* P( w& O: r
  152.   RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;$ O; G3 v: K1 R% o9 y- \4 F& g
  153.   RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
    2 q; y0 }8 p- }% p  l' R  z
  154.   RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;  
    ) S$ P4 o/ d' ?# [
  155.   RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;  
    ) \% b. Q, w2 y/ R/ o
  156.   HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5);
    0 ?& f. ~4 A0 O) f; m% m; n
  157. " |0 F) Q% i) U1 r
  158.   /* STM32F405x/407x/415x/417x Revision Z devices: prefetch is supported  */: |) n; g' T$ s/ k, [3 Y3 Q
  159.   if (HAL_GetREVID() == 0x1001)1 _7 e2 T6 x: X# H
  160.   {- s/ p: m5 b$ [+ {
  161.     /* Enable the Flash prefetch */5 V$ f# j* u" ~! A9 [; i/ g
  162.     __HAL_FLASH_PREFETCH_BUFFER_ENABLE();4 z4 l  B5 s7 [) l& b3 {5 c! ]8 O
  163.   }2 a( s* M+ r! t8 H8 R
  164. }
    & Y! H; w% v- \0 d8 j6 _; V
复制代码
- O/ ?9 }9 j2 @1 a
归档链接" r* }; J5 R/ z% y
ARM CMSIS Driver 学习 之 SPI) l, s) y1 Q4 O( j- a1 t+ ~  p, v/ Z
5 N% T/ @6 ]( h4 p# H
收藏 1 评论9 发布时间:2018-4-6 19:47

举报

9个回答
黑皮男 回答时间:2018-4-6 20:56:15
CMSIS_Driver 还真没见过之前
XinLiYF 回答时间:2018-4-6 21:18:56
黑皮男 发表于 2018-4-6 20:56
$ b8 ~* n; \+ A! c* |CMSIS_Driver 还真没见过之前
8 g, G8 ?7 k+ ]$ K
这个出来有几年了,只不过之前没有现在全,现在可以用到项目里了,底层驱动 ARM 已经实现了跨平台,之后产品换 MCU 也比较方便。
黑皮男 回答时间:2018-4-6 21:43:04
XinLiYF 发表于 2018-4-6 21:18
) D! K* k2 x1 l9 D2 h0 k0 n+ Q, R这个出来有几年了,只不过之前没有现在全,现在可以用到项目里了,底层驱动 ARM 已经实现了跨平台,之后 ...
* }# m% l' P4 l! t. A; R
这个趋势很好啊,避免碎片化,抽空看看
XinLiYF 回答时间:2018-4-7 08:17:15
黑皮男 发表于 2018-4-6 21:43
+ R+ ]( J2 M0 z这个趋势很好啊,避免碎片化,抽空看看

# ^( ~) E! |5 Y. j  S是啊,MCU 开发就是缺少这样大一统的框架啊
x5y4z3 回答时间:2018-4-7 13:48:47
这 CMSIS 的 UART 驱动以前还真没见过,谢谢楼主的告知,赶紧来试试学习一下。
6 _& e0 M# p* E1 T& c) J
zero99 回答时间:2018-4-17 14:47:42
感谢分享,请汇总到4月技术原创9 ^6 g8 n% v3 e0 P1 k9 v
https://www.stmcu.org.cn/module/forum/thread-615497-1-1.html
wlx583193113 回答时间:2020-9-16 16:07:23
int main(void)! a  C. ]% I7 J$ w
{0 C* O4 f+ N1 F& ~+ E6 Z1 d8 O
//        UART1_Comm_Init(115200);& h+ c% Q1 t0 b9 y8 Q# A
        UART2_Comm_Init(9600);0 Z* n5 w  H9 L
       
0 F9 p+ J+ K3 x$ c( D+ V+ V        Driver_USART2.Send("http://www.cmsoft.cn", sizeof("http://www.cmsoft.cn"));
" r9 i% M' Q% C! ?        while(1);- n% |2 g/ o7 y& H, N/ W, _2 i
}. S% t6 r; [! C8 b5 X
程序运行到Driver_USART2.Send就卡在这一行 无法运行到while那里   同时发送的内容也没发出去' r/ F/ A: f& O$ D' T3 G
不知道咋回事????
wlx583193113 回答时间:2020-9-16 16:08:39
void USART2_Callback(uint32_t event)
2 C* a5 S" ^. v2 D% q{- s  ^1 l+ v0 w$ o0 e: `" k- h
  if(event & ARM_USART_EVENT_RX_TIMEOUT)3 q7 {8 x$ `6 T3 T  P6 s
  {
  W3 r& N) F+ j$ x# A    Driver_USART2.Control(ARM_USART_ABORT_RECEIVE, 1);
/ C8 d0 p/ p5 _6 V  t   2 I' W7 j' [, Z2 t2 S" U4 @- D# ?
    uint32_t length = Driver_USART2.GetRxCount();: S3 C2 \& X3 S  L) v  E
   ( A# ^( `* ]) N# l6 w/ o0 o
//    memcpy(txBuffer, rxBuffer, length);
; g0 z( F# }  i2 X//   
- ^& ?% ]: ]8 E' }( e//    Driver_USART1.Send(txBuffer, length);2 \( E2 q, @, }* I* g6 y$ U
    Driver_USART2.Receive(USART2_RxBfr, sizeof(USART2_RxBfr));
* i# ?! d' a& \) o$ M" M  }        ' M6 k4 l( \* ~( A5 B
        else if(event & ARM_USART_EVENT_SEND_COMPLETE)  [( z5 {& N: I3 w
        {5 G6 g5 @* N9 ^
                __NOP();
! E- W. N: t$ k% a        }
$ L( L, A! v# |  Y- l9 ~        else if(event & ARM_USART_EVENT_RECEIVE_COMPLETE)7 w; H/ o8 e7 R1 |5 F
        {$ a6 Z' ^# F3 q
                __NOP();
8 w3 ^% @! u2 a5 A        }) b6 `$ e  w" H; e
}) F$ Y+ Z$ ?3 L" ^8 `9 [& Z
从电脑端的串口工具发送内容  也没产生串口回调事件   不知道咋回事?????
wlx583193113 回答时间:2020-9-16 16:09:14
void UART2_Comm_Init(uint32_t Brate)
  J/ Z2 m6 r% i{//usb) \0 J3 L6 k8 O" F

: ?6 \# o1 [  H) A7 C; \$ _        Driver_USART2.Initialize(USART2_Callback);2 o8 D. b3 [" [  q# b- r
        Driver_USART2.PowerControl(ARM_POWER_FULL);, F+ W" P" x/ `2 v% @
        Driver_USART2.Control(ARM_USART_MODE_ASYNCHRONOUS |* m" P8 P5 `3 E" i. |
                                                                                ARM_USART_DATA_BITS_8 |
; x7 n( o7 l8 b0 u                          ARM_USART_PARITY_NONE |
7 {" |: n% x" B$ m+ E9 f# }! ]                          ARM_USART_STOP_BITS_1 |
. |* F, ]) ^  _# ~1 @* g                          ARM_USART_FLOW_CONTROL_NONE, Brate
! M7 v" P8 f0 i. P) u6 h) t                         );% ?& a+ M8 M4 r' r; c
        /* Enable Receiver and Transmitter lines */
* i0 h2 f( V; B3 n        Driver_USART2.Control(ARM_USART_CONTROL_TX, 1);
. G2 V% X( b  m# a        Driver_USART2.Control(ARM_USART_CONTROL_RX, 1);
; {  o7 h; x) Z/ p" {  D        /* Begin to receive */7 ]4 \1 J* f: t$ Z6 e5 f- n
        Driver_USART2.Receive(USART2_RxBfr, sizeof(USART2_RxBfr));1 G4 f! w* Q+ b4 M
}
2 x0 }. h+ F! s6 D. q; o0 @这是串口初始化

所属标签

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