HAL库每天一例】系列例程从今天开始持续更新。。。。。- u: _2 a- l% s$ L2 L
我们将坚持每天至少发布一个基于YS-F1Pro开发板的HAL库例程,4 E7 Y- c% U+ g2 x$ ~$ U
该系列例程将带领大家从零开始使用HAL库,后面会持续添加模块应用例程。
, M5 z. l& g+ a) ]9 S q e' u同样的,我们还程序发布基于HAL库的指导文档和视频教程,欢迎持续关注,并提出改进意见。6 ]& Y) ?/ ~$ x% d
8 S+ B0 i3 h8 U+ W! z例程下载:
6 n7 `% ~, G5 y' Q) l" H* N2 L资料包括程序、相关说明资料以及软件使用截图
: ~3 [' O: X" e" \- }百度云链接:https://pan.baidu.com/s/1i574oPv ( I4 x' G0 ^. ?, ~
密码:r3s3: [/ ]2 y5 _3 a- d
(硬石YS-F1Pro开发板HAL库例程持续更新\2. 软件设计之高级裸机例程(HAL库版本)\YSF1_HAL-101. JTAG功能引脚做为普通IO使用)6 K6 o( X/ U; P6 }
- P" m% a! p) ~8 j2 G7 o/**
7 H5 e6 L: f) O, k" H4 J ******************************************************************************
! u( m! \% u- W * 硬石YS-F1Pro开发板例程功能说明
: s$ D! `! t4 |3 F" M *
1 z7 R6 U4 x: \2 t$ ]+ a7 r' M" [ * 例程名称: YSF1_HAL-101. JTAG功能引脚做为普通IO使用
6 s; E) Z' F5 b* @: M *
$ `. I% G! M0 t" U ******************************************************************************
& Z' v$ y; U+ N, ~6 U * 说明:
& a8 q8 C5 {. m# y" J9 r1 @" H * 本例程配套硬石stm32开发板YS-F1Pro使用。8 `/ W$ @2 ~7 ~& U6 f
*
/ ~& M$ ~, W) g8 `! I9 m * 淘宝:0 N7 p$ g6 A6 t
* 论坛:硬石电子社区
! L$ |8 G0 V; u4 { * 版权归硬石嵌入式开发团队所有,请勿商用。; c' @% Q4 B8 g% q4 r
******************************************************************************
% g: u4 K3 n ^2 ~ u */3 Q+ U; B2 I7 |* k, [9 Z2 g
; N* V D' E# m$ N【1】例程简介
. j3 h) G5 |# c7 r4 y" Q- W; G8 |! | 使用stm32 HAL库函数实现LED流水灯效果。通过这个例程熟悉stm32 HAL库函数编程思想。' e! k3 E/ m% g; C3 l
: ?5 q! N) ] Z& }0 n( r' F4 `, j
stm32拥有非常多的IO引脚,这些IO引脚可以用作最简单的控制电平控制,可以设置为输出高电0 s6 K: S; \$ [6 B5 ?
平(数字量:1,对应3.3V)或者低电平(数字量:0,对应0V),也可以设置为输入模式,读取这个IO引* k9 d2 X; J# k
脚的电平(比如用于按键状态读取)。 本例程我们调用HAL库函数方法来实现对IO引脚的输出高低
' ~. Q" Y( K& y+ I电平进行控制。 " g: l8 E. b! Z1 \) j
% M8 b& p' s" d* Q& \; t【2】跳线帽情况
" n1 M9 D; ~/ R******* 为保证例程正常运行,必须插入以下跳线帽 **********& Z" A' J+ `/ O; z1 r* k
丝印编号 IO端口 目标功能引脚 出厂默认设置
0 \& D. \) O7 j2 a( X/ F0 [
$ ]4 U; h0 p$ x. U: h0 A
' J' b4 B" ~9 a7 D. C【3】操作及现象
! m7 E _4 ?* u. @, C 使用开发板配套的MINI USB线连接到开发板标示“调试串口”字样的MIMI USB接口为开发板供电。7 H3 t# h- l* i# H$ u
下载完程序之后,使用万用板测量PA15、PB3和PB4引脚电平可以观察到电压连续变化。) `0 x6 C4 f( U
) e D: W* r! s/******************* (C) COPYRIGHT 2015-2020 硬石嵌入式开发团队 *****END OF FILE****/
; S& R, F4 }! h* [7 V
3 V, ?0 S' Z1 ?2 x4 B J/ V! \
6 L+ @# ^. D1 z# v; M! l
- k9 \; F. F4 t
7 [* Y0 r0 d$ @main.c文件内容
: R" m$ O. i8 m2 d# e/ P. @( @/ e- /**# T5 t3 c' T6 N* b1 }8 X5 J
- ******************************************************************************& q& l# X5 X$ f! N6 Y; E
- * 文件名程: main.c / l- q8 z/ x( m$ Z; n
- * 作 者: 硬石嵌入式开发团队) {- _$ b! z, N8 S- v; @
- * 版 本: V1.0
& E# s# ]. z) C" h! t" Q! ?. v - * 编写日期: 2015-10-04
( }) P5 r5 G6 e% Q7 C1 q, ]% r% K' R - * 功 能: 使用通用定时器功能输出PWM波形1 |' |2 }; B2 r; T* D. d m
- ******************************************************************************
! I0 B' N. N! H+ b# G4 i# x - * 说明:
: _) r9 w/ e. D* C, ~' s$ S - * 本例程配套硬石stm32开发板YS-F1Pro使用。; |& Y5 A7 r9 y) W, ]5 m5 U3 h
- *
/ L d) Y/ t' J9 j, k3 {0 X: Y - * 淘宝:" S) B' Y4 C( y/ Q. \- W7 X
- * 论坛:http://www.ing10bbs.com
+ r" k ~& w( M1 D; X - * 版权归硬石嵌入式开发团队所有,请勿商用。2 F3 Y" y- S" ~! o) s
- ******************************************************************************
/ ]$ M# F$ d2 Z2 m$ ? - *// y0 e/ \) K/ `3 U
- /* 包含头文件 ----------------------------------------------------------------*/
3 W- n% I3 Z/ d/ e, m* j - #include "stm32f1xx_hal.h"* g, m3 S( M% l
-
7 }4 N5 y& w8 N4 _# m - /* 私有类型定义 --------------------------------------------------------------*/; V2 V/ f* h" y. k; ~. H( G
- /* 私有宏定义 ----------------------------------------------------------------*/
. D- Y' l' _9 ] U - /* 私有变量 ------------------------------------------------------------------*/
- `% H" f1 u( U+ k7 M. x1 ~+ ` - /* 扩展变量 ------------------------------------------------------------------*/
1 O& P3 C/ n/ [0 B* x$ B. j - /* 私有函数原形 --------------------------------------------------------------*/
w7 r& a0 D) [% ? - /* 函数体 --------------------------------------------------------------------*/0 O; t; r9 I# }4 G' M+ m* X, j
- /**# _# I3 B1 s+ f3 Q6 l
- * 函数功能: 系统时钟配置5 c" k5 {/ P% i* M
- * 输入参数: 无
/ w- u6 w, e( D- M - * 返 回 值: 无+ w; z4 P# r; {# q1 ^
- * 说 明: 无
' a! i- Y0 @4 \6 a9 @2 k - */8 M+ T' U3 d8 Q/ a( z7 b
- void SystemClock_Config(void)" _2 m. ~: K- E) j- L5 r% b
- {3 H" W$ |& m9 l* J! c1 j
- RCC_OscInitTypeDef RCC_OscInitStruct;
9 Z# C' B# q% g! v! g - RCC_ClkInitTypeDef RCC_ClkInitStruct;
. Q3 x& k. {% b) h0 k/ A5 }% L - 2 G6 }) z& h6 c1 @6 S8 _/ B+ [7 R
- RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; // 外部晶振,8MHz m( L" D3 s: q E& e8 _
- RCC_OscInitStruct.HSEState = RCC_HSE_ON;
1 V# c! h, z2 y2 I& S, ?6 z/ G& t - RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
4 Y2 Q+ W; C2 {+ i0 u - RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
]: w1 a# N8 v - RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
+ o# S+ ^ s* W+ P* T - RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9; // 9倍频,得到72MHz主时钟
4 u* I H* @. g' Y0 |! { - HAL_RCC_OscConfig(&RCC_OscInitStruct);
' a* s+ \7 l7 R! T$ c! S - 1 g" ]* u3 F: u
- RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
! W4 |9 J7 T+ G6 g9 v - |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;5 U, h( O! B# S9 ^" Z
- RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; // 系统时钟:72MHz3 V: A2 N( i; E9 L) X$ i
- RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; // AHB时钟:72MHz
( B* C) w6 e+ ?4 o - RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; // APB1时钟:36MHz0 n" c; |; l( t! _ G
- RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; // APB2时钟:72MHz/ M% p1 p2 O T
- HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2);
' e4 G7 D; O3 z) K+ r4 @2 d; P -
9 w0 q+ F+ w! Q( _$ S, K/ ? - // HAL_RCC_GetHCLKFreq()/1000 1ms中断一次
/ {/ C9 o$ K4 G& q1 I# E( Z" p- d( y - // HAL_RCC_GetHCLKFreq()/100000 10us中断一次: m3 V: |* J4 i: z6 P9 a, |9 I
- // HAL_RCC_GetHCLKFreq()/1000000 1us中断一次2 o6 D" ]6 o( R- u% h( e3 T
- HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000); // 配置并启动系统滴答定时器( ~3 @# g& X+ G, w7 a! \/ v
- /* 系统滴答定时器时钟源 */- P: k* c' Q- _0 a+ A
- HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
3 c; X% ^+ w+ ]9 v8 w: v - /* 系统滴答定时器中断优先级配置 */
" u" Z/ V: m+ f& v0 n - HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);! B! u9 T- T/ p+ D
- }
8 A0 {- Y6 ?" O" z6 F" o M+ q - $ S `: X5 T! d. a6 G7 ]# @
- /**
6 X% G _; Q- D( k- b - * 函数功能: 主函数.
6 B A% D7 t d7 m; Z - * 输入参数: 无3 P0 I. l/ E' H/ J3 k
- * 返 回 值: 无; @2 l1 N* o# X8 v" E% r5 M A
- * 说 明: 无
' Q* Q5 ~; q; j6 n3 A8 A: [8 F - */, b$ E H6 f7 m& U
- int main(void)
2 `( [: C8 w% F3 D. p' A - {
4 f6 j( p/ |4 E1 _ J" s/ L2 l - /* 定义IO硬件初始化结构体变量 */5 Y- h+ A/ R+ D, B( ?7 M+ O2 u
- GPIO_InitTypeDef GPIO_InitStruct;
) s5 C/ \4 E& ^ f. c9 ^6 P -
+ @6 M3 G# S9 ^3 P0 p- ?' W, j - /* 复位所有外设,初始化Flash接口和系统滴答定时器 */' g6 y5 R9 p5 u6 A6 A2 P
- HAL_Init();$ }0 i5 t9 G8 ~- t3 k4 U( {
- /* 配置系统时钟 */5 k) x% d; A* ^/ h" r/ [+ J
- SystemClock_Config();
- D0 S* j" k& P g( @4 C -
" t* J" m5 ^: X- Z ` - /* 外设时钟 */3 }% `, f! C3 a$ M
- __HAL_RCC_GPIOA_CLK_ENABLE();
% n4 v/ p0 z8 z5 T* O+ y - __HAL_RCC_GPIOB_CLK_ENABLE();" [8 u# e+ i3 x, J! k; D. m
-
- x! E. l, Z- x - /* JTAG-DP Disabled and SW-DP Disabled */
% i1 @/ h- C/ d6 o0 l) L - __HAL_AFIO_REMAP_SWJ_DISABLE();* W' R7 F/ t+ X; G3 |* u0 j
- 2 m4 B# W+ \6 }, E% ~$ N
- /* 输出低电平 */0 f+ G& X% n+ ]6 L! n5 t2 h
- HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_RESET);
- Q- ~% l( |& c& c" Z% g - HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3|GPIO_PIN_4, GPIO_PIN_RESET);
) W1 V" k* ]( a) k* ?6 m' i) ^ - 9 X `7 g$ z3 P/ K/ X- K
- /* GPIO配置 */
$ l0 g& I+ F. m8 ~0 e/ u9 n" t5 a4 } - /* 设定引脚IO编号 */
: ~, }/ T* J0 L3 a - GPIO_InitStruct.Pin = GPIO_PIN_15;# V% o+ b; s5 `5 h
- /* 设定引脚IO为输出模式 */
8 I' x1 d8 _4 m - GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;' Y# Y9 a% P5 }6 t# o/ s7 E$ ?( r% x
- /* 设定引脚IO操作速度 */
2 }4 @0 R& w# y" D$ ]! w* I5 e/ L - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;! E! Q, G" k1 R9 u6 d
- /* 初始化引脚IO */
+ S! _7 s- D, v - HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);, g) p: @* L: j6 Z4 ~0 |# r1 `. V
- 3 ^8 O% P, h, S4 Q% j; W q
- /* 设定引脚IO编号 */# s8 C5 |% z0 o) d9 p8 X
- GPIO_InitStruct.Pin = GPIO_PIN_3|GPIO_PIN_4;/ N: W/ H0 o6 L v
- /* 设定引脚IO为输出模式 */, L9 U: [7 H! n( x' r6 ~
- GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;8 Y* a) ~3 P0 w t
- /* 设定引脚IO操作速度 */
! [; b5 Y9 n. y - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;4 k5 n# W9 B9 i' [4 y Z: X' e
- /* 初始化引脚IO *// ?4 w+ ]1 T% p4 y
- HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
( G. g1 k7 D" I9 n4 r, G9 t -
6 v' _2 l W Z/ W - /* 无限循环 */
2 z( F/ b' w! z( V& x - while (1)9 J4 Y0 `" S$ Q. q
- {
4 C, a+ P ~( ~1 E% p/ d - HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_15);
9 R! z4 ]2 n; d- J" Y/ G - HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_3|GPIO_PIN_4);
- i. C0 ^/ e/ o* G- [- D - HAL_Delay(1000);- J* f6 j, P& K9 n
- }
0 H0 v6 s& |5 o' u) ]$ m% n - }, u* ~; K8 N2 T; M5 ]$ f7 d
- - z3 H: H- C( }$ b, t2 Y
- /******************* (C) COPYRIGHT 2015-2020 硬石嵌入式开发团队 *****END OF FILE****/
复制代码
6 x6 u/ Z. x- w: Z
9 ~% B0 |: t" `0 ^0 @, {" t
2 ?4 `3 K. z$ G9 X |
__HAL_RCC_AFIO_CLK_ENABLE();
多谢回复,但实际上是有的
点评