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

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

[复制链接]
STMCU小助手 发布时间:2021-11-11 23:00
说明:驱动基于STm32G031K6测试,其他型号需自行做改动。
5 G5 P7 T  b# p# {' }# T1 N* ^5 B, R, ]1 `9 S
串口1的初始化:& T& x$ d* h; g3 J) @( \; I
7 I  M/ O7 k3 N/ R! S
  1. //使用串口1,通过中断和DMA进行数据收发。DMA的初始化另作说明
    , U4 C. Y$ e# {! D) K
  2. void STM32LLUart1Init(void)& w( q6 K6 N1 m0 N. n
  3. {
    + \2 {- R! K4 r' ]' o: ^. j3 o7 t
  4.         LL_USART_InitTypeDef UART_InitStruct = {0};( `! S9 E6 q% h" Z) l7 Q% }! {
  5.         LL_GPIO_InitTypeDef GPIO_InitStruct = {0};/ J8 ^) b: }! M" p/ J& t& K8 c

  6. 5 l$ `% {/ J) m
  7.         LL_IOP_GRP1_EnableClock(LL_IOP_GRP1_PERIPH_GPIOA);            //使能GPIO时钟( Q7 M! z0 I. P) F5 n6 m7 u
  8.         LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_USART1);         //使能串口1时钟; ~" l$ x8 B% y: t0 x6 U& Q. U
  9. 6 ]" C7 @2 j( ?' Z. z$ f6 S# \
  10.         GPIO_InitStruct.Pin = bspUART1_TX_PIN;                        //TXPin指定$ A5 a9 j. w% \: B  h! @8 i. N
  11.         GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;                //io模式配置为复用模式1 U; x$ |/ ^& _; w
  12.         GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;              //设置为高速率3 `2 ~6 U+ w9 J/ C. q' l
  13.         GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;         //设置为推挽输出
    , i5 P# C) z" D2 i; |& e/ P7 R
  14.         GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;                       //不带上拉
    0 }/ F4 [' O1 y: ?1 S, u9 O3 W  i& c
  15.         GPIO_InitStruct.Alternate = LL_GPIO_AF_1;                     //选择复用IO功能9 r4 g- a& N" E) @7 g
  16.         LL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    : H4 s2 d1 e. z' h4 s
  17. 8 V  u4 ?/ U$ C- y  C
  18.         GPIO_InitStruct.Pin = bspUART1_RX_PIN;                        //TXPin指定$ b; Y- R  e6 h* X+ s* C6 b! a7 A
  19.         GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;; M  e- \0 b# w2 j  t2 _. x
  20.         GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;6 E. z( w( y$ I
  21.         GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
    : @: z- i. ~* g
  22.         GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;  Z' @" g2 V8 a* T* M
  23.         GPIO_InitStruct.Alternate = LL_GPIO_AF_1;                     //选择复用IO功能
    ) y& V% V1 Z  u" i  D
  24.         LL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    ! T, M' k4 N. t7 P! M* F' X

  25. ' j/ {  ]( G4 z( _. h
  26.         NVIC_SetPriority(USART1_IRQn, 0);                             //开启串口中断
    4 ?; o+ V6 {* h  T% ^4 p. W, C
  27.         NVIC_EnableIRQ(USART1_IRQn);
    * A$ |0 ?4 i% r/ V7 ^4 N% ]# k
  28. : r0 W% u* W" j( z/ o
  29.         UART_InitStruct.PrescalerValue = LL_USART_PRESCALER_DIV1;     //设置时钟预分频
    3 \: N7 O. _3 Q( Q: M
  30.         UART_InitStruct.BaudRate = 115200;                            //设置串口通信波特率
    ; A7 l6 A4 b& @% z5 O' C
  31.         UART_InitStruct.DataWidth = LL_USART_DATAWIDTH_8B;            //8位数据位
    5 D0 T; u9 ?) M5 o, ^
  32.         UART_InitStruct.StopBits = LL_USART_STOPBITS_1;               //1位停止位
    8 L2 q" W' n) k/ X1 K
  33.         UART_InitStruct.Parity = LL_USART_PARITY_NONE;                //奇偶校验关闭
    * {+ }1 U6 y$ \- A, w2 i$ q
  34.         UART_InitStruct.TransferDirection = LL_USART_DIRECTION_TX_RX; //数据收发功能都开
    ( U% M) U2 O# d$ e. k8 Q. V9 O
  35.         UART_InitStruct.HardwareFlowControl = LL_USART_HWCONTROL_NONE;//硬件流控关闭
    7 z& x7 i3 ^0 e7 ]9 C
  36.         UART_InitStruct.OverSampling = LL_USART_OVERSAMPLING_16;      //数据采样频率倍数设置
    ' q4 \  c* ]& |. a. Y2 _% E
  37.         LL_USART_Init(USART1, &UART_InitStruct);* f# G+ |& H0 G# t- |' n" _

  38. + L; f/ W7 X8 f8 {% @
  39.         LL_USART_SetTXFIFOThreshold(USART1, LL_USART_FIFOTHRESHOLD_1_8);//设置TX缓存阈值为深度的1/8,暂时不理解这个,可能是串口中断产生时的fifo阈值吧/ j* f" A: v: M' b
  40.         LL_USART_SetRXFIFOThreshold(USART1, LL_USART_FIFOTHRESHOLD_1_8);//设置RX缓存阈值为深度的1/88 D# L+ T; o9 }6 k+ T
  41.         LL_USART_DisableFIFO(USART1);                                   //因为使用dma接收,关闭FIFO
    2 s/ H* x) g1 `3 a
  42.         LL_USART_ConfigAsyncMode(USART1);                               //其他基本配置7 |. }+ K" D6 @2 Q* }

  43. $ b1 @" G4 S/ v5 n9 I
  44.         LL_USART_Enable(USART1);                                        //使能串口( D! F) ?3 @/ z

  45. - ~9 X4 D2 U2 m( q
  46.         while((!(LL_USART_IsActiveFlag_TEACK(USART1))) || (!(LL_USART_IsActiveFlag_REACK(USART1))));                            //检查相关标志位
    : j( L- G) W8 q/ R: g' [; ?3 R
  47. ! c& i2 P& U+ J- @' m: Z
  48.         LL_USART_EnableIT_IDLE(USART1);                                 //使能空闲中断8 R( ?" U# P; K( p& u
  49.         LL_USART_EnableIT_ERROR(USART1);                                //使能错误中断
    2 Q* J) J9 `8 \8 e

  50. , \( ?) x4 s5 z( V1 g/ I
  51. }
复制代码
3 W% c- G) M/ Z/ E
串口中断处理函数:" V0 S% J3 |0 e$ k$ U7 a4 O; `

: A( K3 N  l! a: S7 A
  1. void USART1_IRQHandler(void)# r* o$ i2 O8 [0 Y
  2. {) t  s/ y+ O/ p) C1 V) }
  3.     uint32_t isr_reg = 0;        0 n3 H) p5 q* w5 R7 y% i
  4.     isr_reg = LL_USART_ReadReg(USART1, ISR);        6 o' ~* B8 t4 C
  5.     if (LL_USART_IsActiveFlag_IDLE(USART1))6 X, o1 {. z3 Q
  6.     {
    . b4 j/ X" b5 f3 F( \, e
  7.         LL_USART_ClearFlag_IDLE(USART1);) F4 A- N' F/ |) p) y1 p* v
  8.         //设置串口接收使用DMA,串口接收的数据会自动保存到DMA初始化时配置的缓存内,- f- @* w; Z5 A& K/ a
  9.         //这里可能需要对收取到缓存的数据做一些操作。
    : C3 q' T1 y- `. M
  10.     }
    6 V$ `8 {; k) S" p) t; `& R, g
  11.     LL_USART_WriteReg(USART1,ICR,isr_reg)8 V: H9 J" T$ O" @7 z" }
  12. }
复制代码
  x( o% \% f6 Q  f( e
串口发送函数:( b# j. n& M# R5 \2 ]
5 e. W  p$ j" a( D6 }( B
  1. void STM32LLUart1SendBuffer(uint8_t *buffer,uint16_t length)
    * }! N& }) `& W3 h
  2. {
    1 |. w2 g1 Y* x9 M( V
  3.     uint16_t i = 0;* X) H; l$ n  r' I2 o
  4.     for(i=0;i<length;i++)% M/ X' l  {+ R, ~' U; o* o
  5.     {
    * G- z$ X, T5 ?; B8 b
  6.         while(!LL_USART_IsActiveFlag_TXE(USART1));/ T1 l- m, Y/ E* X% ~
  7.         LL_USART_TransmitData8(USART1,buffer<i>);
    9 `- b) d3 a0 _0 G
  8.     </i>}8 V6 A4 o7 l( a. F2 O% Y; k# F$ @' U
  9. }
复制代码

5 a" K3 X, K/ t) r6 F2 j串口数据接收通过DMA进行,不需要串口接收函数,DMA具体配置另作说明。. u( R. h- b9 g
+ e% N; R- a" X' g$ `/ k$ w' A7 C( X
# W8 ^/ s5 F2 e  {. h
赞 收藏 评论0 发布时间:2021-11-11 23:00

举报

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