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

【经验分享】STM32G031K6 LL库的使用 - UART

[复制链接]
STMCU小助手 发布时间:2021-11-11 23:00
说明:驱动基于STm32G031K6测试,其他型号需自行做改动。$ ?2 F% j4 A- ~0 z1 [
- c1 u) z/ l5 n( i7 B* B
串口1的初始化:- Z7 L) l$ r# A0 a
0 V2 ]4 m+ ]  [! i2 G
  1. //使用串口1,通过中断和DMA进行数据收发。DMA的初始化另作说明( N+ l# }4 ?2 c& B2 Y! ]9 o
  2. void STM32LLUart1Init(void). C5 S' g7 h$ A6 E" J" h
  3. {
    8 `, p5 G3 b* J
  4.         LL_USART_InitTypeDef UART_InitStruct = {0};
    4 Q; h7 ^: o. e3 j% x
  5.         LL_GPIO_InitTypeDef GPIO_InitStruct = {0};4 V' j( m: D( W& v6 Z* N
  6. ' k6 j8 W% i9 v) R& r9 \) S
  7.         LL_IOP_GRP1_EnableClock(LL_IOP_GRP1_PERIPH_GPIOA);            //使能GPIO时钟
    & f& j" ~4 }& x% v3 c
  8.         LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_USART1);         //使能串口1时钟: O2 O4 y: i2 \# w8 N) L. q, T
  9. : e& s# Q0 W7 x3 ~9 P
  10.         GPIO_InitStruct.Pin = bspUART1_TX_PIN;                        //TXPin指定2 K( b7 `; K- x/ s) j
  11.         GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;                //io模式配置为复用模式7 M3 ^! |0 s$ c  E9 `5 S6 b
  12.         GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;              //设置为高速率
    * J9 `( k6 j# \
  13.         GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;         //设置为推挽输出: C7 `) x( {0 ?8 G1 c
  14.         GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;                       //不带上拉/ i: x" Y4 F( L
  15.         GPIO_InitStruct.Alternate = LL_GPIO_AF_1;                     //选择复用IO功能
    ' O. T0 D3 g5 a
  16.         LL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    ! |4 t" m$ f8 C7 `; R/ l% \! H1 G# K
  17. 7 K$ F, \$ Q8 n. {) R- p3 s9 ~
  18.         GPIO_InitStruct.Pin = bspUART1_RX_PIN;                        //TXPin指定' H8 |" P# F. A  \7 f: e
  19.         GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
    $ x8 a7 y- I" A! o7 r( |
  20.         GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;
    1 S0 _6 Q0 b" g8 T5 R  p0 V* ?6 s
  21.         GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;9 ]0 ^; [, ?  S, v3 L
  22.         GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
    6 x5 I* z* G( j2 b/ _
  23.         GPIO_InitStruct.Alternate = LL_GPIO_AF_1;                     //选择复用IO功能
    . E' M2 |1 Q  J5 g' N. H% M
  24.         LL_GPIO_Init(GPIOA, &GPIO_InitStruct);
      Y7 C* N  d. r: l

  25. # d/ j) p7 i  E, f" Z4 F
  26.         NVIC_SetPriority(USART1_IRQn, 0);                             //开启串口中断
    0 @$ @' _% q" V3 M
  27.         NVIC_EnableIRQ(USART1_IRQn);
    4 l& T% x0 H; s' C& ]" ]

  28. 5 H8 a! u7 T% D7 G" I
  29.         UART_InitStruct.PrescalerValue = LL_USART_PRESCALER_DIV1;     //设置时钟预分频
    . b/ n( K% J- V; ^# g) b- n6 `
  30.         UART_InitStruct.BaudRate = 115200;                            //设置串口通信波特率
    # Z2 `/ p0 D; {  s" q* \5 n5 s
  31.         UART_InitStruct.DataWidth = LL_USART_DATAWIDTH_8B;            //8位数据位% v9 A* e7 d# ~, j9 U
  32.         UART_InitStruct.StopBits = LL_USART_STOPBITS_1;               //1位停止位
    $ N; g4 F$ N8 C6 K# O1 Z
  33.         UART_InitStruct.Parity = LL_USART_PARITY_NONE;                //奇偶校验关闭
    . Y8 \% T& B1 p
  34.         UART_InitStruct.TransferDirection = LL_USART_DIRECTION_TX_RX; //数据收发功能都开
    ) [0 \. [2 H2 Z' J1 ?
  35.         UART_InitStruct.HardwareFlowControl = LL_USART_HWCONTROL_NONE;//硬件流控关闭
    5 f0 |; ~/ U; ]% l* j
  36.         UART_InitStruct.OverSampling = LL_USART_OVERSAMPLING_16;      //数据采样频率倍数设置
    " S( m3 h: Z; s+ n, Z
  37.         LL_USART_Init(USART1, &UART_InitStruct);
    . ]( G7 w3 ^7 w' q/ n* O
  38. # Z& W$ t; y6 J0 n+ W* U/ ^
  39.         LL_USART_SetTXFIFOThreshold(USART1, LL_USART_FIFOTHRESHOLD_1_8);//设置TX缓存阈值为深度的1/8,暂时不理解这个,可能是串口中断产生时的fifo阈值吧
    7 x* q" j: F9 m% A6 H& r( ]+ t( E6 s
  40.         LL_USART_SetRXFIFOThreshold(USART1, LL_USART_FIFOTHRESHOLD_1_8);//设置RX缓存阈值为深度的1/89 J/ k- s+ j7 X$ A: u6 d2 t8 W0 P- J
  41.         LL_USART_DisableFIFO(USART1);                                   //因为使用dma接收,关闭FIFO
    1 S& G& w: i! r& d9 t* Q) @" v
  42.         LL_USART_ConfigAsyncMode(USART1);                               //其他基本配置
    9 u( X  ^4 }- c7 y; p, ~/ ?
  43. . @8 Z! X8 P/ ~! l% T9 U3 h
  44.         LL_USART_Enable(USART1);                                        //使能串口
    4 Y* W; x9 X: k. P6 A% z9 g! R% c* P

  45. 8 p" s& _0 w8 `) y0 Z# ~
  46.         while((!(LL_USART_IsActiveFlag_TEACK(USART1))) || (!(LL_USART_IsActiveFlag_REACK(USART1))));                            //检查相关标志位
    3 }" Z  j- I  y3 p' G+ h# X) h1 ^

  47. 0 p1 A4 p9 k' H2 E2 q. i, Y1 h
  48.         LL_USART_EnableIT_IDLE(USART1);                                 //使能空闲中断' @$ d* Z! m/ z% L5 Q
  49.         LL_USART_EnableIT_ERROR(USART1);                                //使能错误中断1 l5 ^, }  c! M- K
  50. 2 D+ l* U0 ]5 P4 X* b; e6 d$ ^2 N
  51. }
复制代码
6 w$ l3 Y6 \7 Z9 t
串口中断处理函数:: u2 ~0 G- s  |& \) N1 W

4 ]" i+ d6 m; J3 Q; x
  1. void USART1_IRQHandler(void)
    , L( P5 z+ Z8 t! a  l
  2. {/ K) ]3 z3 N+ C9 R0 X. `5 _
  3.     uint32_t isr_reg = 0;        3 b" n0 o, d$ L) V- {
  4.     isr_reg = LL_USART_ReadReg(USART1, ISR);        1 E" h, |+ X1 }% z( P
  5.     if (LL_USART_IsActiveFlag_IDLE(USART1))
    ( l+ s: S# i% _0 O8 R1 z- H
  6.     {& w6 i% X0 c' I3 ~2 t$ K% M
  7.         LL_USART_ClearFlag_IDLE(USART1);* P% c2 [8 g- k" n+ u. ?8 D
  8.         //设置串口接收使用DMA,串口接收的数据会自动保存到DMA初始化时配置的缓存内,
    : A; O& M; h% Q" \8 r9 a& R. z
  9.         //这里可能需要对收取到缓存的数据做一些操作。
    - `) K  s; n. x+ i4 w. T8 c
  10.     }" L/ P! D6 E& @
  11.     LL_USART_WriteReg(USART1,ICR,isr_reg)$ d/ G+ C( X3 p
  12. }
复制代码
* i# b, A6 L$ |* o) c9 i: v
串口发送函数:
  c& v. [' ?; ^' r1 R3 p
! r& P. C$ S3 c
  1. void STM32LLUart1SendBuffer(uint8_t *buffer,uint16_t length)$ ^- |* w( X5 _: O' s) P$ l
  2. {
    2 \/ U5 a, o+ G, j& @* d+ q& |
  3.     uint16_t i = 0;; J7 A, f% C: s4 K0 }9 B0 x+ V  G
  4.     for(i=0;i<length;i++); q4 t, X. u7 K/ C4 W
  5.     {! }  `9 A$ @4 P, N# b
  6.         while(!LL_USART_IsActiveFlag_TXE(USART1));
    : N- s' h3 j3 J$ r
  7.         LL_USART_TransmitData8(USART1,buffer<i>);
    . ?! \! z7 Z; S/ t6 T$ k: F
  8.     </i>}
    : n* @9 j, ^( B% B! B0 `/ O
  9. }
复制代码
. W: |# }) t& r. R( v0 D1 l
串口数据接收通过DMA进行,不需要串口接收函数,DMA具体配置另作说明。' V$ Y5 O5 k  X

& x0 w# m6 @1 N, C, |2 n6 ?! e, b) s/ G
收藏 评论0 发布时间:2021-11-11 23:00

举报

0个回答

所属标签

相似分享

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