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

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

[复制链接]
zhenwei7799 发布时间:2019-8-25 12:39
最近为了学习HAL库和熟悉STM32CUBEIDE软件,用手上STM32F407板子做了小工程,里面包含有串口1,串口2的使用,定时器中断,EXTI,DAC输出,ADC的DMA读取和用SPI驱动的TFT彩屏显示。
4 C! n% H& T+ D  C2 d% @2 y先放一张工程做好的图吧
& l& T. t  ~1 j7 ~! f; Y+ ^9 _9 U+ W$ P
程序很简单,用CUBEMX初始化后,只需要自己写回调函数和主函数的部分,先看一下外设的CUBEMX初始化;2 V, U; i; @8 j1 l" L- q( t- q
(1)USART1和USART2: \  t9 z! J+ m
1 a$ |& U' _$ |4 S  x: H
6 \& F6 Z$ N1 G8 V7 x" w: J, t5 S
两个串口的初始化是一样的这是设置的NVIC中断不同,后面放出工程的NVIC配置。8 f: N% f" V* U# ?/ C5 j
(2)TIM35 b" C8 ~! M. v" [) n

% ]2 q) `6 Y5 r- B9 o: Z( [" ~& |# t; p/ j; T  h
定时器的配置要多一点,但只用定时器则比较简单
  L7 c" c3 G3 L4 N3 e, Z(3)ADC6
5 J4 P1 t9 Q$ n
7 Z  c/ g( c+ |/ ~3 ]$ e- G, e5 R: o. y& h" V2 g1 i/ K: s& ~
/ h1 B1 J) b1 @# z$ C$ ^5 w

! f' Y6 p* _# x; ?: ]ADC的DMA读取设置1 ^% o9 P8 @) M
. ~: z  R; Q  {; ]! d( T/ M
(4)DAC15 i0 w5 P" y) P3 H3 c* G3 T
8 E8 V3 v' R( s: O
(5)SPI26 t8 Z9 A& j& f- I# ~/ `5 r* X8 X" K% ^5 f

4 y, A; l# W5 T(6)EXTI9 B8 h) f) y! q' z) i9 M
+ K0 ]$ ^$ i% w! c. H- h  D4 w7 j
(7)NVIC
+ R' J. W1 [7 c1 j. O4 x; x7 t) A- a. u" h2 G" l' k: H* t
(8)GPIO
  E# s8 |& k; R9 l7 m9 a" m% e' ]5 [/ V
所有的外设初始化配置完成了;
6 A* T5 N" O' }/ L- p: r* e
' B$ S1 b. N( o下面看一下中断相应的回调函数,在HAL库中,写中断处理函数和标准库不同,我个人认为现在只需要在回调函数里写内容就行了,我们看一下HAL库里面的IRQ函数,比如HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)
  1. void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)8 J2 t) M/ X6 D% i" `
  2. {5 ?! H! Q- F- @/ d5 R9 W
  3.   /* EXTI line interrupt detected */6 A# A: ?  O! a: W3 F6 \8 w% S
  4.   if(__HAL_GPIO_EXTI_GET_IT(GPIO_Pin) != RESET)
    : D% |# i1 @6 }
  5.   {! {) [! Q% [8 E4 ]8 @
  6.     __HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin);
    & _0 @0 Q+ U; o8 L' z+ E7 ^- B# t0 K
  7.     HAL_GPIO_EXTI_Callback(GPIO_Pin);; P! M- n. s/ h7 K1 K
  8.   }
    ! K1 ?" j2 V  h' |7 C$ l( P; e
  9. }( ~+ Z5 S7 H6 ]& p
  10. 4 ?* i* Y4 ^; w3 c2 t3 ~  h
  11. /**
    ! |7 }* W0 g, ?, A/ i7 ]9 G
  12.   * @brief  EXTI line detection callbacks.
    2 [5 j) f! `+ u6 D1 j9 o! G# Q4 K
  13.   * @param  GPIO_Pin Specifies the pins connected EXTI line1 s) Y9 h1 H; _& ?; @) V
  14.   * @retval None( {$ Z; l; N4 u
  15.   */( @1 S) Z- V! C4 j
  16. __weak void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)* }7 l2 A, T" Y  Z( H
  17. {
    $ ~: i0 |* W2 q2 w
  18.   /* Prevent unused argument(s) compilation warning */2 g) [6 A% u+ q2 {, c- @
  19.   UNUSED(GPIO_Pin);9 j( H" R$ C* o2 b3 B
  20.   /* NOTE: This function Should not be modified, when the callback is needed,# t' {8 T2 L  X+ K5 ^3 {
  21.            the HAL_GPIO_EXTI_Callback could be implemented in the user file" R' _1 R) ?* ^6 b2 e( j2 q& o; {
  22.    */
    3 F0 _  e% ^( m7 `8 L/ n3 A! w
  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)是需要自己编写。
+ @' a2 \( k" U7 i
" L' I0 g0 I* i  x! {  T(1)串口$ |7 Y) ~, G3 `3 b* v6 V, R
; k8 u6 J0 G$ J2 p% G9 i; u
  1. uint8_t RX_buff[RX_len];
    2 h8 {% F, r! ~% X2 F, f1 W
  2. uint8_t RX_temp=0;5 E3 E2 O, Q9 G% \9 n) t
  3. uint8_t RX_i=0;
    * i  p8 f$ v" [$ J2 _" U$ |  _
  4. uint8_t RX2_temp=0;4 _! _2 F) c0 ]1 e& T
  5. " `3 @2 L% s2 U
  6. void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)& L  x+ |9 Z+ a
  7. {
    6 B, v1 P1 q0 ]
  8. //        uint8_t buff[10];- I- G: G0 a( d/ {) E0 S) k
  9.         if(huart->Instance==USART1)
    * `  F0 v: R) p* W* ^! w6 m
  10.         {8 |+ J# Y+ O! `$ Z# c( }+ ^
  11.                 //HAL_UART_Transmit(&huart1, &RX_temp, 1, 1);
    2 X9 B6 t! W4 ~/ k8 L
  12.                 if(RX_i>=RX_len)
    * q% W/ B" i$ t6 @) v
  13.                 {
    4 Y2 F. ^  @! G& c6 E; l2 D- e: ^
  14.                         RX_i=0;
    , u0 R0 q) `' `4 U
  15.                         HAL_UART_Transmit(&huart1, send_buff, sizeof(send_buff), 1);
    + v* ]. E! z3 G0 N, f
  16.                         memset(RX_buff,0,sizeof(RX_buff));
    0 H. N: `2 _& O
  17.                 }- j# b4 {8 a' }2 z  M
  18.                 else+ k7 J$ ^! ^( g0 V. R- H
  19.                 {
    6 U1 y1 I. ]) s
  20.                         RX_buff[RX_i++]=RX_temp;. V; v6 d) d3 c$ e( O
  21.                         if((RX_buff[RX_i-1]=='\n')||(RX_buff[RX_i-2]=='\r'))" ]3 _! i" y; o6 @- `
  22.                         {
    : f: K. \# K& o" m
  23.                                 HAL_UART_Transmit(&huart1, RX_buff, strlen(RX_buff), 10);//Timeout 不能太小,也不能太长
    0 I& c0 E9 e8 ^! B+ X: \7 j9 i" Y
  24.                                 memset(RX_buff,0,sizeof(RX_buff));
    ! }9 P- `$ a/ [9 m7 _3 Y
  25.                                 RX_i=0;$ B- x+ m% R5 m4 n8 L
  26.                         }& ]$ H% K! G0 Y. S$ H1 H/ w$ `
  27.                 }5 H; U4 r5 \- w. b: a7 ?
  28.                 HAL_UART_Receive_IT(&huart1, &RX_temp, 1);. E5 H3 b) D* S1 t% A% W
  29.         }3 ^! H: ^1 K' j! k" h# X$ Z

  30. : X' z( p5 x5 k' r- D2 w& N1 F, \- C# X
  31.         if(huart->Instance==USART2)& C( J+ J% ]& K( _
  32.         {
    # W3 y1 w4 i) X# a
  33.                 HAL_UART_Transmit(&huart2, &RX2_temp, 1, 10);
    7 b$ ~8 m4 o- @4 `
  34.                 HAL_UART_Receive_IT(&huart2, &RX2_temp, 1);
    & Z" e' ?6 r+ X+ E" x- u- |# S
  35.         }0 ]4 |2 `& c, z' y& H
  36. }
复制代码
(2)TIM3定时器中断" e( H+ y1 Z* R( j) b" w
  1. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
    , m8 D/ H! _  c/ `/ U
  2. {
    ' N8 f. \7 \% K: c
  3.         if(htim->Instance=htim3.Instance)/ M8 p+ K. v4 w. h- J7 W
  4.         {
    ; J$ E) `1 l. D9 E6 |8 ?# S
  5.                 HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin);
    . E5 \$ \) a  a3 {  c
  6.         }
    1 a( N9 u0 ~+ e6 @( B
  7. }
复制代码
(3)EXTI中断: m. Q# F$ r7 O7 D8 {  l
  1. void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
    $ f; o  ~1 [( d* Z" B0 S2 W" X
  2. {
    2 Z9 y4 ?* c# ?( R5 ?/ q' _1 c
  3.         HAL_Delay(100);4 V' J$ J  Y( g
  4. 2 {9 T3 g1 `5 ^0 P3 d! E, |
  5.         switch(GPIO_Pin)7 H7 L3 a4 J8 T
  6.         {4 s  s, n3 o) @; B8 B
  7.                 case WK_UP_Pin:
    ' v7 Z* P* ]. Q" ^9 W0 Z
  8.                         if(HAL_GPIO_ReadPin(WK_UP_GPIO_Port,WK_UP_Pin) == 1): C5 w& j' e$ s, Y# j2 ?+ C' z0 t2 a
  9.                         {
    7 I5 b0 l0 j# @
  10.                                 HAL_GPIO_TogglePin(LED0_GPIO_Port, LED0_Pin);2 K; c  O) k. x: o7 F
  11.                                 DAC_Value=3299;8 a+ `7 x2 j+ u" l/ n0 b. e( G
  12.                         }
    9 \+ U4 \  B9 ~& Q
  13.                 break;
    8 I2 w$ _- M. |4 x; H& E; C

  14. 5 _7 r3 k' H' H0 p8 i
  15.                 case GPIO_PIN_2:
    ; |  n( _* U& V7 i# ?
  16.                         if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_2) == 0)2 {) }- r( X% l# H5 G
  17.                         {' F2 ~1 x: [( |5 I, Y- |! ^
  18.                                 HAL_GPIO_TogglePin(LED0_GPIO_Port, LED0_Pin);4 Y& X0 l  Z& g: q/ U( w
  19.                                 if(DAC_Value<3200) DAC_Value+=100;
    ) y: y2 T! U  C5 r5 l$ m$ W: i) e
  20. 5 H% s# Y; h. X2 R' F& F
  21.                         }
    3 R4 b7 @- D' G9 N: h& g
  22.                 break;+ K% y0 B0 R1 W
  23. 8 T) U* G1 ~: ?- U) X
  24.                 case GPIO_PIN_3:
    , J0 P0 v0 q- Y( N$ a( i! ^
  25.                         if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_3) == 0)
    % t+ w$ \& w  a* Z2 }8 X
  26.                         {
    & D0 X, H' i& s) c# W/ }3 u0 I5 }
  27.                                 HAL_GPIO_TogglePin(LED0_GPIO_Port, LED0_Pin);! R1 G- x. L$ ^0 |+ Z  d* f; t: p8 \
  28.                                 if(DAC_Value>=100) DAC_Value-=100;! d9 b" s, j" _' J5 t
  29.                         }
    6 p( B4 h4 {, P0 P9 O
  30.                 break;
    8 N5 T) W, _/ f
  31. ( \6 Z6 H6 _* L2 g% Y
  32.                 case GPIO_PIN_4:
    ( ?. h$ {& m5 ]1 g% |9 }
  33.                         if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_4) == 0)
      `$ e; E9 g% _+ v" I$ o/ R0 P% H1 E8 e: J
  34.                         {
    # C9 G( A7 G- Z
  35.                                 HAL_GPIO_TogglePin(LED0_GPIO_Port, LED0_Pin);
    , b4 W& ~5 K2 I$ P
  36.                                 DAC_Value=0;/ U- B. Q& d. \& a: F
  37.                         }
    8 P3 j, R; ~" }  q& z
  38.                 break;; }$ ^! {3 f3 w! h
  39.         }9 N" A7 ^) f3 [" g# @
  40. }
复制代码
再看一下用SPI往LCD里面写数据的程序6 [% Z+ u# m7 h6 c
  1. uint8_t SPI_WriteByte(uint8_t Byte)7 A6 W" L8 Z0 [  O( N
  2. {
    ) s4 @) y. X/ |* L; Y% r
  3.           HAL_SPI_Transmit(&hspi2, &Byte, sizeof(Byte), 10);3 ^% j& _) b5 C. V' [2 m2 K, X
  4. }
复制代码
下面看一下主函数
& v! H; E2 w7 ?) q$ i. m, P
  1. int main(void)
    1 }8 c0 M7 c* m& P
  2. {2 s& u* o# h+ b& o, A) h
  3.   /* USER CODE BEGIN 1 */' s, \( S; B+ T) u" V( P; `
  4.         uint8_t buff[50];1 ?, p* f  k2 s* f5 e, s+ O  T% h& y

  5. ) B3 h/ F8 z# b3 V, n1 }8 P# A5 F
  6.   /* USER CODE END 1 */) o/ T& _/ i0 B. o4 N" O
  7.   / e- [8 @7 w* \6 z: _( d0 x

  8. 3 G- E/ d: v4 A4 K
  9.   /* MCU Configuration--------------------------------------------------------*/
    7 N. K) Q4 Y( B& I0 v; d4 `
  10. & I% d( R0 R0 {5 {! R' U7 X
  11.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
    8 h' G; W) F3 w6 @6 d
  12.   HAL_Init();
    # f. L. E/ |8 J' C' n" A
  13. 1 p  d4 g8 q( T* u0 G
  14.   /* USER CODE BEGIN Init */) x7 {! f; X* S" H6 ]
  15. ' Q! F) [( I5 t5 W6 b9 ?6 b
  16.   /* USER CODE END Init */, y) f4 ~) S/ d( I) v

  17. ' o" v5 F  L0 c8 X: t: x
  18.   /* Configure the system clock */
    / g7 Q% n' q9 z& \+ H0 ]( N
  19.   SystemClock_Config();+ ~; r$ ]  p- T6 l

  20. 1 `% ~1 `  x7 D- G! d5 H
  21.   /* USER CODE BEGIN SysInit */
    2 z: |3 E6 j* K" s8 q; i
  22. ' C4 s( j3 ~+ @9 l
  23.   /* USER CODE END SysInit */
    9 n  N" L7 v* q* O7 j

  24. , Y3 G& t# |' T( O$ E7 Z
  25.   /* Initialize all configured peripherals */6 E4 I0 Q4 I6 U/ e
  26.   MX_GPIO_Init();
    9 U+ B0 _* a  |" h, l( P) e% Z3 z& A+ i; X
  27.   MX_DMA_Init();0 K$ P- h& u6 Y; e: q' K
  28.   MX_USART1_UART_Init();4 v+ H$ f. f1 {
  29.   MX_TIM3_Init();" U9 y, E2 }2 h6 k4 G% a
  30.   MX_ADC1_Init();
    * h. U! V1 ?. c7 f) D
  31.   MX_DAC_Init();6 z# ~9 z9 @2 E8 |* Q
  32.   MX_SPI2_Init();5 T/ I! \2 B. H1 t1 [* J
  33.   MX_USART2_UART_Init();
    6 d& o8 p$ {' W/ H  W# m& ~8 b+ }
  34.   /* USER CODE BEGIN 2 */6 o$ q- ?) m: c* H

  35. : {( O! f* x9 D* h* e
  36.   LCD_Init();
    , d6 @8 j9 x1 h2 F$ I! @; |0 R
  37.   POINT_COLOR=RED;) D- l0 ^+ M' t9 p: [2 P- F0 _1 f
  38.   LCD_ShowString(10, 50, 16, "Welcome come to My world",0);
    - x# }( ]9 F' M+ A& A
  39. : w! S" y) X3 l) E8 F% t* n
  40.   //LCD_BL_SET;
    ( {1 F0 [, Q) ]: \5 k( u0 p
  41.   memset(RX_buff,0,RX_len);: w, c+ O- Q7 a' f
  42.   HAL_UART_Receive_IT(&huart1, &RX_temp, 1);
    9 S% A* U% [6 W9 j+ m; g
  43.   HAL_UART_Receive_IT(&huart2, &RX2_temp, 1);9 }% W9 ?& w9 z% z

  44. . y5 H2 R8 H" e8 y! {1 r
  45.   HAL_TIM_Base_Start_IT(&htim3);
    % W* k$ N! w$ U

  46. - R4 v- G- y" c% q* m1 c
  47.   HAL_DAC_Start(&hdac, DAC_CHANNEL_1);. k! x& l" C- o# o
  48.   HAL_ADC_Start_DMA(&hadc1, ADC_val, ADC_length);( R9 k4 {2 g; r( d( p
  49. & m# d" p3 [9 E7 X% ]- V
  50.   //HAL_DAC_SetValue(&hdac, DAC_CHANNEL_1, DAC_ALIGN_12B_R, 0x100);
    5 h- A6 H, E- B( T* ?
  51.   DAC1_Set_Vol(DAC_Value);
    : B9 @0 [7 O7 ^# C( m) E) _
  52.   /* USER CODE END 2 */, v: k% p/ k5 e/ H
  53. ; |( f1 P4 l4 ^! x) e
  54.   /* Infinite loop */
    & s  F4 ?( H! }8 ~- b) _5 R) t1 J
  55.   /* USER CODE BEGIN WHILE */: @4 d1 j7 p0 }0 ~/ a+ u; a: K
  56.   while (1)+ B! l: I% _8 ^: c& \- m
  57.   {
    " Z) L7 h% x, T! r
  58.     /* USER CODE END WHILE */
    % r0 m9 \4 P, ^8 M- @

  59. 6 j+ ^+ A' O8 A- Y' b" v' ?) R
  60.     /* USER CODE BEGIN 3 */5 O( s6 R' e' `
  61.           HAL_Delay(500);
    ' o( K* d. e  f
  62.           DAC1_Set_Vol(DAC_Value);
    7 I0 U4 ?% S+ }1 a) f" a5 A* t- Y/ [
  63.           sprintf(buff,"S:ADC: %1.2f  DAC:%4d\r\n",Get_ADC(),DAC_Value);
    & c+ ?# y: c5 P3 I. _  M
  64.           LCD_ShowString(10, 70, 16, buff, 0);
    " F. m- y  T$ R1 [

  65. / Q* G% ~3 V+ e; F8 J. F6 o
  66.           sprintf(buff,"S:DACG:%5d\r\n",HAL_DAC_GetValue(&hdac,DAC_CHANNEL_1));
    % C4 ?2 |0 `  K% [% [
  67.           LCD_ShowString(10, 90, 16, buff, 0);
    % I$ b' b, w; F( c: p
  68.           HAL_UART_Transmit(&huart1, buff, strlen(buff), 10);
    " B& {" C+ H7 ^8 E7 p  k3 b
  69.   }6 A* v. U- ^% A/ v7 k2 T" K/ `1 C: u
  70.   /* USER CODE END 3 */4 o# S+ m- \3 D1 t# z) N0 b
  71. }
复制代码
在STM32CUBEIDE中,想要调用sprintf()和printf()程序的话要在软件里设置一下
7 h% j. `  q, U5 W$ [+ Q
- R# G0 g+ W) C" A& o# B! n(PS:软件里面也要选Debug模式,Release模式好像编译不了这两个函数)  G3 D/ v9 }- v0 }# p
工程:Pro5.zip8 P5 n, n2 h1 Q

- y5 E- \+ c- w3 z
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
/ U, y6 |, _0 H; w' k6 d1 G9 }
感谢分享

所属标签

相似分享

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