HAL库每天一例】系列例程从今天开始持续更新。。。。。# ]# r& o" l! a# g: X; v
我们将坚持每天至少发布一个基于YS-F1Pro开发板的HAL库例程,* _% B( ] h- l# h5 g- C1 E
该系列例程将带领大家从零开始使用HAL库,后面会持续添加模块应用例程。8 H& _$ t- d3 \/ B
同样的,我们还程序发布基于HAL库的指导文档和视频教程,欢迎持续关注,并提出改进意见。 q2 k: q3 W, J+ ~
" Q% j9 S8 _! z# S* p, N例程下载:$ d& n5 t2 F# P* H
资料包括程序、相关说明资料以及软件使用截图- M6 [" S6 }1 Z' c3 `) y; K
百度云链接:https://pan.baidu.com/s/1i574oPv
# B6 u" i3 s9 N2 v" J* Z) D密码:r3s3! q" j9 N# f4 L) y/ f7 W) g- ^
(硬石YS-F1Pro开发板HAL库例程持续更新\2. 软件设计之高级裸机例程(HAL库版本)\YSF1_HAL-101. JTAG功能引脚做为普通IO使用)9 E, ]$ ?- u0 ?8 D6 Q
" ^' s0 ~5 t; v1 |/**0 ]& \0 }/ a) D
******************************************************************************% T8 d9 C& {/ \$ w9 G
* 硬石YS-F1Pro开发板例程功能说明
- ]3 ?8 G5 q8 ]8 `5 A *
) h, w8 l5 B2 r0 h4 Y ?8 E8 Y * 例程名称: YSF1_HAL-101. JTAG功能引脚做为普通IO使用
( ^( T$ l3 l# T I) b( {9 M * 6 I8 j2 u! r1 {! p
******************************************************************************7 ?1 D& v( Z5 Z7 Z x! E
* 说明:! c4 Z( T! M) U- W1 f: B! S) K2 N
* 本例程配套硬石stm32开发板YS-F1Pro使用。7 T& ^/ y- Z! P, b C' F7 X6 \
*
! n q' g9 p9 _: { * 淘宝: z8 l7 w% l( P
* 论坛:硬石电子社区
& Q2 D7 Q; B2 S6 V& A3 w8 P: k6 g * 版权归硬石嵌入式开发团队所有,请勿商用。9 o/ i4 ]; u2 I1 |4 r( K
******************************************************************************
; I0 `5 y9 u( o3 m$ A- b */4 K/ v5 G8 h, h9 G3 B' Y
' G" ]5 x) d# ]$ |$ b【1】例程简介
: {8 M8 B p+ T0 w 使用stm32 HAL库函数实现LED流水灯效果。通过这个例程熟悉stm32 HAL库函数编程思想。
% }5 S( \. G* i1 A, p1 Q0 ]9 z5 G$ {3 i
stm32拥有非常多的IO引脚,这些IO引脚可以用作最简单的控制电平控制,可以设置为输出高电( k% y$ D6 P6 B
平(数字量:1,对应3.3V)或者低电平(数字量:0,对应0V),也可以设置为输入模式,读取这个IO引
% c* u9 }0 x; {6 a+ y& r8 H& o脚的电平(比如用于按键状态读取)。 本例程我们调用HAL库函数方法来实现对IO引脚的输出高低) f" {9 l* Q" B! r7 N8 r
电平进行控制。
+ ?5 D6 e9 s+ h4 R
! R9 Q/ L6 v) e2 R【2】跳线帽情况
% w7 b) D3 a5 I" C******* 为保证例程正常运行,必须插入以下跳线帽 **********2 g% e& ? H5 ^- [4 c
丝印编号 IO端口 目标功能引脚 出厂默认设置
3 M; n2 D k& d% M4 [0 w0 ^! l" C, t9 _* V3 f) [; V" Y
9 {: W" J/ `+ ~) R$ W! M# R
【3】操作及现象% b: |# [0 X* |8 t
使用开发板配套的MINI USB线连接到开发板标示“调试串口”字样的MIMI USB接口为开发板供电。8 S$ ~/ O' G" ]/ [
下载完程序之后,使用万用板测量PA15、PB3和PB4引脚电平可以观察到电压连续变化。9 J/ Z: A: m' N0 N
9 g7 n. `$ ^7 D
/******************* (C) COPYRIGHT 2015-2020 硬石嵌入式开发团队 *****END OF FILE****/. j( D4 C" [6 v
. `/ E7 l) [: S3 I5 t
! c) f+ l3 J0 P$ @
, V3 |# E" }/ r* H! k$ g7 C, P
: [- ]# I4 l, V+ r d9 H" k+ F, Amain.c文件内容, N# A7 O1 [& T3 n$ {8 g, i2 h" e
- /**
, f" M1 c# z3 [) h9 D& \/ {3 ?# m- G - ******************************************************************************' A0 f7 k) J, w O& \0 K- T' v" v
- * 文件名程: main.c 6 S) |1 G/ Y7 C" y6 o+ H
- * 作 者: 硬石嵌入式开发团队
$ g2 K6 V$ b5 | - * 版 本: V1.05 J6 P0 C) h8 m& X
- * 编写日期: 2015-10-04( w: M9 T7 G+ R; w
- * 功 能: 使用通用定时器功能输出PWM波形
9 X3 |7 i. u( @% ]9 c! f - ******************************************************************************5 b L- A2 r6 F; d( V3 I8 B1 ]1 p, w
- * 说明:
3 J! B0 i* U8 q! x/ z+ R9 A: s - * 本例程配套硬石stm32开发板YS-F1Pro使用。
4 K$ _5 h7 w3 O) i8 L2 n# w! n1 n - * 6 \2 d& U) m! D* |$ @9 I
- * 淘宝:
3 g% L; w5 I1 ]: }: k" h' O - * 论坛:http://www.ing10bbs.com0 t9 `* A9 f7 H! Q6 }/ M* w0 Y# R+ Q
- * 版权归硬石嵌入式开发团队所有,请勿商用。
- e9 t5 E% T* N W! _1 K - ******************************************************************************
% H# y, O! U( e! ~: {/ e0 u - */
0 w3 O3 [1 d: u( U0 v - /* 包含头文件 ----------------------------------------------------------------*/3 X p$ s2 Z; Q
- #include "stm32f1xx_hal.h"
. U$ r8 S2 B* u) C( U - ; w% e; y3 c5 K1 `& Z
- /* 私有类型定义 --------------------------------------------------------------*/
8 ]( e8 r0 J2 e* r* q - /* 私有宏定义 ----------------------------------------------------------------*/
) c" j% V% x) v - /* 私有变量 ------------------------------------------------------------------*/
2 c! L. @3 c0 c! u7 E' w# W$ e7 o - /* 扩展变量 ------------------------------------------------------------------*/- S" f5 [2 k$ a- @& u
- /* 私有函数原形 --------------------------------------------------------------*/6 w( B8 `2 M. @1 X9 p+ c/ V
- /* 函数体 --------------------------------------------------------------------*/5 t* q/ B& T7 m- ?& @
- /**
+ \1 z8 D: x; _- S9 M$ ~ - * 函数功能: 系统时钟配置* A# W2 n" R3 L, d
- * 输入参数: 无
! d6 T; e0 ?# D# P) q2 c) R$ l - * 返 回 值: 无3 j3 S! g7 u: m/ u! D. e% A
- * 说 明: 无
# e q; P* x8 E% \: v, l - */
- U6 O' G6 ^* [ J - void SystemClock_Config(void): `# o5 r3 C" S# p& w( L
- {
* S; G, k- ^! ]* s; S+ U - RCC_OscInitTypeDef RCC_OscInitStruct;5 Q+ H% F& c( J- R
- RCC_ClkInitTypeDef RCC_ClkInitStruct;! n8 G% s/ G+ j
-
' x& J' @, Q1 r8 J - RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; // 外部晶振,8MHz# c% v$ O) T4 D7 k- r! G
- RCC_OscInitStruct.HSEState = RCC_HSE_ON;
7 v. k1 t5 i" h8 S$ a9 B. w7 _ - RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;5 D8 {8 ^/ c6 ~8 G C Q3 ?
- RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;& ?; v- j' X% e, Z9 k* \2 B& p9 w# G6 f
- RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;; ^( s/ r! _: c6 ~$ o
- RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9; // 9倍频,得到72MHz主时钟- Y5 d2 O0 z" E$ V* L) ?- t+ d6 [
- HAL_RCC_OscConfig(&RCC_OscInitStruct);
* G3 N) k% d% q - & j4 g5 C. p# F% ]
- RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK6 ]0 q: X7 Q( U) [ ]8 A
- |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;4 x& Y" X2 W9 z. }" T: d- M
- RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; // 系统时钟:72MHz# q' O Q& f/ z4 `5 w+ G% M
- RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; // AHB时钟:72MHz4 v/ a5 V T" C Q; L
- RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; // APB1时钟:36MHz5 V* m; n9 V$ S6 y% [
- RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; // APB2时钟:72MHz
; Y# C. ?. w1 T! z7 C - HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2);: p$ H! |2 r9 j0 g+ @
-
. _, C+ O2 J& [# L5 e4 }- G - // HAL_RCC_GetHCLKFreq()/1000 1ms中断一次! |/ ?8 L+ v i) k4 Y
- // HAL_RCC_GetHCLKFreq()/100000 10us中断一次) F" P2 t2 H5 k5 }% H: [2 A4 n
- // HAL_RCC_GetHCLKFreq()/1000000 1us中断一次
$ Z: T7 k w4 r! r: k0 w - HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000); // 配置并启动系统滴答定时器8 H3 b$ u7 M9 P% D" _
- /* 系统滴答定时器时钟源 */
6 n" M! ?$ Q2 [9 M: l2 W/ S - HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);7 J: s1 q6 @& B* U% k0 V
- /* 系统滴答定时器中断优先级配置 */9 q/ W3 ]; t3 w4 w$ x6 y% V
- HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);$ B: W* p1 w4 E4 x Q! d
- }
7 m. r. f9 l1 b3 X3 j - 5 V. ^ W8 c( P/ }
- /**+ {( V6 |, z; f, Q5 y6 w( l
- * 函数功能: 主函数.
0 D6 N0 z' P9 g$ {- E) \ - * 输入参数: 无
5 f- @& f4 O% _1 o( j: O2 ` - * 返 回 值: 无
5 E2 j3 H0 a9 o# J W0 g* W - * 说 明: 无5 X6 r( f: C3 q3 h8 U
- */
* z9 o2 H8 R' d. M+ [. B3 n - int main(void)
: Q6 R7 _1 ]" Z% z* ~ - {* \$ Q1 a) S8 b5 J( x
- /* 定义IO硬件初始化结构体变量 */2 M9 D4 ]( a6 B( b) q4 n
- GPIO_InitTypeDef GPIO_InitStruct; * h5 e# h; K8 \8 z
-
! m( G& {" a4 m1 u4 C6 v* I. L+ c5 p - /* 复位所有外设,初始化Flash接口和系统滴答定时器 */3 [- W7 W, M: V C$ R- n$ [ w7 q4 ]" ^
- HAL_Init();4 Q. q2 k) z4 f G
- /* 配置系统时钟 */
4 A& ], _* E r" u: } - SystemClock_Config();. {4 O9 J% {6 F( j; K1 W4 ?1 r0 P
- 5 @7 b; U7 d L8 [% ?8 H3 Y* [: ~$ O) \
- /* 外设时钟 */
' q; W- ]3 _8 j& {% \3 t/ A) T - __HAL_RCC_GPIOA_CLK_ENABLE();
( g: _5 _3 x. j7 U5 _4 y - __HAL_RCC_GPIOB_CLK_ENABLE();
' ?/ R" B: x& q/ r, y - P# D" p5 ~- O, r' O" x
- /* JTAG-DP Disabled and SW-DP Disabled */4 y4 ?- r% \& x0 \4 T1 `
- __HAL_AFIO_REMAP_SWJ_DISABLE();" {% a0 J( p9 X, g( c2 l* |
- 6 H: ^6 M5 U" n6 @2 j
- /* 输出低电平 */& P+ h, Z0 p u6 `4 D" a) Y3 I
- HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_RESET);
9 \: E/ p; P+ h/ g1 w+ w$ G2 B - HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3|GPIO_PIN_4, GPIO_PIN_RESET);
3 M0 O, g0 f" g9 I4 |6 _ -
6 E8 k D Q& U/ \ - /* GPIO配置 */
6 M) \& M" \' X$ p0 Q9 U - /* 设定引脚IO编号 */1 h) W( W; c$ M, r
- GPIO_InitStruct.Pin = GPIO_PIN_15;' r8 q6 s v6 S% q+ k
- /* 设定引脚IO为输出模式 */
* e( e% [+ k" I" z x. n; Z: s, q - GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;& B; E" P% D6 V2 T5 Q
- /* 设定引脚IO操作速度 */
r* G) ]1 f6 G V+ b% I0 e; h P! I$ U% t - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
+ H4 _4 G5 \- c - /* 初始化引脚IO */+ E2 E. B7 [8 N! R
- HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
8 |& V# f! L! \8 y; I+ w -
( O+ w1 J& c6 d2 b& A - /* 设定引脚IO编号 */
. K+ n2 ]+ p/ m& m9 ~( N! n - GPIO_InitStruct.Pin = GPIO_PIN_3|GPIO_PIN_4;: ^ u) B7 K# y
- /* 设定引脚IO为输出模式 */
. x+ x; _- n% [1 x; N$ z; \, J - GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
9 { ]- Q3 K% _1 T# F - /* 设定引脚IO操作速度 */
3 t$ V7 }: K) y7 |2 [; b* |2 b - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;/ S9 O' @% q( F( u3 v4 _+ \
- /* 初始化引脚IO */, ]: p- e- P7 L9 }5 m
- HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
# A% v7 e& W$ ?7 | - 2 z' F$ c- R7 G) Y
- /* 无限循环 */' }3 `1 \+ f& }
- while (1)
- C: N- t* F1 m/ L( O$ P% D) f - {9 J5 k* Y% `, w5 p0 o
- HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_15);
9 v# d6 o: c& s) j* j+ y9 N6 J! i) { - HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_3|GPIO_PIN_4);
! v& P. g; D* f$ I' i - HAL_Delay(1000);
: m' Q0 m1 [7 Y: c6 t( D5 A+ M - }
' {' `, P/ ?1 j" v8 y& \ - }9 W- j4 e. `3 s7 b
-
: F$ g8 i; ^( b* C0 e9 M8 O - /******************* (C) COPYRIGHT 2015-2020 硬石嵌入式开发团队 *****END OF FILE****/
复制代码
2 i. P, _% R- w0 W @" e, C' A2 m# V. K! R0 p' }, m
; s( Z# I m( S9 F |
__HAL_RCC_AFIO_CLK_ENABLE();
多谢回复,但实际上是有的
点评