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

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

[复制链接]
STMCU小助手 发布时间:2021-11-11 23:00
说明:驱动基于STm32G031K6测试,其他型号需自行做改动。
8 ^; i4 B! C5 }% {' \% U; s% R* l6 L/ e7 u- B3 V
串口1的初始化:
7 E% k0 P3 }) N0 s- @2 C- M+ i; Q  x3 P; z% {
  1. //使用串口1,通过中断和DMA进行数据收发。DMA的初始化另作说明5 s2 `2 a& H* I1 {: {
  2. void STM32LLUart1Init(void)7 M2 D' p/ h; M2 t' k3 J. ^& c
  3. {
    $ ^5 K/ ]7 w! ~: b9 B4 E7 w
  4.         LL_USART_InitTypeDef UART_InitStruct = {0};
    8 _2 O( x8 `0 }" z( p
  5.         LL_GPIO_InitTypeDef GPIO_InitStruct = {0};
    1 Y1 O# \& j0 H. \

  6. . w5 f+ I! d* E& P+ a  m: r
  7.         LL_IOP_GRP1_EnableClock(LL_IOP_GRP1_PERIPH_GPIOA);            //使能GPIO时钟
    + E3 r6 Q9 I" L! y$ L! `
  8.         LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_USART1);         //使能串口1时钟$ x6 i% K0 p# W

  9. 4 B/ b" N1 Y0 f) _5 j1 j
  10.         GPIO_InitStruct.Pin = bspUART1_TX_PIN;                        //TXPin指定  i0 l  H3 p7 J0 ?. ]8 R5 F
  11.         GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;                //io模式配置为复用模式
    $ v! \5 W- r8 W
  12.         GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;              //设置为高速率" H( a' |  D5 ^  [# S/ X# o0 k
  13.         GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;         //设置为推挽输出4 c4 m# m; f6 L( r
  14.         GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;                       //不带上拉
    5 t8 Z' k6 _  c+ Y' \0 ^6 a
  15.         GPIO_InitStruct.Alternate = LL_GPIO_AF_1;                     //选择复用IO功能% R" k- ?6 \6 I- A6 c4 `, R9 k/ V
  16.         LL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    ( ^+ x# `3 X4 S4 G$ \
  17. " W  ~' C( B% B0 m8 H
  18.         GPIO_InitStruct.Pin = bspUART1_RX_PIN;                        //TXPin指定
    ) m; S" q6 v% z5 ]
  19.         GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
    ) `7 O; @3 G6 P3 E" A
  20.         GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;/ I7 e* x4 F0 [( K
  21.         GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;# A- m: X+ D3 }8 U5 _
  22.         GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;  B  _2 Q" g, G7 v
  23.         GPIO_InitStruct.Alternate = LL_GPIO_AF_1;                     //选择复用IO功能
    ) w' A+ J2 M2 ?* b8 t6 K
  24.         LL_GPIO_Init(GPIOA, &GPIO_InitStruct);
      ^3 E7 e2 O8 y' l8 D

  25. - {3 `1 Q# u6 C6 K
  26.         NVIC_SetPriority(USART1_IRQn, 0);                             //开启串口中断
    $ ^- _* H3 P% }4 F3 p" T( h
  27.         NVIC_EnableIRQ(USART1_IRQn);
    / `; T( B% i+ X) D3 q: ~; Z
  28. ! [0 S; E  v; J. c( z  ]( C
  29.         UART_InitStruct.PrescalerValue = LL_USART_PRESCALER_DIV1;     //设置时钟预分频
    . _8 D: C& I- K4 J. s
  30.         UART_InitStruct.BaudRate = 115200;                            //设置串口通信波特率4 v, \% q9 O8 `3 Z/ p/ ]6 y4 Q
  31.         UART_InitStruct.DataWidth = LL_USART_DATAWIDTH_8B;            //8位数据位
    : }' A' t/ i' b' u8 C
  32.         UART_InitStruct.StopBits = LL_USART_STOPBITS_1;               //1位停止位/ C6 e- W- D3 N: D5 C, }1 z0 g- V3 c
  33.         UART_InitStruct.Parity = LL_USART_PARITY_NONE;                //奇偶校验关闭5 C1 G. A: B* H7 t  |: B
  34.         UART_InitStruct.TransferDirection = LL_USART_DIRECTION_TX_RX; //数据收发功能都开9 }& y/ w- `! ]8 ^5 H5 M
  35.         UART_InitStruct.HardwareFlowControl = LL_USART_HWCONTROL_NONE;//硬件流控关闭6 {) t# O$ U2 r5 @0 u! o. \8 i
  36.         UART_InitStruct.OverSampling = LL_USART_OVERSAMPLING_16;      //数据采样频率倍数设置( r0 e$ }3 |. G  M" @& \6 X( j
  37.         LL_USART_Init(USART1, &UART_InitStruct);
    % k# f4 O; N  \5 Q2 i! L

  38. 2 J. [& l+ G) k9 C4 Z; B4 u# d9 p6 n$ F2 `
  39.         LL_USART_SetTXFIFOThreshold(USART1, LL_USART_FIFOTHRESHOLD_1_8);//设置TX缓存阈值为深度的1/8,暂时不理解这个,可能是串口中断产生时的fifo阈值吧
    ! j* A! n, g& ]  E5 ]# A' x3 t
  40.         LL_USART_SetRXFIFOThreshold(USART1, LL_USART_FIFOTHRESHOLD_1_8);//设置RX缓存阈值为深度的1/8- u6 g6 _! K6 l/ g
  41.         LL_USART_DisableFIFO(USART1);                                   //因为使用dma接收,关闭FIFO, I0 N! N) v" H7 o4 d9 ^: t; p
  42.         LL_USART_ConfigAsyncMode(USART1);                               //其他基本配置
    ' P0 Y% k" ^* `% n9 F* B- D- g% i
  43. : x3 R+ Q  A7 f7 r$ f
  44.         LL_USART_Enable(USART1);                                        //使能串口
    : |) I& Y. Y$ c" s8 ^
  45. : H% J, w! L  J  ~0 f. o+ V
  46.         while((!(LL_USART_IsActiveFlag_TEACK(USART1))) || (!(LL_USART_IsActiveFlag_REACK(USART1))));                            //检查相关标志位
    7 T$ j3 k2 T/ p, i1 A, |
  47. 9 s, Q7 V# D# @6 h; Z( F" _8 N
  48.         LL_USART_EnableIT_IDLE(USART1);                                 //使能空闲中断( e! t  J/ ]6 W  T; Y9 a
  49.         LL_USART_EnableIT_ERROR(USART1);                                //使能错误中断, N, ]6 X$ t* X5 _8 K# y$ o! [

  50.   B# }6 B& T, H
  51. }
复制代码

8 P+ ^& }; q0 b- i0 x8 M串口中断处理函数:+ R' B9 s# F6 l2 o3 A& V6 n& Y

7 q# b+ u) p$ ^
  1. void USART1_IRQHandler(void)! {' K( b' V# ~
  2. {
    ( r$ A; M0 S: Z; x
  3.     uint32_t isr_reg = 0;        7 o5 T% n$ f. j' G
  4.     isr_reg = LL_USART_ReadReg(USART1, ISR);        
    & `7 @3 O) Y* O3 t* E! u
  5.     if (LL_USART_IsActiveFlag_IDLE(USART1))
    ; w5 U. `6 ~0 h0 D1 l5 r  c$ A
  6.     {( i0 Y) f  p& Y  {2 A" `
  7.         LL_USART_ClearFlag_IDLE(USART1);
    $ F7 [. U, |7 H% k; Q5 |/ j- m
  8.         //设置串口接收使用DMA,串口接收的数据会自动保存到DMA初始化时配置的缓存内,2 l" A! P1 J5 |# }' I
  9.         //这里可能需要对收取到缓存的数据做一些操作。" y: P$ a0 N: p. g0 S: V
  10.     }! ^  i) J  r4 {) b3 [
  11.     LL_USART_WriteReg(USART1,ICR,isr_reg)1 V  r1 i! W2 D  c" F
  12. }
复制代码

1 K0 q0 r0 k) W串口发送函数:. `  X( d7 f6 @* O

% s  N; u' j7 |
  1. void STM32LLUart1SendBuffer(uint8_t *buffer,uint16_t length)
    & S. U* Y! T2 V& ~- d1 F) T
  2. {' X' S' K: X0 ]# E4 x  L8 c( T
  3.     uint16_t i = 0;
    8 s$ r% J+ i) h* z
  4.     for(i=0;i<length;i++)
    0 g& [" j) R5 ?2 s5 X6 K0 V
  5.     {
    " r( i& H" n4 q+ \8 P
  6.         while(!LL_USART_IsActiveFlag_TXE(USART1));9 C/ x. E. B, B/ n
  7.         LL_USART_TransmitData8(USART1,buffer<i>);" r5 `- C, c& ~1 a0 D& `) f3 D
  8.     </i>}: m* C- ~: B% E( }8 x
  9. }
复制代码

- I( d4 `# i+ B( d4 q: a% F串口数据接收通过DMA进行,不需要串口接收函数,DMA具体配置另作说明。" x% ^4 [6 P, X7 z- u8 U$ e& Q; T
$ T: O; ^$ r8 ~3 }- H9 b& o

/ \9 w+ O7 I8 {  R( Q: }
收藏 评论0 发布时间:2021-11-11 23:00

举报

0个回答

所属标签

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