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

ARM CMSIS Driver 学习 之 USART

[复制链接]
XinLiYF 发布时间:2018-4-6 19:47
本帖最后由 XinLiYF 于 2018-4-14 18:02 编辑 + V6 [1 e  ^) d7 }! ]; _

" i" ^. V  C% J/ I: K- Q: F% L. ?
ARM CMSIS Driver 学习 之 USART
' I1 N3 z9 l1 t+ f9 }
/ T: m: ?9 s, X# e
       最近把 MDK 升级到了 V5.25 ,发现 Managing Run-Time Environment 中已经有好多好多的库。相比之前已经好了太多太多,从底层驱动,到上层协议栈,常用的有不常用的也有。发现 ARM 对这套系统的更新速度加快了一些,觉得有必要学习一下。从驱动开始学起,先学 USART API 详细介绍见 CMSIS Driver USART API
* Y9 t" O. \% |( _& x  _4 `1 I2 K6 V2 M2 ]
USART 把收到的数据再发出去程序* o4 {, `& \1 m6 I+ q
  1. /**# T, j* y( A; _' `8 N, w
  2.   ******************************************************************************: p5 _" {" `1 s, w3 X7 Y
  3.   * @file    main.c2 i9 t9 s7 v! z/ a' Z& n
  4.   * @author  XinLi
    % P0 v2 B9 J- t6 r6 N8 R
  5.   * @version v1.0$ H9 t, x  P3 V7 z* n6 Z
  6.   * @date    20-March-2018
    7 E5 y0 S7 C# k$ f: a! @+ P
  7.   * @brief   Main program body.1 b3 @) G, E0 @6 T$ j1 p5 E
  8.   ******************************************************************************: @* W4 P9 s" f; g2 b
  9.   * @attention9 y+ B/ `! X# _9 L2 D
  10.   *. u- e" D" ~( `  Q8 z
  11.   * <h2><center>Copyright © 2018 XinLi</center></h2>7 x& P, g# ?& m0 x4 Q* Y
  12.   *% c9 f( D( N+ }- v+ F
  13.   * This program is free software: you can redistribute it and/or modify
    $ x% |) U6 r. u) K0 s! x8 P
  14.   * it under the terms of the GNU General Public License as published by
    # b* e/ h- T5 s1 z
  15.   * the Free Software Foundation, either version 3 of the License, or" ]" q; M* n. ~  @7 B
  16.   * (at your option) any later version.0 R- k% H1 M: z9 Q
  17.   *5 I  `2 Y5 j! F7 ^; P' ^1 z) N
  18.   * This program is distributed in the hope that it will be useful,4 o+ ]: N  y; |( r
  19.   * but WITHOUT ANY WARRANTY; without even the implied warranty of
    / [9 d* ~4 |1 s: T: @
  20.   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the4 D; q/ ~& ^! L" c5 ]  B2 V
  21.   * GNU General Public License for more details.6 M7 {6 V' p9 a- U' [4 ]" C4 z
  22.   *
    ; b/ S) o6 ]3 ?" F7 @
  23.   * You should have received a copy of the GNU General Public License2 z/ u" ?, L: F
  24.   * along with this program.  If not, see <http://www.gnu.org/licenses/>.
    + F- i( B7 J2 h
  25.   *6 t9 x; C5 p; r/ `; O) ?
  26.   ******************************************************************************- n; V; A0 g: |# U1 L( j
  27.   */3 B' x8 ~! A1 N- W- C

  28. # \- G9 Y! n% {0 k& p( w& d
  29. /* Header includes -----------------------------------------------------------*/
    2 C7 H; E- A6 d
  30. #include "stm32f4xx.h"6 M- m0 J0 G% c) _% j# e" \
  31. #include "Driver_USART.h"' n; U0 W; I# Q- C% ~5 Q7 L4 ]
  32. #include <string.h>
    4 L. D* G# @5 x6 B2 z

  33. ! S; l4 d( h5 Z2 N/ ^8 _. O1 V
  34. /* Macro definitions ---------------------------------------------------------*/
    7 O6 B5 ]# L! B& g$ h- e4 x7 L
  35. /* Type definitions ----------------------------------------------------------*// s% S& G( e7 h6 F' [
  36. /* Variable declarations -----------------------------------------------------*/+ g$ f: x) L4 S! A% @
  37. extern ARM_DRIVER_USART Driver_USART1;( N# v2 v9 h8 {; f! ~( e
  38. 9 i3 e4 p9 ~% z# @+ ^$ G
  39. /* Variable definitions ------------------------------------------------------*/+ n& V6 V# c9 A) a
  40. static uint8_t rxBuffer[1024] = {0};  U+ C& a' H/ L$ m# c. h7 c
  41. static uint8_t txBuffer[1024] = {0};- E' A3 ^) l0 F! f* g. c7 h* \

  42. ) H+ \( W" G7 X( u
  43. /* Function declarations -----------------------------------------------------*/  z* r" U& t$ R/ g7 S& D" j
  44. static void USART1_Callback(uint32_t event);+ D8 w0 r* X& C
  45. static void SystemClock_Config(void);
    + [! `6 S6 F* `8 E8 A

  46. , K1 h# n$ m6 M) a5 G% n' Q
  47. /* Function definitions ------------------------------------------------------*/
    7 v8 G- W- Y: B# u$ i

  48. " o* K9 V3 T3 w4 R! |9 x
  49. /**! _% c0 W  B; ~2 ?
  50.   * @brief  Main program.
    ( e0 n( @2 \2 D9 S2 _+ W! w% Y
  51.   * @param  None.
    + d5 |0 M5 D, i/ k0 a. ?' r0 C6 F
  52.   * @return None.$ y, t4 a+ i8 M; X7 @) x6 R
  53.   */
    4 R: _" _9 O! D8 Z4 [8 e% A! U' U
  54. int main(void)
    . M! r/ a: Z- G& Z- H" C& b4 L; L
  55. {2 G6 f4 j+ d( B6 c+ G
  56.   /* STM32F4xx HAL library initialization:
    $ t# {8 v0 ]) V; q. y% q2 A' |
  57.        - Configure the Flash prefetch, instruction and Data caches: ^  d' G5 o+ M5 N* w/ Q* m
  58.        - Configure the Systick to generate an interrupt each 1 msec# Z+ C& J8 F% A1 b: N9 ^
  59.        - Set NVIC Group Priority to 4
    8 j3 b4 D: ?) _- a6 \7 |9 W6 ]" m
  60.        - Global MSP (MCU Support Package) initialization8 U/ f7 J7 v* S, v( h2 T9 a1 [5 R; g
  61.      */
    ! |% W. Q3 P+ A7 j
  62.   HAL_Init();! M0 r6 z5 M0 v% g3 G) B. r
  63.   
    / @! L" s/ C( i8 h9 K2 ?* B
  64.   /* Configure the system clock to 168 MHz */
    9 Q/ U+ t7 E' Z: a9 }
  65.   SystemClock_Config();
    - s! o* j& b- ~, T. ~4 Q
  66.   3 T2 e: [) \% a
  67.   Driver_USART1.Initialize(USART1_Callback);+ f2 i( c9 I; h" @( Q# y7 O4 l/ @
  68.   Driver_USART1.PowerControl(ARM_POWER_FULL);
    ! v+ N2 R$ p1 x) s7 A9 q
  69.   Driver_USART1.Control(ARM_USART_MODE_ASYNCHRONOUS |
    : o" C/ J+ K5 i- q3 @. m3 i
  70.                         ARM_USART_DATA_BITS_8 |& z$ }( V( N% E8 l
  71.                         ARM_USART_PARITY_NONE |( U1 ^" z$ F0 w% k
  72.                         ARM_USART_STOP_BITS_1 |
    : P' L; l  G0 a; D6 @0 D) ~2 t3 _
  73.                         ARM_USART_FLOW_CONTROL_NONE, 115200);8 G1 r/ X/ S* `2 O
  74.   Driver_USART1.Control(ARM_USART_CONTROL_TX, 1);
    8 U+ \7 m0 c# |" T
  75.   Driver_USART1.Control(ARM_USART_CONTROL_RX, 1);; M8 V" L, C9 X& P
  76.   * ]- n1 ?% m; S" h
  77.   Driver_USART1.Receive(rxBuffer, sizeof(rxBuffer));
    . _6 Y6 }) J2 @6 c
  78.   ! ?  W# m( r. n1 d- E3 P2 T4 r
  79.   for(;;)6 Q7 u" [$ M5 C  z) Q
  80.   {
    9 k$ F) h5 X$ s/ p* v
  81.     7 y, m! T  K/ k1 |/ `& L2 B
  82.   }2 @0 J$ n. I" A: M
  83. }8 ^% X7 A: s" m+ \

  84. # [# n" s+ J( }  y8 Z3 F' o" P4 K3 {
  85. /**
    4 F4 B; @$ @  i% }
  86.   * @brief  USART1 callback function./ j, V0 U2 t% @' @* B2 I
  87.   * @param  event: USART events notification mask.
    4 p- i; G2 D" H
  88.   * @return None.
      C# [3 A' ~! i$ N
  89.   */3 D8 ?! P8 C" I+ h
  90. static void USART1_Callback(uint32_t event)
    & ~: U% D2 Y& e6 T
  91. {3 Y) y& r( A$ I4 A4 o+ c
  92.   if(event & ARM_USART_EVENT_RX_TIMEOUT)  q2 n& a4 E8 Z5 e
  93.   {
    : ^) ^& Y6 I) d$ W* \; Q. X) m
  94.     Driver_USART1.Control(ARM_USART_ABORT_RECEIVE, 1);
    9 Q/ i( P- i1 Y' v' U; [8 S( [
  95.    
    - h5 }, a& m) g
  96.     uint32_t length = Driver_USART1.GetRxCount();
    / U( m- ]' W7 ]7 X! y( f! q
  97.    
    9 S- i* Z; [2 t0 I  `
  98.     memcpy(txBuffer, rxBuffer, length);
    / x* P: s$ _0 p
  99.    
    * ?& \# D& e  f4 t. e* M! O
  100.     Driver_USART1.Send(txBuffer, length);& _0 O5 B3 @. D2 B( N
  101.     Driver_USART1.Receive(rxBuffer, sizeof(rxBuffer));; r3 y3 ?- p: b2 q' m
  102.   }3 K+ G  V) Y! l# `4 W# L5 G: c
  103. }/ z$ Z) L3 x$ `/ S0 b
  104. ) f5 U) G+ S8 d2 u( X2 ~$ z8 M
  105. /**( j$ s/ N( x7 [7 f9 l- I  I
  106.   * @brief  System Clock Configuration
    ' n, {! w2 d1 s/ w  c1 n0 a
  107.   *         The system Clock is configured as follow : & I* W/ h5 C& V. Q
  108.   *            System Clock source            = PLL (HSE)# q/ I6 G, |2 m+ N+ M
  109.   *            SYSCLK(Hz)                     = 168000000' w8 N5 |# [9 c. U* o; z- I& G
  110.   *            HCLK(Hz)                       = 168000000$ m8 f: S& o8 @0 H0 Z! ?& Y+ w8 ?8 J
  111.   *            AHB Prescaler                  = 1
    % E+ @; x" b/ c$ V
  112.   *            APB1 Prescaler                 = 4
    3 f( m2 X. a! w* z- x# g
  113.   *            APB2 Prescaler                 = 29 v* f2 h0 {7 s
  114.   *            HSE Frequency(Hz)              = 8000000' R) p6 x0 D) j  v7 d1 ^
  115.   *            PLL_M                          = 8
    7 q& [, N' Y- R
  116.   *            PLL_N                          = 3368 D: T# o3 x, q1 l2 b" j+ k
  117.   *            PLL_P                          = 2; Q0 E) H8 F; i9 X5 Z; W- h
  118.   *            PLL_Q                          = 7
    0 ]& X' G" v+ ^% n. F6 U7 j
  119.   *            VDD(V)                         = 3.3
    8 V% H+ q2 K! N* w( z
  120.   *            Main regulator output voltage  = Scale1 mode
    7 X4 Y1 o1 {/ J+ |; Q7 M0 y( v
  121.   *            Flash Latency(WS)              = 5
    - K3 D/ ?' l: `" R2 X5 t7 b7 ^
  122.   * @param  None
    9 I6 X2 y5 u) k6 k
  123.   * @retval None' c+ A+ K# K1 W
  124.   */
    3 c5 s3 i: I& Z$ _
  125. static void SystemClock_Config(void)/ A5 j- c* y/ d5 {
  126. {2 y' g! ^' s" F/ e3 {+ z6 q
  127.   RCC_ClkInitTypeDef RCC_ClkInitStruct;
    & c4 c; Y" l0 {' ^5 S; i
  128.   RCC_OscInitTypeDef RCC_OscInitStruct;
    $ F$ l8 e: A9 o& e) v8 H2 B

  129. 8 q* y2 u# j' U( u1 W- @. A
  130.   /* Enable Power Control clock */) y! j0 C3 Z5 I( H
  131.   __HAL_RCC_PWR_CLK_ENABLE();7 o' S( J; M9 z. u: S* p6 B4 r
  132. 9 }7 _, l0 ?; M% P
  133.   /* The voltage scaling allows optimizing the power consumption when the device is
    # A  y0 Q5 M1 L0 z. R5 U. ^
  134.      clocked below the maximum system frequency, to update the voltage scaling value
    ! J6 n7 d* [- v. b- X! L' a
  135.      regarding system frequency refer to product datasheet.  */
    7 D& `8 g+ O. i
  136.   __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);2 Y, U! ?8 R5 E4 g2 Y
  137. , r# o  K* |* O! Y
  138.   /* Enable HSE Oscillator and activate PLL with HSE as source */
    / Q: L( k$ k9 I) Y7 R: \
  139.   RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;8 x3 i  M7 K4 z! |" M9 C; [
  140.   RCC_OscInitStruct.HSEState = RCC_HSE_ON;+ U/ l2 I% P7 Z: J
  141.   RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
    2 c- W4 i! J) X: z  c* P
  142.   RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
    1 L# l7 l( A8 p+ A2 Z
  143.   RCC_OscInitStruct.PLL.PLLM = 8;, ]/ d* U5 f9 E& W
  144.   RCC_OscInitStruct.PLL.PLLN = 336;
    3 k) R/ P* F, G
  145.   RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
    : _5 A. _7 |4 ^, R5 y
  146.   RCC_OscInitStruct.PLL.PLLQ = 7;, x2 f' Q, \* n
  147.   HAL_RCC_OscConfig(&RCC_OscInitStruct);
    5 y# d+ {3 o! n, ~+ \7 o9 N
  148.   
    # o, D2 d9 o- _; {2 y$ B
  149.   /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2 5 B5 ^0 P; n" ]3 R
  150.      clocks dividers */
    ' K% `4 _& X; @2 `! w5 V- R& C8 t
  151.   RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);
    0 m5 c' _5 d4 H( z; r7 w- i
  152.   RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;; ^/ `& _% m" D) z# n
  153.   RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
    3 Y8 j" X2 h3 E) u8 e/ n
  154.   RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;  & G1 C% |& _2 D( G" ^/ Q
  155.   RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;  
    1 @& O  c8 n5 T
  156.   HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5);0 }) c0 Q/ B+ M2 ~6 Q

  157. * J. @  a  p: p
  158.   /* STM32F405x/407x/415x/417x Revision Z devices: prefetch is supported  */
    ' T* J  l3 j$ M$ _8 C1 |& {9 z% |4 O
  159.   if (HAL_GetREVID() == 0x1001), w) `; y" H% `) u/ g2 @: X) r  J
  160.   {) Y  k( k! S. x5 ^; @
  161.     /* Enable the Flash prefetch */4 a9 d0 A" V7 c, {. G" u% _4 M* A
  162.     __HAL_FLASH_PREFETCH_BUFFER_ENABLE();
    0 y! ?4 u" \, E; w5 A8 o# g
  163.   }
    3 \% g' i. T9 ^6 F) F( b
  164. }, M& l3 l* |) J- |
复制代码

9 {) r) X9 y" H1 _, I归档链接
9 l" @1 a( T# |1 @6 Z' v# |0 XARM CMSIS Driver 学习 之 SPI
# s! I/ H7 G" f
  A& K5 M" Z! t9 n, o( X5 @& j
收藏 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:568 T, x& a( `7 h( I8 l
CMSIS_Driver 还真没见过之前

4 F7 k3 F6 V2 Y5 c- w: r  R这个出来有几年了,只不过之前没有现在全,现在可以用到项目里了,底层驱动 ARM 已经实现了跨平台,之后产品换 MCU 也比较方便。
黑皮男 回答时间:2018-4-6 21:43:04
XinLiYF 发表于 2018-4-6 21:18. X6 N; M7 ~% @* d: G* Q6 C
这个出来有几年了,只不过之前没有现在全,现在可以用到项目里了,底层驱动 ARM 已经实现了跨平台,之后 ...

& X+ J0 ?. R* Y" G" e这个趋势很好啊,避免碎片化,抽空看看
XinLiYF 回答时间:2018-4-7 08:17:15
黑皮男 发表于 2018-4-6 21:43
; S2 [, N/ Y' A( o这个趋势很好啊,避免碎片化,抽空看看
+ Z8 O, K# L1 {% n! q
是啊,MCU 开发就是缺少这样大一统的框架啊
x5y4z3 回答时间:2018-4-7 13:48:47
这 CMSIS 的 UART 驱动以前还真没见过,谢谢楼主的告知,赶紧来试试学习一下。
/ s0 U% N/ [$ ~
zero99 回答时间:2018-4-17 14:47:42
感谢分享,请汇总到4月技术原创
9 k3 V& t+ {1 B3 P3 G. Lhttps://www.stmcu.org.cn/module/forum/thread-615497-1-1.html
wlx583193113 回答时间:2020-9-16 16:07:23
int main(void)
2 U: T& K, S/ D" j% w{
: t- H7 a% {& W* Z7 i. }//        UART1_Comm_Init(115200);
/ {) a& Q" O' x& S! L# J        UART2_Comm_Init(9600);
0 C  \/ c3 z# Q       
( U- m' Q+ b% c: X        Driver_USART2.Send("http://www.cmsoft.cn", sizeof("http://www.cmsoft.cn"));
7 w: y6 W: ?. Z        while(1);% [0 f8 p0 d/ e) M. ]: o
}
( i2 j3 ^0 u. r; k$ L( j程序运行到Driver_USART2.Send就卡在这一行 无法运行到while那里   同时发送的内容也没发出去: |6 A4 c% D5 @( `1 h5 p+ i
不知道咋回事????
wlx583193113 回答时间:2020-9-16 16:08:39
void USART2_Callback(uint32_t event)
3 V1 O1 a- E4 r4 h& z{: F3 f7 Q4 a$ s8 j6 Z
  if(event & ARM_USART_EVENT_RX_TIMEOUT)
% t9 v- |& Z$ D, e9 W( ^0 c* M" \  {  v  K5 T0 `: ~, z
    Driver_USART2.Control(ARM_USART_ABORT_RECEIVE, 1);
: k/ Y. X$ g4 F, Q( `2 I' C   3 B: U: ~2 J0 W3 A- {- g  W) u
    uint32_t length = Driver_USART2.GetRxCount();
& R; x' n7 n% r5 ?5 Y5 n2 {   ) `  S) O/ o3 C' a
//    memcpy(txBuffer, rxBuffer, length);
. l! H2 d! p. q0 G//   
4 J- \" M9 q* \. e8 E//    Driver_USART1.Send(txBuffer, length);# X! F- B; N3 M/ Q0 |0 C
    Driver_USART2.Receive(USART2_RxBfr, sizeof(USART2_RxBfr));0 {9 C! M& w+ T$ m/ b
  }        6 t! J6 j0 z3 K. U+ [: ~
        else if(event & ARM_USART_EVENT_SEND_COMPLETE)
" U& E5 p; S' W3 Q' {& q/ w7 R* z        {
: O# P, T* }/ O: ]/ p                __NOP();
' X, A4 n) Q  b5 p8 j        }6 r/ X' P# _0 P, F) p& O6 J
        else if(event & ARM_USART_EVENT_RECEIVE_COMPLETE)
7 O! o  `6 R( F        {. ]% G) @3 A5 F3 k
                __NOP();' z9 P+ R: C4 ]( {! R: y  |# l: @
        }# a& W/ M! Z# m) C4 p9 @1 i* K
}
% `  Y/ j1 b, k+ r/ D& v从电脑端的串口工具发送内容  也没产生串口回调事件   不知道咋回事?????
wlx583193113 回答时间:2020-9-16 16:09:14
void UART2_Comm_Init(uint32_t Brate)
4 d3 L- T; M5 n5 i" Q{//usb
# q9 C; _  ~9 Z3 g; ^0 `/ B- }" d! l, g
        Driver_USART2.Initialize(USART2_Callback);
4 F% R- I  r5 \5 Y$ Q. I        Driver_USART2.PowerControl(ARM_POWER_FULL);* b7 K: ^' h# r& k+ [: I. m1 B# b
        Driver_USART2.Control(ARM_USART_MODE_ASYNCHRONOUS |% `4 P' e% v$ r/ J5 s
                                                                                ARM_USART_DATA_BITS_8 |' e1 g4 |7 G  \. `- [3 n8 a
                          ARM_USART_PARITY_NONE |4 D% `* S1 @9 b9 L  n  A
                          ARM_USART_STOP_BITS_1 |6 l  }- D- e8 H3 F
                          ARM_USART_FLOW_CONTROL_NONE, Brate
, K; j' o6 j" n                         );
. ~' @  D7 ^5 i        /* Enable Receiver and Transmitter lines */
4 \- a& L" X  b% [% T' Y9 y2 z        Driver_USART2.Control(ARM_USART_CONTROL_TX, 1);
( B  v1 Z+ K# a2 _) Z        Driver_USART2.Control(ARM_USART_CONTROL_RX, 1);
# e" V' |! U- f5 _5 {: R* U( G        /* Begin to receive */" P9 T7 n6 p' U- l8 j4 F9 y
        Driver_USART2.Receive(USART2_RxBfr, sizeof(USART2_RxBfr));
& g$ L/ Y. X9 M+ @8 X* T6 O}
( c; ]0 l0 a1 S5 Q& Q* p$ p# N6 `这是串口初始化

所属标签

相似分享

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版