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

ARM CMSIS Driver 学习 之 USART

[复制链接]
XinLiYF 发布时间:2018-4-6 19:47
本帖最后由 XinLiYF 于 2018-4-14 18:02 编辑
' p  ?3 Z$ `' N1 y* N. X  a5 |+ W1 I
ARM CMSIS Driver 学习 之 USART
8 A$ A- n/ N( _% Q" O( z
1 p: G; p* q0 F
       最近把 MDK 升级到了 V5.25 ,发现 Managing Run-Time Environment 中已经有好多好多的库。相比之前已经好了太多太多,从底层驱动,到上层协议栈,常用的有不常用的也有。发现 ARM 对这套系统的更新速度加快了一些,觉得有必要学习一下。从驱动开始学起,先学 USART API 详细介绍见 CMSIS Driver USART API
( W* G! [! \) K1 N0 e7 x$ o
, m4 z6 [: [; Y9 x0 U7 v2 |. XUSART 把收到的数据再发出去程序' V7 L' B1 x9 \
  1. /**5 n- E6 C+ c" n  {% y" {3 _2 |
  2.   ******************************************************************************
    8 u; D/ I* x+ ?# m1 U1 P
  3.   * @file    main.c
    4 E$ I, s+ q% O- V; T4 q
  4.   * @author  XinLi( y7 w2 E8 O4 ]+ _2 c* y0 M
  5.   * @version v1.0" m4 i0 N! p9 ]+ K
  6.   * @date    20-March-20180 E- s6 D' v" D1 R
  7.   * @brief   Main program body.# ^) i0 C  T' @- X8 I
  8.   ******************************************************************************
      D! ~% O' `, {- d9 c' B
  9.   * @attention
    ( X  ?$ s) s, t) ]$ Q3 [* i
  10.   *
    % e% K/ U2 M2 n4 o* e0 t+ T/ B3 W
  11.   * <h2><center>Copyright © 2018 XinLi</center></h2>* T" d5 Q; h- b# q  Q5 X
  12.   *
    $ w* x: t# t0 a/ |7 k' W1 V. e: z+ M
  13.   * This program is free software: you can redistribute it and/or modify
    7 H: n7 n2 K6 M% \
  14.   * it under the terms of the GNU General Public License as published by! A; c2 G- W- l6 P" e5 M
  15.   * the Free Software Foundation, either version 3 of the License, or
    " E6 d& G: C) i' E  R& o% p
  16.   * (at your option) any later version.  z3 q, G! R% t* p! g
  17.   *, h- J- F' o- G# J& E7 w* m
  18.   * This program is distributed in the hope that it will be useful,- G/ Z* k8 I3 z5 ^- b, V
  19.   * but WITHOUT ANY WARRANTY; without even the implied warranty of- t; B. w, F3 b6 V
  20.   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    6 O) ]- n* a1 W
  21.   * GNU General Public License for more details.6 p# p8 Y; [. H( P; X
  22.   *
    2 h* Q- H, h5 n" o5 t5 h9 @' C
  23.   * You should have received a copy of the GNU General Public License- I$ B( h  V4 Z" U4 h/ i7 E4 G
  24.   * along with this program.  If not, see <http://www.gnu.org/licenses/>.. h. f! l/ @0 X: ~' D* ?
  25.   *% M3 |! X2 C9 Z/ U/ k
  26.   ******************************************************************************1 k; n- h! O4 {& Z
  27.   */+ `7 l3 l6 N1 E. h3 O

  28. . K) w% \# ^: m+ z" h1 I) v( i" I
  29. /* Header includes -----------------------------------------------------------*/
    ( }1 F1 P2 a! _" S% m3 E+ @) i
  30. #include "stm32f4xx.h"$ Z4 k: B% t( q5 I" o. }
  31. #include "Driver_USART.h"" j! H) L4 c$ G! j7 T2 F# b, [
  32. #include <string.h>
    ! Z% F2 n" F1 c* H

  33. 9 K' y( v$ K1 Q5 a4 o5 v
  34. /* Macro definitions ---------------------------------------------------------*/3 R6 k" e! M' }! ^: C. I5 V" l9 `
  35. /* Type definitions ----------------------------------------------------------*/
    # J5 s. d* l4 X& Z# p: r
  36. /* Variable declarations -----------------------------------------------------*/
    & `) B6 H& Y9 ~; \# }- p( Z& I+ @
  37. extern ARM_DRIVER_USART Driver_USART1;$ ]5 R/ s, _3 A: B7 e9 j5 |: @3 `
  38. 5 G  ~8 b7 e1 A  Z) |+ A0 ?4 d
  39. /* Variable definitions ------------------------------------------------------*/( o; i' f" n: p
  40. static uint8_t rxBuffer[1024] = {0};: z& U( ?* `1 `# c; D% }
  41. static uint8_t txBuffer[1024] = {0};+ p  F0 X6 E" @4 @1 ]0 z% b' ^$ y

  42. - m! i5 o% Z% \, }( f, _
  43. /* Function declarations -----------------------------------------------------*/
    # c) {, u# W- q* H! |7 r% d
  44. static void USART1_Callback(uint32_t event);( E- T4 B2 ^$ {4 J' f# j% M6 C0 `
  45. static void SystemClock_Config(void);3 u  Y5 k  @% H( s) r1 c( L4 G

  46. * \- |  I( P- Y! p/ l. y- V
  47. /* Function definitions ------------------------------------------------------*/
    % g# k0 D/ r* I7 o; J

  48. 4 S0 z) S) S7 R8 E
  49. /**& o: i, Y# f) V. o1 H
  50.   * @brief  Main program.9 V9 B) [6 P' N# {8 Z( o# c
  51.   * @param  None." d" Z5 v' W; P" q4 Q3 ]% G9 o
  52.   * @return None.3 v5 d; O9 v# {3 k, U" I; P( A
  53.   */
    ) y6 |- K7 o* c( _/ u2 e" z" ~8 w
  54. int main(void)
    ' r1 r3 |! I& ~0 I( z8 B5 p
  55. {" q+ {' S2 y1 \) p( c6 g
  56.   /* STM32F4xx HAL library initialization:
    3 v  i, ]' C1 V3 L
  57.        - Configure the Flash prefetch, instruction and Data caches2 {$ U: J: g! S4 H5 e, _
  58.        - Configure the Systick to generate an interrupt each 1 msec; K4 ?' X0 Q: R$ J& o! q. ?
  59.        - Set NVIC Group Priority to 4
    $ o, B2 U, V4 T, `1 B: C$ f6 H
  60.        - Global MSP (MCU Support Package) initialization% Q& Y9 f; i5 C+ ?4 U' L
  61.      */2 z8 b" S! i: V
  62.   HAL_Init();5 |' a$ l% z! Z
  63.   3 N5 M$ I6 z  S! z) j
  64.   /* Configure the system clock to 168 MHz */+ n* H  P* `4 @; f/ l
  65.   SystemClock_Config();
    + p- O/ e& G3 |8 C
  66.   
    9 z) K; \- R8 n" l
  67.   Driver_USART1.Initialize(USART1_Callback);
    ; s$ |# c' @' w( O; c
  68.   Driver_USART1.PowerControl(ARM_POWER_FULL);6 z9 w! a6 y. v8 B" e' H
  69.   Driver_USART1.Control(ARM_USART_MODE_ASYNCHRONOUS |7 d4 S& V: [9 t$ y. {5 V& @
  70.                         ARM_USART_DATA_BITS_8 |
    8 x& Z0 F; M8 T, A% P5 k. F9 J
  71.                         ARM_USART_PARITY_NONE |
    ' w  i" H& U- D# L' T8 K
  72.                         ARM_USART_STOP_BITS_1 |
    ! d, z' W' G: L9 n; M5 Q, K
  73.                         ARM_USART_FLOW_CONTROL_NONE, 115200);
    2 B" i6 V- L' V" `* r( V% q$ t' O
  74.   Driver_USART1.Control(ARM_USART_CONTROL_TX, 1);! C* a$ ]( b/ M$ q; r; T' v
  75.   Driver_USART1.Control(ARM_USART_CONTROL_RX, 1);
    5 p% n- F. d7 F% S2 k$ c
  76.   . t. U9 n5 {& Y9 n! b  s& ]9 _
  77.   Driver_USART1.Receive(rxBuffer, sizeof(rxBuffer));
    % i+ h+ c: C, F" ~) D
  78.   
    ; r2 ]4 u- M3 g+ d& N/ R* K/ J
  79.   for(;;)
    8 `3 [) f# i- j( d
  80.   {* d" q. Z# V# |; ^  K! w
  81.    
    0 z5 W8 A; y3 ?8 g4 m  V& x$ Q
  82.   }
    * ?( w5 K# x' [
  83. }
    9 V2 m3 y! f- x, ~+ V+ j. A7 b2 w

  84. 5 ~' s$ H  `5 s4 ?/ Q+ Z& h
  85. /**% f5 n4 `; c: n3 k
  86.   * @brief  USART1 callback function.# h1 Q! N3 g. @4 x2 B. w3 p# C/ i2 [
  87.   * @param  event: USART events notification mask.
    % E$ y5 o$ D" u1 `3 K2 W' K
  88.   * @return None.
    * Q7 |# X0 K$ t; u8 Y+ o+ d
  89.   */7 I( [1 `1 Z+ P6 q3 a; @
  90. static void USART1_Callback(uint32_t event)
    ! ?* ~! L9 h) J
  91. {
    6 O1 D! N3 [. Y, U, @$ ?* b
  92.   if(event & ARM_USART_EVENT_RX_TIMEOUT)1 f  E: M# ?' p* R! }
  93.   {" r% s6 D; `( f, q
  94.     Driver_USART1.Control(ARM_USART_ABORT_RECEIVE, 1);: M  {9 k) {$ C. _# c  V
  95.    
    ) x( _# ^$ D! e& D
  96.     uint32_t length = Driver_USART1.GetRxCount();
    ' F% N/ t" u: ^- z
  97.    
    * j4 f, o% e1 N% @: A& [  O" R. B
  98.     memcpy(txBuffer, rxBuffer, length);
    * o0 T$ w: n! [$ g" \
  99.    
    : P; d1 v% r3 f* v- O- G/ ]
  100.     Driver_USART1.Send(txBuffer, length);
    & q0 t/ j; G4 N; s8 _  R0 f6 n) ~
  101.     Driver_USART1.Receive(rxBuffer, sizeof(rxBuffer));. ]& c, }9 @  F% m
  102.   }
    ' z* b: l7 w+ }
  103. }/ ~: G% [! i0 y% |( s7 L$ W5 }1 k
  104. 4 I: G3 d' S' |* q
  105. /**
    1 Y: h% y/ }8 D; X! F/ ~
  106.   * @brief  System Clock Configuration
    ! C. e5 i* W3 U, i  K
  107.   *         The system Clock is configured as follow : ( z: y7 `5 M9 K' ~
  108.   *            System Clock source            = PLL (HSE)0 o% |9 s4 v  g+ W; X) y% [
  109.   *            SYSCLK(Hz)                     = 1680000001 ?' k  q7 {0 o- ]( }
  110.   *            HCLK(Hz)                       = 168000000
      M) s6 o$ M" q
  111.   *            AHB Prescaler                  = 1
    0 D7 X; a$ {" S! y. [( {
  112.   *            APB1 Prescaler                 = 40 w3 n; ?# ~' J. L
  113.   *            APB2 Prescaler                 = 2
    9 L% l, k. ^$ k' r2 a: @9 p
  114.   *            HSE Frequency(Hz)              = 8000000
    ' ^6 c! }+ v  q7 B+ [6 m
  115.   *            PLL_M                          = 8
    % @7 ^! A, L1 t, C/ x! g
  116.   *            PLL_N                          = 336
    5 w2 H; |% }5 n/ P0 T/ E7 d
  117.   *            PLL_P                          = 25 m3 r$ C+ c0 G3 G! p. u9 |$ s0 M0 y
  118.   *            PLL_Q                          = 7! ~' k8 X* G$ w; ~; i
  119.   *            VDD(V)                         = 3.3$ i8 O! K  T& ^
  120.   *            Main regulator output voltage  = Scale1 mode
    : J: x! e, ?1 Q
  121.   *            Flash Latency(WS)              = 52 X* O5 g: x2 E$ r9 k' d
  122.   * @param  None2 h2 c& M. l( I$ h3 E
  123.   * @retval None1 _2 f) A; E2 L+ Q6 y- L
  124.   */
    * w' m& K4 I* m- {
  125. static void SystemClock_Config(void)
    5 c, W' ^7 D/ E& t
  126. {# ]' f0 |! j+ S6 p& {
  127.   RCC_ClkInitTypeDef RCC_ClkInitStruct;: ^9 F7 R. k! ?) I$ B. a
  128.   RCC_OscInitTypeDef RCC_OscInitStruct;
    0 G: D, Q, E- I3 l/ e
  129. , @) W6 V6 P! _  Z4 D# }* h
  130.   /* Enable Power Control clock */
    ( x( O2 R! _7 l  t
  131.   __HAL_RCC_PWR_CLK_ENABLE();# [/ V- m' R! X4 }! r
  132. $ [$ N( j. w* y6 i
  133.   /* The voltage scaling allows optimizing the power consumption when the device is
    . W6 A" I" m9 s# q. C9 @) |* t$ n, z
  134.      clocked below the maximum system frequency, to update the voltage scaling value 3 W" `  }9 z4 W8 i. x- p& O8 E
  135.      regarding system frequency refer to product datasheet.  */
    ' b* I: p& }% Y
  136.   __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
    : z) q, P- I9 ?6 o. K6 T
  137. * d4 ~" c$ ^) A7 t
  138.   /* Enable HSE Oscillator and activate PLL with HSE as source */
      A8 ]: t8 d3 V6 m5 v
  139.   RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
    ' |) h7 ]$ z/ u% b
  140.   RCC_OscInitStruct.HSEState = RCC_HSE_ON;
    7 W$ M: X% L7 m( j1 q; C
  141.   RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;/ h, t7 j1 x5 C+ K2 H5 O- k8 m
  142.   RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;6 M5 F: i3 C$ t6 n8 C
  143.   RCC_OscInitStruct.PLL.PLLM = 8;
    ! b( O' R0 _" J* m; X* n
  144.   RCC_OscInitStruct.PLL.PLLN = 336;! \9 }5 A' e, g$ ~
  145.   RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
    3 {" ~5 n" ^5 e; B' D! @
  146.   RCC_OscInitStruct.PLL.PLLQ = 7;
    ) {( p1 X3 u* B: `
  147.   HAL_RCC_OscConfig(&RCC_OscInitStruct);
    + s# k3 G, D$ p/ M* ~3 B
  148.   
    * ?# Z8 d" n' Y! X5 j2 P, v2 @
  149.   /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2
      a4 u2 P" h8 b/ |4 `
  150.      clocks dividers */  [: h- e7 Y2 f: v8 u% B$ |
  151.   RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);
    1 R. H4 N* S6 y2 g
  152.   RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;4 |! i9 R5 K# G
  153.   RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;+ G: _( d: m6 ]- e
  154.   RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;  
    1 R1 ?. U; ]3 k8 r1 i- u
  155.   RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;  
    ; h: j; k+ X2 h8 I& h  Y
  156.   HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5);
    ' N2 z7 U( a1 s
  157. # W3 q4 i, R# u
  158.   /* STM32F405x/407x/415x/417x Revision Z devices: prefetch is supported  */- \3 J3 c% M2 m3 h6 N" X; n" T8 x
  159.   if (HAL_GetREVID() == 0x1001)- z# j4 J) Y$ b
  160.   {
    # S* z* c, y/ q3 r+ b- g  K
  161.     /* Enable the Flash prefetch */( o/ N% a& |' I
  162.     __HAL_FLASH_PREFETCH_BUFFER_ENABLE();
    2 n" K1 v% t3 B* V: a% K( q3 j
  163.   }
    9 H/ C. ^. M8 c
  164. }
    3 b* @; w, W& J* X" Q
复制代码

  k6 {) m) q: i$ B6 t3 f) M归档链接
( S: G; h2 ~' J5 ?0 pARM CMSIS Driver 学习 之 SPI
" C% }3 c& L+ T% A, M* j' B/ w) o* ?! s: \( R
赞 收藏 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
$ g+ ], x$ K  h  p; D: UCMSIS_Driver 还真没见过之前

) Y; q% v! A/ N. K) I% Z7 x这个出来有几年了,只不过之前没有现在全,现在可以用到项目里了,底层驱动 ARM 已经实现了跨平台,之后产品换 MCU 也比较方便。
黑皮男 回答时间:2018-4-6 21:43:04
XinLiYF 发表于 2018-4-6 21:18
( o2 e# v7 U1 U这个出来有几年了,只不过之前没有现在全,现在可以用到项目里了,底层驱动 ARM 已经实现了跨平台,之后 ...
7 E4 D' W6 c$ W3 b5 [/ I
这个趋势很好啊,避免碎片化,抽空看看
XinLiYF 回答时间:2018-4-7 08:17:15
黑皮男 发表于 2018-4-6 21:43% A* {$ s9 i4 i1 c6 C
这个趋势很好啊,避免碎片化,抽空看看

+ q: L" o- M7 p, L1 H是啊,MCU 开发就是缺少这样大一统的框架啊
x5y4z3 回答时间:2018-4-7 13:48:47
这 CMSIS 的 UART 驱动以前还真没见过,谢谢楼主的告知,赶紧来试试学习一下。
- v5 L6 |& }  u, L+ L) V- }
zero99 回答时间:2018-4-17 14:47:42
感谢分享,请汇总到4月技术原创2 X: ?, U/ ?  v4 }2 }2 k6 J1 n7 B
https://www.stmcu.org.cn/module/forum/thread-615497-1-1.html
wlx583193113 回答时间:2020-9-16 16:07:23
int main(void)) s) j5 ]* Q) @* x& Q$ I* u/ X
{
6 Z; ~$ e5 b0 u' v: P6 E$ v8 R5 ]  T//        UART1_Comm_Init(115200);# a9 L' i4 o5 l. i
        UART2_Comm_Init(9600);# E5 a/ Y0 _$ r+ z
        ( |0 ?4 l$ E0 T
        Driver_USART2.Send("http://www.cmsoft.cn", sizeof("http://www.cmsoft.cn"));4 l8 i, x+ M6 y; p
        while(1);
8 h! W( K! O3 b3 t6 i}
' H, g5 K  O+ V3 [  k程序运行到Driver_USART2.Send就卡在这一行 无法运行到while那里   同时发送的内容也没发出去
; F& w7 A" [; R" w: Q不知道咋回事????
wlx583193113 回答时间:2020-9-16 16:08:39
void USART2_Callback(uint32_t event)- @' `; \9 X: [2 ^2 w
{% e! a6 s" a  [  t& C3 M% w
  if(event & ARM_USART_EVENT_RX_TIMEOUT)
) U$ x+ n7 V3 N+ t4 U4 ^  l  {
8 y' T( h9 L4 ~8 f, D. B8 h    Driver_USART2.Control(ARM_USART_ABORT_RECEIVE, 1);( ^% M- C, D; b$ d7 @- V
   
+ u/ y& Q2 w( V8 \+ c" m0 h) R! I- Z    uint32_t length = Driver_USART2.GetRxCount();; R4 I2 [$ S9 h
   ; a% S( [4 z1 i7 A2 U
//    memcpy(txBuffer, rxBuffer, length);
% X9 }# V- r2 @, c//   0 H6 E2 Y0 Q0 W1 x; A) {, q
//    Driver_USART1.Send(txBuffer, length);
. p% n! e+ B7 z  p* V+ V# a" R    Driver_USART2.Receive(USART2_RxBfr, sizeof(USART2_RxBfr));& R- l7 `! k0 z$ }8 s& l% J
  }       
5 r5 h; l+ O) y2 y7 {        else if(event & ARM_USART_EVENT_SEND_COMPLETE)0 P4 {' z4 o% `  n! p* x2 F/ j
        {9 h* ^; V2 B, S% L
                __NOP();. G0 K5 ^9 G4 q& y6 N
        }" x9 H) O6 h7 z% g
        else if(event & ARM_USART_EVENT_RECEIVE_COMPLETE)
, u& B& s8 Y! H: F        {& z' y$ E, J: j7 {8 ?& Q9 _
                __NOP();! s4 ^, s: e! q
        }- W4 h$ S. F5 o( j
}
3 l# y  q2 R9 V6 N从电脑端的串口工具发送内容  也没产生串口回调事件   不知道咋回事?????
wlx583193113 回答时间:2020-9-16 16:09:14
void UART2_Comm_Init(uint32_t Brate)/ g9 c& A# {8 d9 }5 x. b/ g% u
{//usb
; }$ A9 d/ x0 {* y' L1 M: v+ S4 A" Y4 Z% m! t. u# X4 u6 L! P
        Driver_USART2.Initialize(USART2_Callback);
. h* U0 ]! s( o. Q        Driver_USART2.PowerControl(ARM_POWER_FULL);) {7 ^# v* t$ T( C" B
        Driver_USART2.Control(ARM_USART_MODE_ASYNCHRONOUS |
$ J  s7 d4 Q! g& N1 K+ K1 @                                                                                ARM_USART_DATA_BITS_8 |& @6 z* B& Q$ x5 p2 i
                          ARM_USART_PARITY_NONE |
% j' W# ^3 o# G8 |  r. P5 K                          ARM_USART_STOP_BITS_1 |! l" M  ^: n  |4 X; F! M5 y: v2 f" S
                          ARM_USART_FLOW_CONTROL_NONE, Brate
+ o8 i3 J! J5 o' g' T; [                         );$ I$ u' N/ e; s/ X* B
        /* Enable Receiver and Transmitter lines */- f. I: m1 _5 o3 D$ j
        Driver_USART2.Control(ARM_USART_CONTROL_TX, 1);* r! a6 o/ U1 Y8 a. H# g5 K4 u
        Driver_USART2.Control(ARM_USART_CONTROL_RX, 1);+ `( _/ N, @% `: P
        /* Begin to receive */' N& f# Z1 B+ A. W, \& U
        Driver_USART2.Receive(USART2_RxBfr, sizeof(USART2_RxBfr));. S7 g/ E( ^/ W6 k) _
}" w( n& S' y, ?
这是串口初始化
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版