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

ARM CMSIS Driver 学习 之 USART

[复制链接]
XinLiYF 发布时间:2018-4-6 19:47
本帖最后由 XinLiYF 于 2018-4-14 18:02 编辑 # e3 P8 r8 g) k; M! q

7 U% V' e/ U! {% j
ARM CMSIS Driver 学习 之 USART
( s- r! ?, ^8 {0 T  L
& P& f. S" d$ J& `1 C
       最近把 MDK 升级到了 V5.25 ,发现 Managing Run-Time Environment 中已经有好多好多的库。相比之前已经好了太多太多,从底层驱动,到上层协议栈,常用的有不常用的也有。发现 ARM 对这套系统的更新速度加快了一些,觉得有必要学习一下。从驱动开始学起,先学 USART API 详细介绍见 CMSIS Driver USART API, S* y' B& q+ c5 f; T
1 D) `1 K) K% v1 D  N9 [8 u
USART 把收到的数据再发出去程序, b2 X) n+ }8 Y
  1. /**" j2 y  H' K0 X* Y2 z
  2.   ******************************************************************************
    4 b& Z2 r. K5 @. g, V  [. V! ]: N
  3.   * @file    main.c
    : e  ]& t" c4 n; l4 E" l/ i
  4.   * @author  XinLi
    / O: b& d( g$ |2 p% L4 Z' O
  5.   * @version v1.0
    9 B5 x% V- n$ {0 N8 @
  6.   * @date    20-March-2018
    7 R* @* f! d+ k4 U( t/ Q  X3 U6 E
  7.   * @brief   Main program body." V+ n3 E$ y: L" {1 r. {
  8.   ******************************************************************************0 `6 j# t& e9 l! H  E* M
  9.   * @attention
    + T. |! f& }. y# |& m
  10.   *! z7 t( X/ P4 U
  11.   * <h2><center>Copyright © 2018 XinLi</center></h2>
    ( s  G$ P! Y8 e% g3 e5 B# y$ @
  12.   *
    ! A- e- }3 e- R' k
  13.   * This program is free software: you can redistribute it and/or modify) \+ a; o( D  h
  14.   * it under the terms of the GNU General Public License as published by
    0 E- F( E( I8 x) S
  15.   * the Free Software Foundation, either version 3 of the License, or  N+ @% I9 T! i, d& G
  16.   * (at your option) any later version.
    ! o, l& J1 E- n) }0 Y1 c  }/ @
  17.   *7 a4 [$ Y6 ~" t
  18.   * This program is distributed in the hope that it will be useful,3 n8 G* [# J% Z" ^& a8 \! {
  19.   * but WITHOUT ANY WARRANTY; without even the implied warranty of
    ) z4 x; x# d/ I1 L7 B# [4 \
  20.   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    0 w6 Z: T0 ?& `5 c! k5 X+ \4 {
  21.   * GNU General Public License for more details.! B- t6 [5 j) \5 Z
  22.   *0 d) v& Y5 _5 o  \
  23.   * You should have received a copy of the GNU General Public License
    ! r: y# L8 m3 [& v/ G/ _  c& w
  24.   * along with this program.  If not, see <http://www.gnu.org/licenses/>.
    4 d- |% Y2 w+ j/ \; R8 e
  25.   *
    $ Q, G3 G+ m- z$ z
  26.   ******************************************************************************
    # W# [9 p/ b9 s% y$ [
  27.   */3 ~9 W) \; @' n3 w! j0 M6 I
  28. : B" u$ c/ C3 Y$ w
  29. /* Header includes -----------------------------------------------------------*/
    ' u2 ]+ Q: D* r$ Z# i9 J' {' K& q! G
  30. #include "stm32f4xx.h": ]' z" L- `: z+ h; p- L4 }! V
  31. #include "Driver_USART.h"3 y8 h" ^7 U5 m, s; l
  32. #include <string.h>
    ; B( t5 U: v/ I9 V& }

  33. 9 K7 R% j6 V8 f
  34. /* Macro definitions ---------------------------------------------------------*/: u- x' {8 ]8 I- v/ a
  35. /* Type definitions ----------------------------------------------------------*/: g% m. l- X6 l% a  Y& Z4 s
  36. /* Variable declarations -----------------------------------------------------*/
    2 Y6 y' A  [; g; G. x8 X
  37. extern ARM_DRIVER_USART Driver_USART1;
    ( u4 X6 N7 j; e# Q+ r/ f
  38. + j2 _9 P, ]9 t, W; I" |9 ]2 {
  39. /* Variable definitions ------------------------------------------------------*/
    5 j1 ~8 d3 ?9 V* v1 G1 i
  40. static uint8_t rxBuffer[1024] = {0};
    1 m4 D: R- l) g1 o, c
  41. static uint8_t txBuffer[1024] = {0};
    - f& Q5 G" u5 g, F% N' M9 Q: ~% S

  42. 7 j" g- i9 ~4 h) b' C
  43. /* Function declarations -----------------------------------------------------*/
    & {) V# N5 K# F' M2 q
  44. static void USART1_Callback(uint32_t event);: W5 E' G3 j! O" M. A, b
  45. static void SystemClock_Config(void);* p! V& e  e( O9 `1 N

  46. ) m$ H, F% F) R  S6 x! S$ A7 x$ N
  47. /* Function definitions ------------------------------------------------------*/. m/ K8 s4 e1 F2 j2 [* t
  48. 7 J- u' P( H' N2 D5 A7 s
  49. /**
    - r! c) g- U# J6 ~0 l7 M/ H8 e
  50.   * @brief  Main program.* u: i5 y* c$ R3 x
  51.   * @param  None.
    ) [0 }1 h/ }- m3 T" c7 ~8 Z) b
  52.   * @return None.
    , C9 u1 O: Y9 o! I+ _9 c0 C: A
  53.   */( N- r/ y4 M. b; B. [' B4 v
  54. int main(void)9 s& F/ o( m) V6 T
  55. {( y; ?# {9 H2 X" f
  56.   /* STM32F4xx HAL library initialization:2 ?% r# L; T! D6 n; \8 J6 B. I
  57.        - Configure the Flash prefetch, instruction and Data caches
    ! E+ ^0 I( A) Y/ e  _% P9 W2 N
  58.        - Configure the Systick to generate an interrupt each 1 msec
    . A9 |/ Y* H. Q0 J, f- x3 y
  59.        - Set NVIC Group Priority to 4$ h0 l* a: t6 E- u4 O! F6 _
  60.        - Global MSP (MCU Support Package) initialization
    ' Q: t: e* f7 V2 \
  61.      */
    , m# `+ ^8 B. D) Q6 m+ F, m
  62.   HAL_Init();8 @, e3 I+ V& D- {- q9 J
  63.   
    5 h  \; m. O: Z. ?
  64.   /* Configure the system clock to 168 MHz */
    6 v  o8 f' ]# n0 q
  65.   SystemClock_Config();! y5 s" d: i- A; q; J
  66.   5 l. a# \1 V% D" ^, w! ?6 i
  67.   Driver_USART1.Initialize(USART1_Callback);& q" ~9 X5 M- M3 u
  68.   Driver_USART1.PowerControl(ARM_POWER_FULL);" V5 ^5 v. L1 _3 Y( c* D" o* T
  69.   Driver_USART1.Control(ARM_USART_MODE_ASYNCHRONOUS |  s7 r: ^. r% b1 L6 d7 S
  70.                         ARM_USART_DATA_BITS_8 |
    : ?2 C& _' A* ^# p8 s4 V
  71.                         ARM_USART_PARITY_NONE |
    , S) ^1 h0 ^+ B# ]* u
  72.                         ARM_USART_STOP_BITS_1 |5 l0 O- j) a. h* y1 J
  73.                         ARM_USART_FLOW_CONTROL_NONE, 115200);
    4 G5 }+ m6 G9 g- B  e/ ^4 K
  74.   Driver_USART1.Control(ARM_USART_CONTROL_TX, 1);
    & ~5 q& [/ [+ z" u
  75.   Driver_USART1.Control(ARM_USART_CONTROL_RX, 1);6 @! P3 k  I* X9 r3 f! A0 W
  76.   
    1 w2 C$ u7 d+ h  [
  77.   Driver_USART1.Receive(rxBuffer, sizeof(rxBuffer));* ^# Y: \# n. A% u) c
  78.   
    + C. f9 Q) Y" G' W1 O
  79.   for(;;)1 [, J- {$ U* r$ N) l1 n3 R
  80.   {4 d' D$ T' Y8 x7 p7 S$ k8 p
  81.    
    - r; y) q' E0 P/ r% T* J* }7 o
  82.   }
    + }. X, u6 k: g% j
  83. }
    * n5 A" x3 ]: X8 b3 f
  84. 2 ~0 z6 w' P) p3 s& Q1 o. i* c8 T
  85. /**: J, q8 G% B6 a0 ]  s
  86.   * @brief  USART1 callback function.
    2 q9 G0 R1 `+ [! a) _4 Q
  87.   * @param  event: USART events notification mask.5 |8 I- b+ S' V: \9 O* i3 ^
  88.   * @return None.
    % @+ v, F2 L& Z9 M; ?! z9 V
  89.   */' s; W+ J( Q+ H+ `1 M! ?4 g
  90. static void USART1_Callback(uint32_t event)
    / ]- H, W; h& ]9 `6 W6 T5 r
  91. {+ G% W& D1 A1 M( U& L
  92.   if(event & ARM_USART_EVENT_RX_TIMEOUT)0 l6 F6 }" w0 w) t- j; h" ~
  93.   {
    - H. h( h0 q( d. \. ?4 d. |1 j& l
  94.     Driver_USART1.Control(ARM_USART_ABORT_RECEIVE, 1);
    , q  B3 m$ q! N( O: ~: ^* k" v$ C
  95.     ' m" T3 \& G/ c3 _& {
  96.     uint32_t length = Driver_USART1.GetRxCount();
    . s' R" j& P) `& ]/ N: {5 z0 S
  97.    
    + y5 M, K9 s9 v
  98.     memcpy(txBuffer, rxBuffer, length);# z8 Y1 T! t" s4 Y2 x5 c6 P
  99.     . q7 F% P7 [- k# i
  100.     Driver_USART1.Send(txBuffer, length);: k4 N& i  Q/ P" S
  101.     Driver_USART1.Receive(rxBuffer, sizeof(rxBuffer));
    7 |, q% P; \! E4 S2 ^' ]5 w+ v$ y
  102.   }
    + B/ M) P9 n0 V  m; ?6 v. O
  103. }, {- g% R! m5 K
  104. 3 w1 R% b2 `) `; Q+ L
  105. /**: ?( k% |# z. K6 J' w% X
  106.   * @brief  System Clock Configuration
    1 w9 f$ e. {' q' @& @
  107.   *         The system Clock is configured as follow : . F3 P# T9 q' B! C8 @: e, `
  108.   *            System Clock source            = PLL (HSE)
    5 H2 F  V6 |8 Y2 b$ k
  109.   *            SYSCLK(Hz)                     = 168000000% V$ _7 l+ r3 a, }7 V* ?7 F& [  w
  110.   *            HCLK(Hz)                       = 1680000008 r( O( H7 @, ~  H: O2 N
  111.   *            AHB Prescaler                  = 1
    & K- k0 A$ n( {+ N. d8 p+ K( n8 k
  112.   *            APB1 Prescaler                 = 44 d9 I8 M3 u6 ^
  113.   *            APB2 Prescaler                 = 2
    ; w1 p+ `+ z9 u3 @% L0 c+ b
  114.   *            HSE Frequency(Hz)              = 8000000" Y' ]9 O7 Q) X9 T1 g
  115.   *            PLL_M                          = 8
    - i) i) k- \8 s3 Q" l
  116.   *            PLL_N                          = 336
      p4 I3 _3 z# u# u, Y
  117.   *            PLL_P                          = 2
    ; b! w) ]' t6 _; L9 D: q9 l
  118.   *            PLL_Q                          = 7
    & i/ s, ~: X  ?& @, I! t, ]+ |% ]
  119.   *            VDD(V)                         = 3.3
    & R/ @* U. ?+ E+ m* Y3 L. A
  120.   *            Main regulator output voltage  = Scale1 mode
    ' K5 m6 U" T5 L% U( c2 o
  121.   *            Flash Latency(WS)              = 5; o; N/ h( K- O- `
  122.   * @param  None
    ! T9 H6 d" [4 P6 f! X+ J2 v
  123.   * @retval None
    ; _$ d0 d- R! A) I
  124.   */
    ! E! k5 ~+ _! K4 \3 S8 K
  125. static void SystemClock_Config(void)$ k* O8 J' O, m9 r8 C  P6 a; m
  126. {2 x# ^  v. _" _" r2 A; R
  127.   RCC_ClkInitTypeDef RCC_ClkInitStruct;% {% ]: c& l- z) |
  128.   RCC_OscInitTypeDef RCC_OscInitStruct;! K: x# A; \3 w  `

  129. % q' F; {" o; H* i4 `
  130.   /* Enable Power Control clock */
    $ P- G+ g$ x$ u2 a$ [/ @
  131.   __HAL_RCC_PWR_CLK_ENABLE();, l$ }( b  u' q

  132. 3 s0 V2 l* P& a9 k( t+ N" ]6 i
  133.   /* The voltage scaling allows optimizing the power consumption when the device is 9 {. k6 ]2 j6 P/ Y. w3 R
  134.      clocked below the maximum system frequency, to update the voltage scaling value
    7 Y+ n- k. o5 o3 {3 N; G
  135.      regarding system frequency refer to product datasheet.  */
    % W5 G. P, c) w  }
  136.   __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
    / N# s! ]' V1 A5 Z8 w7 z

  137.   u; S. g& h5 n; }" d
  138.   /* Enable HSE Oscillator and activate PLL with HSE as source */
    # u) _( z, k& @$ P" s
  139.   RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;& `5 Q/ S) e* i1 U5 g1 \
  140.   RCC_OscInitStruct.HSEState = RCC_HSE_ON;# i2 f# T/ D9 E. \' _+ ~7 s& t( i
  141.   RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;/ F' m9 I4 z' }
  142.   RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
    ( f' u* |% B4 C
  143.   RCC_OscInitStruct.PLL.PLLM = 8;& J6 Q" z+ L4 T1 v7 D4 q
  144.   RCC_OscInitStruct.PLL.PLLN = 336;( q9 K  V7 z- q5 p- h; T* d
  145.   RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;8 k6 q. j/ U6 ?9 e+ B2 x
  146.   RCC_OscInitStruct.PLL.PLLQ = 7;
    ) T9 Q7 Y4 I. T! Q1 y. r
  147.   HAL_RCC_OscConfig(&RCC_OscInitStruct);
    3 q  w1 L) o( O% W$ t/ A3 n, |
  148.   
    9 v) k, b8 v: e) F) Y- r. U& B
  149.   /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2 8 F. x3 ?* F% T  \7 |& u- a
  150.      clocks dividers */* Y( ]) Z( [( X8 D0 n
  151.   RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);/ J5 g5 R, Z3 s% G& l- i
  152.   RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;* }- \0 L' P0 T6 H
  153.   RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;; V& |" F; n) X3 c! \. @3 R: ?
  154.   RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;  
    5 h: h/ O  F; R# b
  155.   RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;  1 _- `- l2 B6 q$ D3 D1 ^
  156.   HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5);' Y# Z& `7 \6 A/ O8 d( s0 O. s5 B0 p

  157. 4 J0 V  M* u1 c6 I8 `
  158.   /* STM32F405x/407x/415x/417x Revision Z devices: prefetch is supported  */" _( R3 V1 ]  g- g! O0 I% ?" j
  159.   if (HAL_GetREVID() == 0x1001)* e( B# r5 R- q* o/ ?! f" l7 K$ n0 o
  160.   {
    3 m: N  A0 D+ w6 _6 E; Y
  161.     /* Enable the Flash prefetch */$ `4 R; ?8 {0 I3 _5 Y6 Y/ f
  162.     __HAL_FLASH_PREFETCH_BUFFER_ENABLE();. S& x( v, u0 l
  163.   }
    ) l  N- K: A/ g4 h
  164. }
    & F3 D5 `( J- J: y: B2 k: C
复制代码
; ]0 t- E/ G( d, I
归档链接
( k2 y& {! `" @ARM CMSIS Driver 学习 之 SPI
6 [( i" V9 N. |1 ?/ G
7 Y2 F$ o4 R3 S* F  r: ^) j( ?* x
收藏 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
6 M% h) p7 }9 [' v- DCMSIS_Driver 还真没见过之前

* U. a& i8 J1 t# {( @9 w5 O% t# ]这个出来有几年了,只不过之前没有现在全,现在可以用到项目里了,底层驱动 ARM 已经实现了跨平台,之后产品换 MCU 也比较方便。
黑皮男 回答时间:2018-4-6 21:43:04
XinLiYF 发表于 2018-4-6 21:184 Z; k. ~/ W, K" R' B+ `+ L6 r( @
这个出来有几年了,只不过之前没有现在全,现在可以用到项目里了,底层驱动 ARM 已经实现了跨平台,之后 ...

1 p& t  O# [. S4 V) N# o这个趋势很好啊,避免碎片化,抽空看看
XinLiYF 回答时间:2018-4-7 08:17:15
黑皮男 发表于 2018-4-6 21:43
! r' D6 f/ l) X这个趋势很好啊,避免碎片化,抽空看看
- }! H- D5 g2 l& M8 ~8 a
是啊,MCU 开发就是缺少这样大一统的框架啊
x5y4z3 回答时间:2018-4-7 13:48:47
这 CMSIS 的 UART 驱动以前还真没见过,谢谢楼主的告知,赶紧来试试学习一下。* p0 \4 B7 b6 ?6 b# O  {' T
zero99 回答时间:2018-4-17 14:47:42
感谢分享,请汇总到4月技术原创7 L( W# U, D: |: m
https://www.stmcu.org.cn/module/forum/thread-615497-1-1.html
wlx583193113 回答时间:2020-9-16 16:07:23
int main(void)
$ p4 ~% ^3 E) Y{
: ?7 b2 D5 L! G* F7 B+ o* R//        UART1_Comm_Init(115200);
7 z5 t5 y$ O* K) r7 {& X        UART2_Comm_Init(9600);! B1 B* t5 G# H) m0 e
        3 e( X8 Q% f: g+ _
        Driver_USART2.Send("http://www.cmsoft.cn", sizeof("http://www.cmsoft.cn"));7 }5 E3 A9 ?$ d8 v4 z) o
        while(1);
1 ?+ }; i* m* r. A; o9 ]}
+ ?  ]/ ~# I0 A# \" y程序运行到Driver_USART2.Send就卡在这一行 无法运行到while那里   同时发送的内容也没发出去
, o+ u2 ^5 ^6 F- i不知道咋回事????
wlx583193113 回答时间:2020-9-16 16:08:39
void USART2_Callback(uint32_t event)1 E" N' _# I" a, @4 e" O
{( C, G0 x  @6 D. M: o
  if(event & ARM_USART_EVENT_RX_TIMEOUT)
3 \7 `' @. |0 W) H, u9 E  {
/ |9 u! g1 |- {. ~8 ~0 S" W    Driver_USART2.Control(ARM_USART_ABORT_RECEIVE, 1);
% m" @% Y% f9 O  ~; W; g( O   
1 m0 m5 L. l1 T4 z9 J4 W8 r# R    uint32_t length = Driver_USART2.GetRxCount();
$ ~& }7 }4 m' p5 P   / k5 i; z9 c2 ^% [
//    memcpy(txBuffer, rxBuffer, length);: p  U- v) X: e# ^6 F5 G
//   , E3 I) Z# W) F7 _
//    Driver_USART1.Send(txBuffer, length);
/ K/ I9 t& M- ]. A3 e) Z( y& }    Driver_USART2.Receive(USART2_RxBfr, sizeof(USART2_RxBfr));
+ i# n4 M& l$ |+ V1 s# l8 O  }        & X! e7 t0 F( |9 r- k1 b
        else if(event & ARM_USART_EVENT_SEND_COMPLETE)
! X4 |$ q, ~9 S4 M        {. \7 @$ ~) i. d
                __NOP();. r( [# q" b5 _( |3 H0 }; J
        }$ v( L" t: N' @/ r
        else if(event & ARM_USART_EVENT_RECEIVE_COMPLETE): C% D% d$ ^* |* [
        {1 Y) S8 w  w& @7 L+ F, S* `1 ^
                __NOP();
' F" q$ ~$ n! `4 a        }
% O3 \9 k8 w% X  v7 ]}+ r% f, y2 ?: }
从电脑端的串口工具发送内容  也没产生串口回调事件   不知道咋回事?????
wlx583193113 回答时间:2020-9-16 16:09:14
void UART2_Comm_Init(uint32_t Brate)& |$ l" T3 w) }+ j* @
{//usb
+ U# {+ d1 n' k- i( |
: d3 k) }) R3 p3 ~        Driver_USART2.Initialize(USART2_Callback);6 A3 b* W7 |( [, J
        Driver_USART2.PowerControl(ARM_POWER_FULL);2 Z! Q6 r2 z% |0 t) Q
        Driver_USART2.Control(ARM_USART_MODE_ASYNCHRONOUS |
5 Z3 w$ D; p4 T  y6 @7 A                                                                                ARM_USART_DATA_BITS_8 |$ Q$ [, U) _" B6 g( Z
                          ARM_USART_PARITY_NONE |
# o0 ~( c) Q  H& \# s) g                          ARM_USART_STOP_BITS_1 |. @# d; w+ O( C
                          ARM_USART_FLOW_CONTROL_NONE, Brate
* u# t' |( H; i2 c( q% J9 b                         );+ a% o4 o( Z  p/ K9 D( |8 r, h
        /* Enable Receiver and Transmitter lines */
6 y3 [7 R* A6 o  g9 u0 _        Driver_USART2.Control(ARM_USART_CONTROL_TX, 1);$ ?" f8 g) b8 _) y* l
        Driver_USART2.Control(ARM_USART_CONTROL_RX, 1);
, h6 y  P# }( J! L        /* Begin to receive */% ~: G, ~1 q6 L/ r' t- e! B+ K
        Driver_USART2.Receive(USART2_RxBfr, sizeof(USART2_RxBfr));
! {8 K6 Z9 g1 u' X}) R8 Y' l! L& c8 a. K4 d* B2 Q
这是串口初始化

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版