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

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

[复制链接]
zhenwei7799 发布时间:2019-8-25 12:39
最近为了学习HAL库和熟悉STM32CUBEIDE软件,用手上STM32F407板子做了小工程,里面包含有串口1,串口2的使用,定时器中断,EXTI,DAC输出,ADC的DMA读取和用SPI驱动的TFT彩屏显示。  g+ [  Y) Y5 n
先放一张工程做好的图吧
( D: _5 J( u5 p. D+ E) i6 m4 P6 s, ]1 n! W+ X8 K7 d- a' G+ [
程序很简单,用CUBEMX初始化后,只需要自己写回调函数和主函数的部分,先看一下外设的CUBEMX初始化;
) _+ u$ I/ t" J. ^- R1 l5 c: R: H(1)USART1和USART29 x2 ?* H+ K" S! A

% X( f7 c8 t9 W0 I" q7 f* }# j. `! I7 n( j, Q* h1 @* z! s5 |$ ^
两个串口的初始化是一样的这是设置的NVIC中断不同,后面放出工程的NVIC配置。
0 `( Z/ f* G$ ]; w  f+ m2 w" f(2)TIM3
8 _1 j8 h; `$ x8 N7 a5 u! T# d
- M$ b" j1 l2 Y; w
% t6 C4 j% P" o7 r% c% I9 B0 c定时器的配置要多一点,但只用定时器则比较简单
* @* u: }! Y% A3 N1 x7 q! Q8 M(3)ADC6
7 c- f& t* L% p/ J5 n/ g# C4 {
0 U! D( W, S6 h+ i6 e& e' j! Q/ k) u
- ^, e4 }! _) N7 H- G2 Q! f' `

/ k0 Z0 m4 B  U4 K* h" ?ADC的DMA读取设置
! [0 ]: H! E4 e) z1 ~
! q" g2 z# `- N8 d5 M(4)DAC1
( w+ D" @! Y1 F5 P; `
" r# o* R( n9 K" o0 }/ A(5)SPI2
0 }9 {! t% A. G: t! ]6 F. x: Y, o* k) z6 D; M
(6)EXTI
2 R& H; W  ?& F7 r; u8 i+ i' k5 E' c- S2 Z# W* U* G0 ?$ Y9 H+ @: }! l
(7)NVIC, B7 u2 T4 W0 ]: H; U3 b

, h, O# T  `' W- {$ o(8)GPIO) t3 u. I+ W% [- \, q( ~2 |
3 @$ H0 B/ J/ l& ?  ]- E- B
所有的外设初始化配置完成了;
2 j/ C/ s/ b6 d
: l" z' p7 r( ~, B1 S( z9 Q下面看一下中断相应的回调函数,在HAL库中,写中断处理函数和标准库不同,我个人认为现在只需要在回调函数里写内容就行了,我们看一下HAL库里面的IRQ函数,比如HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)
  1. void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)
    * G; a; u" s0 d4 p
  2. {- ^, }; c" ?( T, }0 C0 X" G
  3.   /* EXTI line interrupt detected */
    * x. r7 P! E. F7 _+ B8 l2 J
  4.   if(__HAL_GPIO_EXTI_GET_IT(GPIO_Pin) != RESET)
    ( r+ V. f: F# \" |7 J% r! N
  5.   {5 g% }7 V) }' M
  6.     __HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin);" b$ J, t4 H( B, M
  7.     HAL_GPIO_EXTI_Callback(GPIO_Pin);8 ^' O. b0 j1 c- l) P  w- s
  8.   }
    ; x/ W# J1 h  \% R
  9. }; ~% N' Q# @: F- s6 X
  10. 9 r4 C+ j- {7 a. g9 O; S
  11. /**/ \6 ?4 E! m) h6 l3 ~% M6 o
  12.   * @brief  EXTI line detection callbacks.5 n1 u* X& h1 [* O( I1 @1 a4 l% l- G
  13.   * @param  GPIO_Pin Specifies the pins connected EXTI line: U) [; }1 ]# }, Z
  14.   * @retval None
    : \7 _' b; k: H- _$ n
  15.   */. ]# b  K/ w3 m4 }& X3 d# h
  16. __weak void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
    * u# P# W8 z9 r+ n! z
  17. {1 o2 V: f. e/ c2 h) }1 V' s
  18.   /* Prevent unused argument(s) compilation warning */& l6 a3 y3 g4 w( i
  19.   UNUSED(GPIO_Pin);
    ( m  \2 r0 [) A) F* [) y
  20.   /* NOTE: This function Should not be modified, when the callback is needed,7 z4 ^$ g& Z! q% `& e) c! t
  21.            the HAL_GPIO_EXTI_Callback could be implemented in the user file& d' i# h2 z7 E
  22.    */! ~# N$ h& u5 K% S1 O1 ^
  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)是需要自己编写。
# Q8 Z; W" A3 h+ X: z5 q2 O! _$ }2 R7 @
(1)串口8 C6 _+ R7 M4 X+ X) E/ V1 w

% \+ \6 X# }7 t
  1. uint8_t RX_buff[RX_len];
    ) n0 |8 B2 A  B/ E
  2. uint8_t RX_temp=0;( N1 R" t4 m# H7 B: G
  3. uint8_t RX_i=0;: K" R  F6 C+ Z/ {" c% H
  4. uint8_t RX2_temp=0;& p5 d& }" ^  ?  P' l
  5. 5 `$ f: O. t& r; m6 f0 P
  6. void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)( A6 f5 I% \" L/ Y
  7. {- d) u' l+ ^1 S+ Z% h  y
  8. //        uint8_t buff[10];
    8 Q! j1 z- W2 z% O" D) {
  9.         if(huart->Instance==USART1)! m# N4 e( w$ P
  10.         {  u5 W% F7 P* i. J
  11.                 //HAL_UART_Transmit(&huart1, &RX_temp, 1, 1);
    : L1 O, V6 z# Y( x, H1 D: u! O
  12.                 if(RX_i>=RX_len)! K/ P  p8 y  q" q% ^5 s9 }9 p
  13.                 {' N1 n7 k: p4 x" L' w1 {
  14.                         RX_i=0;8 b2 r5 @) \0 y( [
  15.                         HAL_UART_Transmit(&huart1, send_buff, sizeof(send_buff), 1);
    & ^* F3 y+ a7 W( M; @: \
  16.                         memset(RX_buff,0,sizeof(RX_buff));
    * n. E; ]  y+ E+ w* _  b
  17.                 }
    6 R( ?2 s) p4 w9 v
  18.                 else5 s& N" ^4 L# W8 u. P
  19.                 {9 k8 Y! _3 q( w/ S, u5 q" q# G
  20.                         RX_buff[RX_i++]=RX_temp;
    ! t1 b. l6 {2 r& v  `3 a
  21.                         if((RX_buff[RX_i-1]=='\n')||(RX_buff[RX_i-2]=='\r'))' [1 ]( v! `* o) l& t
  22.                         {" F2 A! \% i  E- b* r3 j( m% V
  23.                                 HAL_UART_Transmit(&huart1, RX_buff, strlen(RX_buff), 10);//Timeout 不能太小,也不能太长+ c  u1 K4 J& l
  24.                                 memset(RX_buff,0,sizeof(RX_buff));
    ' s; U; @  j2 L6 g: C6 u
  25.                                 RX_i=0;
    7 C& N' [% m" |' a+ r2 F5 J$ F7 w  S7 [
  26.                         }& C' Q( h5 R/ {
  27.                 }
    * D5 o4 s5 v- G4 t
  28.                 HAL_UART_Receive_IT(&huart1, &RX_temp, 1);
    ; C5 x; ^: B1 }* P, T+ }
  29.         }& t! T* t, L3 s0 ~9 w9 R+ ^

  30. ) I; z2 |9 `6 M# s0 i5 I- Y
  31.         if(huart->Instance==USART2)$ J  r( n, Z3 a, a( g
  32.         {: R& {0 R) |$ R8 i+ M9 Y. r
  33.                 HAL_UART_Transmit(&huart2, &RX2_temp, 1, 10);
    9 t/ r) @8 A8 n! e( O0 ]/ m: |
  34.                 HAL_UART_Receive_IT(&huart2, &RX2_temp, 1);
    . N' ]+ S4 `  |' t  B: g! m2 D
  35.         }
    9 N. P: y4 w" o' _
  36. }
复制代码
(2)TIM3定时器中断
1 e3 c' a2 g! r: u8 I1 D* x
  1. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
    3 [4 P9 A! x. y
  2. {
    - t, W8 w, }/ t! \: y
  3.         if(htim->Instance=htim3.Instance)
    ) M. N' v- P, b# z% [5 l
  4.         {2 s% k" C  ?2 W
  5.                 HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin);: h/ G* \& A* s+ B. E8 U6 L
  6.         }6 ^$ I; `  Z. |) t' D  i% c
  7. }
复制代码
(3)EXTI中断
3 B# z2 g9 w6 z( g
  1. void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)2 d  E6 S1 S7 p: F7 U' q% [
  2. {3 a9 \& g; v3 Y/ S- A; X
  3.         HAL_Delay(100);
    : Z) ?- c! L8 n& |0 j+ S

  4. 1 ?& B* D' n4 }5 {' b6 L
  5.         switch(GPIO_Pin)
    0 B) z- x0 x, k( X% d
  6.         {
    5 g; s& Q2 K5 Y, {# F
  7.                 case WK_UP_Pin:' h( p, {" \& J) T) H5 c
  8.                         if(HAL_GPIO_ReadPin(WK_UP_GPIO_Port,WK_UP_Pin) == 1)! `  j5 Z6 D% X6 @9 z6 J
  9.                         {
    / `# c& S/ h$ a2 g; z4 D
  10.                                 HAL_GPIO_TogglePin(LED0_GPIO_Port, LED0_Pin);
    5 k% N' z9 C( W5 m9 g
  11.                                 DAC_Value=3299;
    9 ^8 d% v3 `, a
  12.                         }) J+ Q2 `& g6 W. G8 Z
  13.                 break;' N- A' ]0 m6 }  Z# G" N
  14. ( \+ @$ G7 s) o3 N9 E* o8 H
  15.                 case GPIO_PIN_2:
    ' C% b) t- q& q- }; O0 S% e% q
  16.                         if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_2) == 0)
    * c; m" t& v) L2 @, g$ _4 d
  17.                         {
    6 q3 Q2 I( E% Z/ v" L; `6 [
  18.                                 HAL_GPIO_TogglePin(LED0_GPIO_Port, LED0_Pin);
    / B& p( U+ w; @
  19.                                 if(DAC_Value<3200) DAC_Value+=100;6 W6 U7 G$ E+ K$ w
  20. 0 d& A7 r7 a& D5 m
  21.                         }- D3 K/ a$ s( \( o& W* A- A
  22.                 break;7 |0 W, `) r  ^+ q# M& h4 w

  23. 3 @( i2 ^9 o( w- g5 |, z
  24.                 case GPIO_PIN_3:% a; Y' f6 c6 t1 ^
  25.                         if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_3) == 0)
    % Q; _. U1 L' ^
  26.                         {* c! h( ~; ~- d, U4 Q6 F" D
  27.                                 HAL_GPIO_TogglePin(LED0_GPIO_Port, LED0_Pin);$ k, P" Q4 h- b& \8 B! M" t
  28.                                 if(DAC_Value>=100) DAC_Value-=100;
    9 o* a. u! @3 d5 q6 k" \$ R& K8 M2 p
  29.                         }
    + Y- ^7 x2 i3 ^5 f* v/ d  }
  30.                 break;
    4 A5 ^9 m0 |  G# C. k9 y6 T/ R
  31. - W8 E5 w% @. @  _% T
  32.                 case GPIO_PIN_4:
    : Z4 t- [( @# e* i6 h
  33.                         if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_4) == 0). u# z7 W8 @2 d* a( d5 _
  34.                         {- s/ U; Y" Q; p& L. `
  35.                                 HAL_GPIO_TogglePin(LED0_GPIO_Port, LED0_Pin);/ Q+ j& t* {- t7 a# K) L6 f( y
  36.                                 DAC_Value=0;
    1 B! r) w2 A9 Q& p" b: S
  37.                         }
    % k- p5 d* J7 T1 f3 {
  38.                 break;
    6 X" a" k3 H1 n
  39.         }
    + }* z) O/ t* L9 E# i( [
  40. }
复制代码
再看一下用SPI往LCD里面写数据的程序
8 P& `1 ~5 {9 I9 a- c# T9 [
  1. uint8_t SPI_WriteByte(uint8_t Byte)& H7 ]  {/ @9 v2 v' _
  2. {
    % P0 C  a) i. ~& ]4 z" {3 v
  3.           HAL_SPI_Transmit(&hspi2, &Byte, sizeof(Byte), 10);- G5 O5 Y/ Z9 g5 K0 \- U( M5 Q
  4. }
复制代码
下面看一下主函数% j! h7 F3 S7 d. K" k+ _8 a
  1. int main(void)/ r, E- p8 ~5 b5 r( U1 p% q
  2. {8 h5 G% D, s0 j8 R
  3.   /* USER CODE BEGIN 1 */
    " L0 |9 I- I: L  N' V
  4.         uint8_t buff[50];
    2 A$ S* S$ S0 r% n. D" |
  5. 6 O. P3 ~$ ]3 x4 p9 W4 \+ E
  6.   /* USER CODE END 1 */" o$ ?  Z* z5 k5 q( J
  7.   
    ) Z) v  C6 b3 G

  8. ! {: f( ~' O- T5 j$ t7 f
  9.   /* MCU Configuration--------------------------------------------------------*/
    * Q7 k" C: \# p  c

  10. , h0 i- [; j$ b
  11.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */+ O* H0 Y' H7 E+ L/ e0 Q* G& f
  12.   HAL_Init();
    ) G7 C. j3 Y0 n5 ?% S
  13. 8 K1 C4 b  F. z5 p  s5 z( t3 u8 B! Z
  14.   /* USER CODE BEGIN Init */+ E& Q, n3 v+ z& n6 k$ ]$ s

  15. 2 y# q! L9 ?! C" I( [3 p
  16.   /* USER CODE END Init */( z+ C7 L6 V9 D6 T$ s5 K, `5 E
  17. ' w' r9 n9 L6 h2 B2 j* a% a9 @& Y
  18.   /* Configure the system clock */$ O2 W7 N+ D8 A5 J) D0 a; F
  19.   SystemClock_Config();
    5 y+ Q% Y2 A! w( n1 v# S
  20. 2 m. Y' E9 ~9 {" t# h) O2 G; m
  21.   /* USER CODE BEGIN SysInit */
    2 @0 {: u3 n- ?* s% c4 K3 X* ^

  22. 4 B, ^* T% m+ ^, n1 @1 M
  23.   /* USER CODE END SysInit */
    6 w% O( a! R- _# Y# ^

  24. - l: N+ |- d/ M
  25.   /* Initialize all configured peripherals */" U/ N4 ?/ @7 o6 Q5 P: h1 u
  26.   MX_GPIO_Init();- {* _7 W& m' i
  27.   MX_DMA_Init();
    ' F7 \$ _/ b9 Z3 H( Y; m: W
  28.   MX_USART1_UART_Init();
    # H) T6 y  w7 A& l
  29.   MX_TIM3_Init();. e4 p. p2 R; v7 f5 L* c' h
  30.   MX_ADC1_Init();# I2 @4 v: w2 Z( U/ ^+ S
  31.   MX_DAC_Init();7 g4 B! \- H1 ?( U( {2 |8 Q
  32.   MX_SPI2_Init();
    " L* O2 f" W$ z, z7 p% Z7 {
  33.   MX_USART2_UART_Init();$ Y. O- Q; I  B! C; r' I
  34.   /* USER CODE BEGIN 2 */
    % {9 s& a. [: ?: i
  35. / @" r' `0 D3 n; A0 a. `
  36.   LCD_Init();$ p7 P. I; \% @7 L# E! n2 Z
  37.   POINT_COLOR=RED;% o1 z" W, Q2 ]5 R6 e
  38.   LCD_ShowString(10, 50, 16, "Welcome come to My world",0);
    # Z$ p) e% Z% q0 l7 J% U$ @
  39. ; Z& ^8 ]& P( u. q* J
  40.   //LCD_BL_SET;$ U/ L1 Z9 J4 F; J/ Z  t
  41.   memset(RX_buff,0,RX_len);7 s" O5 ^5 s" u# x
  42.   HAL_UART_Receive_IT(&huart1, &RX_temp, 1);
    ' v4 y8 Q2 o- k0 ?
  43.   HAL_UART_Receive_IT(&huart2, &RX2_temp, 1);+ ]7 q: R! k- u0 i/ [! l

  44. 0 S' ^* v; R7 f8 d% G& t4 A: C  |
  45.   HAL_TIM_Base_Start_IT(&htim3);9 q$ D6 T6 |0 N5 K2 e

  46. % u% S5 B' {) c  {# a+ ~
  47.   HAL_DAC_Start(&hdac, DAC_CHANNEL_1);
    & A" u, ]# v, T6 }
  48.   HAL_ADC_Start_DMA(&hadc1, ADC_val, ADC_length);7 r3 O/ W4 x  w: e( f6 i' P& @
  49. * u/ _( _; E3 t7 v6 @# Y/ Q" h
  50.   //HAL_DAC_SetValue(&hdac, DAC_CHANNEL_1, DAC_ALIGN_12B_R, 0x100);, w0 i! W, p6 X6 _3 G+ u* k: y2 f
  51.   DAC1_Set_Vol(DAC_Value);
    ( c) n- \* C2 x! ~) N
  52.   /* USER CODE END 2 */
    8 f3 k( y8 a! ~& J6 u
  53. 1 q* ~( y9 C/ r9 c& Q4 Z! e, j
  54.   /* Infinite loop */: C6 h# n" J7 q6 e# w( ?8 K
  55.   /* USER CODE BEGIN WHILE */
    ' S3 I! _# u3 [. @* D
  56.   while (1)
    ! g  F& R& E& i' [
  57.   {3 E- _8 A4 ^4 _# _( h+ o, m  f- z
  58.     /* USER CODE END WHILE */
    1 A! x, [7 l$ @: n: R2 B1 u
  59. : z% \3 q- R  i0 {+ k8 m4 U
  60.     /* USER CODE BEGIN 3 */' q) h8 l2 U& \, s
  61.           HAL_Delay(500);
    $ {2 ~6 d, q9 ]4 s8 X+ z( y) b) `
  62.           DAC1_Set_Vol(DAC_Value);
    8 ^& H( U! y- [% }$ ~1 d- q! L3 }2 H7 u
  63.           sprintf(buff,"S:ADC: %1.2f  DAC:%4d\r\n",Get_ADC(),DAC_Value);
      l" B& |  y6 r9 \0 e
  64.           LCD_ShowString(10, 70, 16, buff, 0);
    + E4 U5 u4 ?6 I# T
  65. : ~# m0 t3 j2 P
  66.           sprintf(buff,"S:DACG:%5d\r\n",HAL_DAC_GetValue(&hdac,DAC_CHANNEL_1));
    . f/ I6 `, X) a+ ~5 q
  67.           LCD_ShowString(10, 90, 16, buff, 0);
    & Y- n1 {. b1 b2 ^( X1 Q
  68.           HAL_UART_Transmit(&huart1, buff, strlen(buff), 10);
    7 l& J) Q3 d; L6 m; F6 M. H& ~7 n
  69.   }3 N9 U. p( F. ^0 K+ D9 C  _
  70.   /* USER CODE END 3 */- B3 q+ u9 H" A
  71. }
复制代码
在STM32CUBEIDE中,想要调用sprintf()和printf()程序的话要在软件里设置一下& z6 ^% C0 y9 Z! \
  _7 X8 H6 G& @$ n
(PS:软件里面也要选Debug模式,Release模式好像编译不了这两个函数)2 ?7 h6 q) r# U# [. Y# M
工程:Pro5.zip8 c  J! Q+ f6 G. s% d6 {  ^; ~8 s
" h# M: x1 Y, Q( z, 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
' `+ s: {* a' [+ D7 h" |
感谢分享

所属标签

相似分享

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