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

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

[复制链接]
STMCU小助手 发布时间:2021-11-11 23:00
说明:驱动基于STm32G031K6测试,其他型号需自行做改动。) k9 I8 B& b3 X3 g! }- ~

& [( |' h, g! k: k6 X3 s串口1的初始化:
& ~9 O0 l7 Y% d+ C0 N" c4 K& Q6 x4 f
  1. //使用串口1,通过中断和DMA进行数据收发。DMA的初始化另作说明
    1 I- a. J* d% A6 a8 {: m
  2. void STM32LLUart1Init(void)
    6 h8 n2 l% i& ?* P9 n+ k
  3. {
    $ v+ s) m$ L# ^2 X
  4.         LL_USART_InitTypeDef UART_InitStruct = {0};. X# M" k7 I" L! y
  5.         LL_GPIO_InitTypeDef GPIO_InitStruct = {0};
    & F0 A. S) Z) a  b% `

  6. & w9 _3 I  ?+ |7 E
  7.         LL_IOP_GRP1_EnableClock(LL_IOP_GRP1_PERIPH_GPIOA);            //使能GPIO时钟
    $ K6 }9 Y' S# \) u: q, ^
  8.         LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_USART1);         //使能串口1时钟' w5 u5 |) _/ k0 m8 I5 G

  9. 9 A, b- `1 x2 j* }
  10.         GPIO_InitStruct.Pin = bspUART1_TX_PIN;                        //TXPin指定/ W; e1 u( V  L8 s& q: q. ~
  11.         GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;                //io模式配置为复用模式9 ^' S0 z- W1 E5 K8 M
  12.         GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;              //设置为高速率
    * |0 T4 q/ N8 D2 L3 @; S. G# g
  13.         GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;         //设置为推挽输出. L4 Z( _; }3 u6 A
  14.         GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;                       //不带上拉
      O8 `% a0 f& l! z
  15.         GPIO_InitStruct.Alternate = LL_GPIO_AF_1;                     //选择复用IO功能
    ! s; s9 D; |6 e0 M6 p9 g9 |+ u
  16.         LL_GPIO_Init(GPIOA, &GPIO_InitStruct);+ P/ m/ i3 u/ N( x# Z2 s, n' I
  17.   `, `7 H" ]% O( x/ D; Z9 K
  18.         GPIO_InitStruct.Pin = bspUART1_RX_PIN;                        //TXPin指定
    2 D% V4 ~8 i* T; K, i
  19.         GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;/ E. o: {. c/ X; N6 t1 o! g
  20.         GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;* i+ O2 _! F. E3 f
  21.         GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;, V3 L* T( t& R% q) P& V
  22.         GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
      C! X3 ?  Y- e: f0 I+ w+ @
  23.         GPIO_InitStruct.Alternate = LL_GPIO_AF_1;                     //选择复用IO功能) }1 }0 k& i& y
  24.         LL_GPIO_Init(GPIOA, &GPIO_InitStruct);: l. y( V8 {' |$ q! b7 l0 ?- ~

  25. 7 v& f/ W. Q+ U- U* F
  26.         NVIC_SetPriority(USART1_IRQn, 0);                             //开启串口中断
    3 e6 p3 x% {2 g8 ~; _: j
  27.         NVIC_EnableIRQ(USART1_IRQn);0 _# J& W" |/ W$ e. s  ]- y
  28. ) Z* j: R$ ]! v9 Q: F
  29.         UART_InitStruct.PrescalerValue = LL_USART_PRESCALER_DIV1;     //设置时钟预分频
    5 w1 d3 e- Q1 G  i
  30.         UART_InitStruct.BaudRate = 115200;                            //设置串口通信波特率$ ?9 X8 A! V8 |! P
  31.         UART_InitStruct.DataWidth = LL_USART_DATAWIDTH_8B;            //8位数据位
    . c* k  i3 o2 ]; [8 ?
  32.         UART_InitStruct.StopBits = LL_USART_STOPBITS_1;               //1位停止位6 v! v, X4 g6 n' U7 |  d3 `6 a
  33.         UART_InitStruct.Parity = LL_USART_PARITY_NONE;                //奇偶校验关闭
    ' w' B& ?& r! |/ B& H
  34.         UART_InitStruct.TransferDirection = LL_USART_DIRECTION_TX_RX; //数据收发功能都开, y# Q  I" \9 Z4 `4 w& A* N
  35.         UART_InitStruct.HardwareFlowControl = LL_USART_HWCONTROL_NONE;//硬件流控关闭! H/ H9 k! W9 H5 |  f
  36.         UART_InitStruct.OverSampling = LL_USART_OVERSAMPLING_16;      //数据采样频率倍数设置4 s5 r9 \& J8 _0 o0 {! l# m/ X
  37.         LL_USART_Init(USART1, &UART_InitStruct);
    ' B! X7 l; d* |$ [$ x3 H) R) b

  38. 5 h7 P' c: x/ v/ E; O8 A3 T
  39.         LL_USART_SetTXFIFOThreshold(USART1, LL_USART_FIFOTHRESHOLD_1_8);//设置TX缓存阈值为深度的1/8,暂时不理解这个,可能是串口中断产生时的fifo阈值吧6 o  r- E' I4 \% E# D
  40.         LL_USART_SetRXFIFOThreshold(USART1, LL_USART_FIFOTHRESHOLD_1_8);//设置RX缓存阈值为深度的1/8
    * i( k# L) S' u# Y
  41.         LL_USART_DisableFIFO(USART1);                                   //因为使用dma接收,关闭FIFO3 [! j8 p* I/ ~
  42.         LL_USART_ConfigAsyncMode(USART1);                               //其他基本配置
    4 D* [* q/ @: E' S/ S# ~: ]- {" ^

  43. $ _4 Q5 i  T. @5 q
  44.         LL_USART_Enable(USART1);                                        //使能串口5 V' G% f8 j( v( O

  45.   i8 q$ b+ c5 v, s: y6 ^
  46.         while((!(LL_USART_IsActiveFlag_TEACK(USART1))) || (!(LL_USART_IsActiveFlag_REACK(USART1))));                            //检查相关标志位2 j) m/ L8 ?# }" o1 A6 u

  47. , K7 L, @( e& R+ z- C' {! N
  48.         LL_USART_EnableIT_IDLE(USART1);                                 //使能空闲中断  m7 j! S- t6 E
  49.         LL_USART_EnableIT_ERROR(USART1);                                //使能错误中断2 w" B! [" V% v6 h% j, _6 K; D  Z
  50. - P6 b7 m. {0 k; Z, m
  51. }
复制代码
6 q; r- j  f( E
串口中断处理函数:
6 L# F9 b" X- d8 V3 l- R: C0 w, _7 h* W' a
  1. void USART1_IRQHandler(void)
    0 d+ N  V8 ?9 I2 r
  2. {
    7 ?" L4 D* J" k7 n
  3.     uint32_t isr_reg = 0;        4 R9 Z. `+ o4 C6 ?: R
  4.     isr_reg = LL_USART_ReadReg(USART1, ISR);        
    $ Y8 C) y& d6 \6 `2 r9 v: b) y7 q
  5.     if (LL_USART_IsActiveFlag_IDLE(USART1))
    6 H# u1 G4 I, I4 }6 [* W+ y
  6.     {
    1 [% c2 P8 S5 v7 J; w0 @
  7.         LL_USART_ClearFlag_IDLE(USART1);# w4 K* Z1 ~1 c* \5 f' L& [4 X
  8.         //设置串口接收使用DMA,串口接收的数据会自动保存到DMA初始化时配置的缓存内,
    " \7 F' o" U- b" s* z1 X5 y
  9.         //这里可能需要对收取到缓存的数据做一些操作。3 ]% @) q; F2 _" a5 }# n2 P, G
  10.     }$ w, o( t( c- X( n
  11.     LL_USART_WriteReg(USART1,ICR,isr_reg)
    6 A3 t- a3 V2 E
  12. }
复制代码
4 C2 V$ `! Z2 X
串口发送函数:# w0 O  [4 G* q! @6 p
+ B6 I! ?  Q( y
  1. void STM32LLUart1SendBuffer(uint8_t *buffer,uint16_t length)' l" ^  N) C. o( w& \( {
  2. {$ I* a' I' _9 R5 b4 d
  3.     uint16_t i = 0;& M' M' l" u+ c
  4.     for(i=0;i<length;i++)  H0 T# T7 ]3 W8 d
  5.     {/ y) k3 ^- ~/ Y
  6.         while(!LL_USART_IsActiveFlag_TXE(USART1));) _0 n4 c" S: X( x7 ]2 S/ e+ T
  7.         LL_USART_TransmitData8(USART1,buffer<i>);5 r0 N! O7 J3 x8 C' m4 W; ^
  8.     </i>}
    & y* o& o1 y5 }; `9 _, ^+ Y6 b* l
  9. }
复制代码

3 s0 [8 v8 V) k6 a/ l. i% m. Z1 m串口数据接收通过DMA进行,不需要串口接收函数,DMA具体配置另作说明。0 t  F# S* t! `/ Q: Q; w% j
( f) t0 D3 k* I6 f+ V2 A  D

8 I7 I/ |$ ?. f' R
收藏 评论0 发布时间:2021-11-11 23:00

举报

0个回答

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版