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

STM32CUBEIDE的DAC输出,ADC输入并在SPI TFT上显示数据

[复制链接]
zhenwei7799 发布时间:2019-8-25 12:39
最近为了学习HAL库和熟悉STM32CUBEIDE软件,用手上STM32F407板子做了小工程,里面包含有串口1,串口2的使用,定时器中断,EXTI,DAC输出,ADC的DMA读取和用SPI驱动的TFT彩屏显示。
* a2 `2 H7 b; ?8 Y2 _/ _# B先放一张工程做好的图吧
8 b# t, f4 `) v6 P) W" l+ ^
4 _# L9 h% R6 {9 _& z程序很简单,用CUBEMX初始化后,只需要自己写回调函数和主函数的部分,先看一下外设的CUBEMX初始化;
' K, \2 \3 E2 I2 ~/ E& A/ @(1)USART1和USART2
; D/ ]+ i" i/ l' R5 G; A: C: l* `' l( {6 H" k

" b7 }% p, s3 U. w% y! P1 ^两个串口的初始化是一样的这是设置的NVIC中断不同,后面放出工程的NVIC配置。" {4 `; v( v' f4 G* e0 g
(2)TIM3: Y) w8 o8 ^$ g: J
1 a1 s* O, W, K; P: q
0 ?' I9 M) k" m: A
定时器的配置要多一点,但只用定时器则比较简单. ~  l1 E' m' \% @3 W
(3)ADC6% t6 [4 _' o! }; i% g

* t  `4 r: ?* j
5 x: Z2 f* P! c, i$ R( X" }2 R9 ]+ q  r0 h3 O0 w
0 t! H  u( P7 \/ Q7 w' G  {
ADC的DMA读取设置! Q( L' o! `$ e
' G# u' d: l) f& d/ P
(4)DAC1) }  Z- d% w- Z: k3 ?' N

: m- c  i) b, J(5)SPI2( x8 ]; D) R$ g" F* q' N6 K

( I; g/ F1 c: n(6)EXTI
' w; F5 b& X, R7 D2 J  d6 F" @; Q/ V
(7)NVIC
; R* T3 z9 r# n1 y0 k  N; Y5 i/ q
(8)GPIO) n! A1 Q) X8 N3 N! l

7 `0 t6 i+ ^; L2 r' u5 b所有的外设初始化配置完成了;
/ H2 z" i2 ]! r) ~' J
' a; U1 ]0 M. s, N& x' D, p1 {$ r下面看一下中断相应的回调函数,在HAL库中,写中断处理函数和标准库不同,我个人认为现在只需要在回调函数里写内容就行了,我们看一下HAL库里面的IRQ函数,比如HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)
  1. void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)  X9 [" ?4 m! S1 Z$ Y
  2. {: K  j3 Y- v/ c5 R  j8 r( R" n4 p. P
  3.   /* EXTI line interrupt detected */
      E, a) X; c6 Y; E' l, N0 R
  4.   if(__HAL_GPIO_EXTI_GET_IT(GPIO_Pin) != RESET)
    : C! z+ X1 A) i% q. U% M
  5.   {
    + S% t7 U$ [  v  g
  6.     __HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin);
    ' Q& ?& Z" q1 t# e  T) G( Q, Y. e
  7.     HAL_GPIO_EXTI_Callback(GPIO_Pin);
    : {# f: {8 s) c, A) M; ^! X6 T
  8.   }- \, ]# ~7 |3 A
  9. }4 U8 A7 d; a9 T
  10. % D( Y; k) f# J6 H4 `: _
  11. /**
    % Q) ~+ [+ d8 D/ s
  12.   * @brief  EXTI line detection callbacks.
    . s* c% |. n! k7 W
  13.   * @param  GPIO_Pin Specifies the pins connected EXTI line# c+ q& A$ k9 J" Z% Z
  14.   * @retval None
    " a( N! B  Y' v4 T: U8 l
  15.   */' U4 W4 w: N, V# I: _! k. a
  16. __weak void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)& i5 ?2 K2 q8 |
  17. {5 S. Z. o1 J# C3 c; U: |  [
  18.   /* Prevent unused argument(s) compilation warning */0 U6 |/ |( A" h+ J5 O
  19.   UNUSED(GPIO_Pin);$ a% m1 T* i9 y$ d
  20.   /* NOTE: This function Should not be modified, when the callback is needed,: b, ]" y- s) p; \+ C
  21.            the HAL_GPIO_EXTI_Callback could be implemented in the user file
    0 Y& {) t4 B# U/ ]
  22.    */
    5 r7 O2 s' m9 S( A: W: T; V& a
  23. }
复制代码
HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)里面会调用 HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)函数,而 HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)是需要自己编写。( Z% M: H6 [' w. H) E

9 z  C( M. |" K/ i(1)串口7 \  ?9 C8 R  S2 H) @! X# L0 h: Y; c

( j! v' n5 J! o, p1 ]$ I5 v. y
  1. uint8_t RX_buff[RX_len];8 A' g4 c' ]$ y# J4 G* Z
  2. uint8_t RX_temp=0;% f! o6 v* r! C% q' a
  3. uint8_t RX_i=0;
    + S7 w6 F1 u9 p9 O
  4. uint8_t RX2_temp=0;& @1 i7 u9 k% R( H

  5. / a' e3 {3 w9 E# J' y  a8 V$ z
  6. void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)) t' T6 [( P7 z/ B4 b8 J7 J' Y" R
  7. {
      s2 g; d' G/ Y
  8. //        uint8_t buff[10];% |; S( Q* |; _) ~: C: J" c! B
  9.         if(huart->Instance==USART1)3 M' A7 y+ O$ Z3 S' `
  10.         {% O3 j5 R  g- a  ~" [, V% Q# q; [
  11.                 //HAL_UART_Transmit(&huart1, &RX_temp, 1, 1);
    9 u/ s( i* s# e9 r2 g$ x1 U
  12.                 if(RX_i>=RX_len)
    * E! p6 Y: I1 d0 l
  13.                 {
    8 i1 D3 ?3 ^4 P, C; L
  14.                         RX_i=0;# m4 c( O/ {% {. O. S/ K7 v
  15.                         HAL_UART_Transmit(&huart1, send_buff, sizeof(send_buff), 1);
    " X- h1 O+ ?4 L( O
  16.                         memset(RX_buff,0,sizeof(RX_buff));# U0 L6 I8 s% O5 {0 y* ~
  17.                 }8 h1 Q0 ^; k! B) ^1 w8 s3 K
  18.                 else0 {  a3 a5 `9 n" A; h
  19.                 {
    . d; \7 t( h1 _6 K$ i
  20.                         RX_buff[RX_i++]=RX_temp;
    ' V( T( A) A+ T( S% k$ g
  21.                         if((RX_buff[RX_i-1]=='\n')||(RX_buff[RX_i-2]=='\r'))
    ! U0 s6 j: Q: g4 q
  22.                         {
    $ ~5 ?0 b' q: N# E4 b) M8 m5 \
  23.                                 HAL_UART_Transmit(&huart1, RX_buff, strlen(RX_buff), 10);//Timeout 不能太小,也不能太长
    2 X6 u7 A9 P2 D  ]  [4 b3 X0 `
  24.                                 memset(RX_buff,0,sizeof(RX_buff));: J7 X) _) p2 K6 T0 F
  25.                                 RX_i=0;$ E. w' h- o. i% U$ e
  26.                         }5 G/ ~* _, S7 f- n" P# e
  27.                 }
    " O; H5 g2 K" ]! ~* H
  28.                 HAL_UART_Receive_IT(&huart1, &RX_temp, 1);/ r6 T" T1 S- g$ e
  29.         }0 C* N, U# C7 r* q9 J5 f# ~
  30. ; K- m2 m! o% }/ ]) e
  31.         if(huart->Instance==USART2)
    1 y5 U2 O& q% r& O7 p
  32.         {
    . P/ I. k9 F: [% A* d
  33.                 HAL_UART_Transmit(&huart2, &RX2_temp, 1, 10);% K# W4 q# R3 g
  34.                 HAL_UART_Receive_IT(&huart2, &RX2_temp, 1);
    " Y8 s; r9 U$ {: j
  35.         }
    - {. q9 V/ V- @) k8 P
  36. }
复制代码
(2)TIM3定时器中断
2 g& G/ O  i2 a! U. _
  1. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
    8 P! o4 h- x1 o0 L( h" O$ V
  2. {
    $ t5 W0 {+ j3 b$ f6 {
  3.         if(htim->Instance=htim3.Instance)2 P9 r& f) D( m! n  G9 |
  4.         {
    , P7 Z( g& I0 H, a+ A' b7 Y7 k% P0 t
  5.                 HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin);; `* X8 [" B& c6 a9 o. y
  6.         }
    ! o3 z- ?6 l$ c7 G% a$ ^9 C
  7. }
复制代码
(3)EXTI中断
1 p( i. ?  D" j& k6 E8 x9 Q
  1. void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)0 q! a% F. D+ I9 M" c$ m
  2. {" @$ ]& L/ }& B/ J
  3.         HAL_Delay(100);) A% K# Q9 f3 D' k! `+ Z
  4. 5 p; A8 }6 K. e; n; _, i: C6 k5 b( R
  5.         switch(GPIO_Pin)
    9 S2 L: T6 c$ L+ a$ B. [0 |( T
  6.         {+ |  H! Y+ V4 i% j) h* [" u
  7.                 case WK_UP_Pin:
    + \7 o. P/ m' q( v7 Z0 ]) [
  8.                         if(HAL_GPIO_ReadPin(WK_UP_GPIO_Port,WK_UP_Pin) == 1): Q) p% ^* L  [& f
  9.                         {* B8 f( B- t; h) v
  10.                                 HAL_GPIO_TogglePin(LED0_GPIO_Port, LED0_Pin);
    2 ?# s5 `2 H& F. e* B' c& a1 Q
  11.                                 DAC_Value=3299;. s5 H7 C8 {) q
  12.                         }
    % K! a1 M7 ?9 U! h# z! m0 _) N
  13.                 break;- D9 J  `. C# l& e
  14. " y/ N  I! }: E: L; v0 q+ N
  15.                 case GPIO_PIN_2:4 Y7 O, E% B/ W; M4 q6 B# Q
  16.                         if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_2) == 0)! u% K0 N$ Z* Y# T3 U/ f
  17.                         {4 r$ z$ p7 h: w$ X
  18.                                 HAL_GPIO_TogglePin(LED0_GPIO_Port, LED0_Pin);& g7 s; z/ ?4 V
  19.                                 if(DAC_Value<3200) DAC_Value+=100;
    . F8 @9 B& X4 D, C8 T- l
  20. 0 b+ F! ^+ P. c& H& w3 F7 ?1 I/ r6 \
  21.                         }. b  P& ?0 m6 C/ o; P! e! s2 C& t! _( f
  22.                 break;
    2 u" a( M$ D( n( f

  23. 4 a* k/ c- m, b7 |& Z2 ~; p
  24.                 case GPIO_PIN_3:
    7 h- S8 c0 R; s( K  D. J( k
  25.                         if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_3) == 0)
    # L4 Y+ p3 Z, q# o0 G* S
  26.                         {
    ( m9 F0 _- ^+ |& Z
  27.                                 HAL_GPIO_TogglePin(LED0_GPIO_Port, LED0_Pin);  a/ P8 z+ z8 W9 L0 d
  28.                                 if(DAC_Value>=100) DAC_Value-=100;
    7 V4 h. T/ z4 [
  29.                         }
    ; l4 C( M  U. B/ y1 `  b
  30.                 break;- O; r: v0 U% I/ R9 f; Z2 c

  31. # S. T( u* @( x1 w( g
  32.                 case GPIO_PIN_4:
    " S7 H& R8 x; m4 y
  33.                         if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_4) == 0)
    7 `! q! [- V2 }; X' \
  34.                         {
    $ m) e  C; E* \5 V( i
  35.                                 HAL_GPIO_TogglePin(LED0_GPIO_Port, LED0_Pin);; T1 b' D8 P0 @6 @! A
  36.                                 DAC_Value=0;9 w& _; Y4 u- a3 C& e/ ~
  37.                         }. B& u. z  ^0 [1 |! m' h
  38.                 break;
    - b0 Y* r! k1 P) r7 r4 G
  39.         }7 F, E( t# r5 {. ?3 w
  40. }
复制代码
再看一下用SPI往LCD里面写数据的程序
) k$ Y5 P+ W4 o% V; `4 N0 P
  1. uint8_t SPI_WriteByte(uint8_t Byte)* j: r7 b3 e% S
  2. {/ m" t9 G! o: e7 l& P
  3.           HAL_SPI_Transmit(&hspi2, &Byte, sizeof(Byte), 10);
    " T$ }5 Y) Q7 {& Z, L
  4. }
复制代码
下面看一下主函数
, S! G& }- j7 W  g; c
  1. int main(void)
    " j. A3 D! n8 V4 n1 X- I
  2. {5 V8 c( O8 ]- }& S3 k
  3.   /* USER CODE BEGIN 1 */3 C0 _/ }  W, D  L
  4.         uint8_t buff[50];: e6 }; ]7 ?5 s
  5. 8 {& S. B) P) E8 R
  6.   /* USER CODE END 1 */  k$ g8 t/ F% z' F) L9 P) X$ i
  7.   2 r# d- H) F6 c4 u# S

  8. ' X# j0 v  ]+ A3 C
  9.   /* MCU Configuration--------------------------------------------------------*/
    3 U6 o( u7 N+ _  k8 o" O

  10. 6 e; e( S5 t3 T% a5 x# e1 H8 }
  11.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */- g2 S+ k& r* ^& ?( u, S
  12.   HAL_Init();' G/ {  z1 G( W' _, ~8 t

  13. 9 I: K: I* t  F1 ?4 F
  14.   /* USER CODE BEGIN Init */4 d! F2 a, D# }) I' c
  15. 0 N4 i2 J1 V. {
  16.   /* USER CODE END Init */, ^2 V6 i2 \  O# g& M! X
  17. 5 t7 I; d# C/ E2 N, v* @" e6 @
  18.   /* Configure the system clock */! a, A: ~2 I  O& J/ ]2 o
  19.   SystemClock_Config();5 j' p# |  x6 ^7 R

  20. & E3 L  {4 F  [1 S( J
  21.   /* USER CODE BEGIN SysInit */
    - \: u1 h/ i8 @0 Q. N( r
  22. : @# z9 U' q/ |1 Z2 J( e
  23.   /* USER CODE END SysInit */
    ! I! O; E* T) [% D' W% ^
  24. $ C  I( {% G0 `+ d* X/ P" x
  25.   /* Initialize all configured peripherals */, C' S' J/ T) K6 {. P( G% Y8 r( ^
  26.   MX_GPIO_Init();0 S5 R  }( x, G2 R+ M
  27.   MX_DMA_Init();
    ( N' ]: k  y+ Y4 E6 o0 }
  28.   MX_USART1_UART_Init();
    $ Z$ [% Y2 e& u& R6 D
  29.   MX_TIM3_Init();# q/ }* m$ G- \
  30.   MX_ADC1_Init();! q, _- @, F5 U' R  [9 B: R& z
  31.   MX_DAC_Init();
    ! r/ _. M2 D5 Y) H1 A8 A, ~4 L
  32.   MX_SPI2_Init();* o4 j9 k! g' u0 F% L( v8 L
  33.   MX_USART2_UART_Init();
    " |) z' }/ @1 D8 A2 `# e" J
  34.   /* USER CODE BEGIN 2 */& S2 X5 j9 U* A

  35. / k! P" V1 ~, O! j- K" X
  36.   LCD_Init();: V9 V3 @, i( s
  37.   POINT_COLOR=RED;& m3 e& ?3 X! f
  38.   LCD_ShowString(10, 50, 16, "Welcome come to My world",0);
    - B6 c* F9 i' f% R' c* W0 n
  39. 6 D% [; |5 A5 S5 Y
  40.   //LCD_BL_SET;
    # A8 Z2 S1 {* _; |, d9 Y! b$ `
  41.   memset(RX_buff,0,RX_len);
    ! l2 ]" x1 g' A$ I5 \5 B. h
  42.   HAL_UART_Receive_IT(&huart1, &RX_temp, 1);  N9 N; J, Z; e. V, X# @2 E& Y
  43.   HAL_UART_Receive_IT(&huart2, &RX2_temp, 1);" I* x- P' W( e  v, @. R1 M

  44. 2 z2 {/ E& W4 l4 k1 |
  45.   HAL_TIM_Base_Start_IT(&htim3);
    / K, [! \7 k% [* Q5 s" S

  46. ; U! J3 H- Y/ H" L
  47.   HAL_DAC_Start(&hdac, DAC_CHANNEL_1);
    4 J$ `- [- L$ h/ m+ U
  48.   HAL_ADC_Start_DMA(&hadc1, ADC_val, ADC_length);- R4 W; e2 W! W9 s2 @3 ?

  49. 1 |$ \5 k. L7 @! n0 d: ~" q6 S# c
  50.   //HAL_DAC_SetValue(&hdac, DAC_CHANNEL_1, DAC_ALIGN_12B_R, 0x100);+ ]# H8 n5 y" q  q$ ^/ i8 T% y. g
  51.   DAC1_Set_Vol(DAC_Value);- F2 X* a. `8 z3 d3 w
  52.   /* USER CODE END 2 */0 Y' [' l7 h; e& V" a6 _

  53. " c9 B* k. @/ a
  54.   /* Infinite loop */
    ! u3 }0 K5 \* A
  55.   /* USER CODE BEGIN WHILE */% J3 R: @/ ?+ w% k
  56.   while (1)
    $ i5 X8 k9 A2 f) A) y: j- i
  57.   {: V! H. q1 x+ `3 B! r
  58.     /* USER CODE END WHILE *// ]7 s8 F/ x" q
  59. 5 M" A) k! R( J
  60.     /* USER CODE BEGIN 3 */- L+ t; r# m/ ~
  61.           HAL_Delay(500);
    3 E6 H! H9 T2 x
  62.           DAC1_Set_Vol(DAC_Value);
    9 w* [# K/ q* K5 E
  63.           sprintf(buff,"S:ADC: %1.2f  DAC:%4d\r\n",Get_ADC(),DAC_Value);
    0 d: n! G( E5 n5 L
  64.           LCD_ShowString(10, 70, 16, buff, 0);; c7 {) i4 h9 z5 T5 _( x; e" ]9 y

  65. % R7 G% d1 ~+ }7 {8 ~7 ]7 l
  66.           sprintf(buff,"S:DACG:%5d\r\n",HAL_DAC_GetValue(&hdac,DAC_CHANNEL_1));
    ( k' l, [8 q+ _/ |  x& J
  67.           LCD_ShowString(10, 90, 16, buff, 0);
    7 [% V4 ]% _  e9 V- d1 w
  68.           HAL_UART_Transmit(&huart1, buff, strlen(buff), 10);
    * d' L5 W0 m/ |- |
  69.   }
    % _& p  \' c" [+ H) }  E
  70.   /* USER CODE END 3 */
    ( J$ X; O6 p4 E
  71. }
复制代码
在STM32CUBEIDE中,想要调用sprintf()和printf()程序的话要在软件里设置一下- r2 k4 r0 Y% o/ c3 Q9 J& R
# Z& V, P3 i6 p. o+ {
(PS:软件里面也要选Debug模式,Release模式好像编译不了这两个函数)  D4 q: X8 G2 Z  C* l
工程:Pro5.zip1 n8 z& T7 K1 l5 z) b, X& z2 p
$ ~6 `  B- a4 ^# x
2019-08-25_124853.png
2019-08-25_125110.png
2019-08-25_125140.png
2019-08-25_125416.png
2019-08-25_125433.png
2019-08-25_201251.png
2019-08-25_201318.png
2019-08-25_201435.png
2019-08-25_201445.png
2019-08-25_201603.png
2019-08-25_201700.png
2019-08-25_201906.png
2019-08-25_201954.png
2019-08-25_202012.png
2019-08-25_202410.png
2019-08-25_204613.png

Pro5.zip

下载

2.68 MB, 下载次数: 43

赞 收藏 评论1 发布时间:2019-8-25 12:39

举报

1个回答
mmuuss586 回答时间:2019-8-26 09:05:12

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