STM32H5的外设也是相当丰富的,作为新款产品,简要测一下多个外设开启的情况。3 w* i7 {! u# p2 U
方便测试,串口第一个选择。使用调试器虚拟串口对应的串口3来做收发测试。开启DMA,接收使用IDLE+DMA来接收; Z) Q# m7 @: R& a9 `. a
不定长数据,发送直接使用独立缓存区。
/ e) r/ M9 U( q: s/ s. w6 J/ R
! X- v, @' b! V 开启串口以后,补充以下代码
* B% c, t4 P5 c% q1 Q; |
7 f$ U$ L' c4 X0 r4 J" S+ P- void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
1 x: b# V" l! x" @. h! n5 H# V9 t s - {/ \$ o/ l3 x- _% @9 K- I; t! P" k0 V
- if (huart->Instance == USART3)" Z" W$ Z. Q: t
- {4 @1 P; z3 D* X
- if (Size > 0 && Size <= 16)2 c# U. B) x2 u5 D6 _4 s
- {
0 X! E; U3 p G$ I) p+ s3 v" ? - recvLen = Size;
2 s8 u& W: W: V7 F - rxDone = 1;( s! e! Q% v8 B: o$ O
- memcpy(txBuffer, rxBuffer, recvLen);
: ^/ @& K9 q7 _9 _ - HAL_UARTEx_ReceiveToIdle_DMA(&huart3, rxBuffer, 16);- F$ _+ _% ]( X0 I+ V
- __HAL_DMA_DISABLE_IT(huart3.hdmarx, DMA_IT_HT);
$ D9 O, }; W: b, `7 l* f+ [ -
+ c; [, F% h- B. N - }
v+ C/ T/ f$ ]; [" K% ? - }: e4 t3 b+ [4 h3 i2 j
- }& \. N: u1 ]5 [ e
5 F9 h. v, i L. X- N! ]5 k* ]- void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)' \4 K/ w4 L- [" Y2 _2 m
- {5 o0 C, u7 t. n s* H7 [- r8 @
- if (huart->Instance == USART3). B, [* I7 \ n9 p5 J4 }
- {, w' z& G. }& \( V6 l% d
- txBusy = 0;* q4 G+ [7 x* N' l3 L
- }
, U4 j" F+ a' I+ m& F - }( _2 y( k& l$ `" |
- 5 K2 G5 _. c( U9 n7 v
- void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)( P$ C' W% O" ?5 A& J* x# h$ ~
- {. b% v* Z: Z2 V8 o" K6 C# M
- if (huart->Instance == USART3)" v- h' P0 K7 A$ A3 s f% ^8 z6 K
- {2 L) p1 ], y& g8 [; \8 p- ^
-
: F0 U8 @9 ?: E" n# v - HAL_UARTEx_ReceiveToIdle_DMA(&huart3, rxBuffer, 16);
7 O- s$ x- `% [3 F. H6 p( O* n& E - __HAL_DMA_DISABLE_IT(huart3.hdmarx, DMA_IT_HT);
! G$ b: ~2 o7 z, {/ S# C7 W: G - }4 u$ @! i0 ^" \/ N3 {
- }
复制代码 然后再开启一个定时器吧,这个也是很常用的资源。TIM1常规溢出中断,点亮LED。, B$ }# F% \4 G" Z7 G
5 M$ I# [1 R0 s: b: q& d8 Q
算好1ms定时,中断回调内写个GPIO翻转2 C' k Y6 R& U
0 ~- N( K0 k, x$ g
- void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)' n2 G1 f* H0 c) w! z0 W5 B
- {$ a \' n+ ?& a2 T: y
- static uint16_t cnt = 0;/ q; `/ _" E2 e' W
- if (htim->Instance == TIM1)* ~* H$ F1 W* ]6 h6 P5 N6 \
- {& I( V1 \+ A9 x- {! o" D! Z t! k
- cnt++;7 }+ p( j; Q2 a: u! x
- if (cnt >= 500) 7 C- s+ b5 ] Q1 I( H
- {
q; e) Y' E% J+ T - cnt = 0;6 K" }5 y3 S9 Y2 C! b# V% j# V
- HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin); 1 i7 w( j( v0 h
- }
6 x: f/ D0 x0 y - }2 p+ c) t9 J/ \
- }
复制代码 模拟外设也开启一个吧,ADC算常用的。读一下芯片内部温度。使用DMA连续采样。 x N( q- b" ~1 g! ]3 e L
( e* l! X3 Y+ U" g, A3 d 代码里需要读一下ADC值并转换为温度值,这个库函数以宏定义方式给了一个很方便的函数。6 U& _/ o6 d) G* s7 z
+ d1 [/ `! d+ q
- __HAL_ADC_CALC_TEMPERATURE(3300, adc_raw[0], ADC_RESOLUTION_12B);
复制代码 正确的读数如下$ b) W% x3 V. |% C. e& t% {
5 b& k1 C! d ~, k* t1 m 开始一直读不对,然后查问题,想到ICACHE原因,但也没HardFault,并且核对了MPU配置+ n( u( J: u. c$ x
* v; g7 K; p( a1 ` 实在是没有想到问题出在DMA数据位宽上面,串口打开DMA默认是字节,ADC居然忘记了这一点。修改后就没问题了。串口助手持续收发测试,可以看到在TIM和ADC同时工作的情况下并没有丢包。持续测试一段时间如下,没有问题2 c) h+ e5 t1 v) [1 ^2 k C
! [$ Q$ g" L2 K9 D1 a 以上也是简单的日常应用测试该产品没有明显BUG,是否满足实际工况根据需要做针对性压力测试。
: S" h9 Q1 ]5 w; ^
$ c& t" v4 W# p0 `; o
9 b# x6 P- ]' B, \6 C& c
& C8 ?3 Y) Z+ L: U8 M9 J0 a, a2 ?* }5 i
3 C0 `) g1 _: [- r6 |8 | |