学习一款芯片,首先从点亮一颗LED开始,本程序基于RIBEE_02电路开发板,点亮一颗LED灯,驱动管脚为PD0。扩展实训中增加蓝灯闪烁代码。! E1 i3 c. `1 T1 B0 \$ ^6 G8 N
- B+ |3 U/ h+ Y, _2 f1.上芯片管脚图' u- |8 b; o6 `6 C
$ ^) ^+ F9 g& Y2 K9 @
! {8 N! o! w% X: c* \# X7 j( P
+ N8 C2 O$ w2 Z. |+ N, d: a4 [5 N+ L" f5 q/ }) L
2.配置晶振,启用内部晶振,失能外部晶振。
; d* z K7 z' r. E7 L: V( K) {( Y5 j+ x( F
9 ?3 n) k# d5 q6 a& e3 Q5 l: a+ l9 r: g; h, v8 I
3.配置晶振,倍频与分频,外设基础时钟配置为64MHZ。; `' V* d/ L0 h4 H8 I8 W
: n7 a( D" g/ w9 X4 Z
7 W' D9 s: L5 W) ?+ O, m" b. L) h) n
" b* h: O: G7 q9 J x) h5 C 3.配置GPIO PD0管脚
/ g9 D$ C k4 W" c) e6 Z0 ]. b0 ?1 m& W- T3 u* C# b5 b
8 e2 r+ {- }% r! j7 U }
: q4 [; C: r, @! e+ f/ q 4.直接上程序代码:3 O9 ?" N- V! s5 x" t `
& }, z/ ^7 J6 o
- #include "main.h"* s- G K, m. `- W0 f" }
- void SystemClock_Config(void);& s4 [5 m# E' ?3 E3 F. J
- void GPIO_Init(void);3 }9 d5 G( b# t# F/ o6 ~
- int main(void)
& E, J% ` z, S1 { - {
5 y* g8 w% c) I+ i! ]) V5 A: ]4 S - HAL_Init(); //HAL库初始化
1 U$ I3 _0 _( V7 H% C* ? - SystemClock_Config();//系统时钟初始化3 B& |' E6 Y7 y0 U% c. |1 x' g
- GPIO_Init();//外设GPIO初始6 d N$ A& t, Q' }8 l- {) I9 N
- while (1)4 d. d2 k: f% J- [; Z6 o) W
- { h2 ]: q- p' f# k a
- HAL_GPIO_WritePin(PD0_GPIO_Port, PD0_Pin, GPIO_PIN_SET);//BLUE LED ON 蓝灯亮
; a. H5 Q& H4 t. s% z8 i( d {: r - }1 a/ K u% |/ C
- }
" s0 B! i5 i7 z' E - void SystemClock_Config(void)
; E# D4 y, s0 K R' Q" e - {
0 f+ j7 g: U; V6 m( q( M - RCC_OscInitTypeDef RCC_OscInitStruct = {0};
& V4 u, l& ]: V. P' f - RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
& Z- C4 z: S% Z9 F9 N$ z+ h - HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1);
& C3 E2 [; Z, j - RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
4 R* y7 v" Y8 R - RCC_OscInitStruct.HSIState = RCC_HSI_ON;& h$ o' O2 C* [. D% h* w
- RCC_OscInitStruct.HSIDiv = RCC_HSI_DIV1;
|# r! r, l& F! I# p - RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
@) s; [. v- `9 n - RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
6 q7 ]; b4 K' | - RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
3 [$ S5 J" P( w - RCC_OscInitStruct.PLL.PLLM = RCC_PLLM_DIV1;
& ~/ T2 d* J8 J8 Z# `& y/ E - RCC_OscInitStruct.PLL.PLLN = 8;. m( v# [# M0 p( h2 j
- RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;$ ~7 G9 Q! D& H* X) M1 ?
- RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2;% m8 y. q# a% `$ x! N& D& N9 Z
- if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)$ G9 L6 n$ o! [3 Z) Y( z
- {
1 |$ ^) e9 `! I# E4 Q - Error_Handler();
( O, X4 [: K4 X' D! a - }6 f' x `( _! ?
- RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK- k% h' y% Z' Z$ G, ^( |
- |RCC_CLOCKTYPE_PCLK1;
8 ^3 {) f* p, w% Q7 }: _ - RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;( ~/ o# D4 t# V, f/ k. R$ P
- RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;& \1 Q) ]2 e* H: Z- L3 y+ y/ O8 p
- RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;! _, u/ Z8 ? E2 x, f% z* Y# R
- 5 ]7 D/ J0 G/ Y
- if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)% a0 b1 N; A/ v' m/ t% G3 i# q8 m$ X
- {( s; w! q" S3 q# _9 K0 Q
- Error_Handler();% j- i( W+ l0 m6 S) G
- }
# x% M; B) D* M$ U* f; | - }( L, m2 e# A4 D4 }
- void GPIO_Init(void)
) a; P# Y' o5 @/ a( n7 v - {
* A& e# j7 m9 i5 f# J9 Z/ j - GPIO_InitTypeDef GPIO_InitStruct = {0}; r* U! A& Z/ u X$ e- C D
- 9 f6 b2 R7 Z! ], }
- __HAL_RCC_GPIOA_CLK_ENABLE();
, A4 M& L4 G7 Z4 e% r - __HAL_RCC_GPIOD_CLK_ENABLE();
: n, v" t5 j0 J/ x$ B# s
Q+ S1 o$ C4 E2 S- HAL_GPIO_WritePin(PD0_GPIO_Port, PD0_Pin, GPIO_PIN_SET);
. K& h& X# y# ~2 H. H- A
m7 ]4 s1 p4 D; I# W* ^' Q. |& R' W- GPIO_InitStruct.Pin = PD0_Pin;
5 Q8 g: m4 `' s, N$ d - GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;1 q: F! `7 u% @/ U! ^6 N$ X) B+ `
- GPIO_InitStruct.Pull = GPIO_PULLUP;
5 d J3 y: m( m, h. |, k# [ - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;- |. a) b) p! k
- HAL_GPIO_Init(PD0_GPIO_Port, &GPIO_InitStruct);4 U) P2 u( N0 O- B4 f
' }7 [5 T( N. t1 g z% {/ j& G- }
2 o; d1 t: H% E) S" p# e+ p/ u - void Error_Handler(void)
l$ T/ ~6 g1 U' `; h - {
/ V0 u( y2 C3 z# ~6 C$ Z) P - }
. w; g* m0 J. S, J - #ifdef USE_FULL_ASSERT
6 b& d, M1 I6 S" p9 O& P5 T& m - void assert_failed(uint8_t *file, uint32_t line)0 U( ~$ r P. H, K J% d- u
- {" `7 C6 i0 |: X; F }' v
- }. @0 P- S) [6 Z' n
- #endif /* USE_FULL_ASSERT */
复制代码 6 N( u1 r7 n: [6 P7 O
编译仿真,即可点PD0处的蓝灯。
{/ B2 y. S% y; P& R7 J- i( k1 ?. @, Y( F5 E3 ^- j
本例中需注意:在MAIN.H中宏定义 #define PD0_Pin GPIO_PIN_0
% @' M# O* [& U0 c- D* y #define PD0_GPIO_Port GPIOD4 y- n4 @4 j# u
# G7 H( O' R8 \, ]; z
5.扩展实训
/ Q: K1 _0 c$ w4 N# h& a. o
) e0 x" [' h) X0 D) p; o- b 让蓝灯闪烁:
+ N+ T9 k- p: d9 j
( ?* ?, t. d- h! x0 ^" w! N- while (1)
1 a$ N; M) E3 m- ] - {* Y6 E0 Z v3 Q% K* M
- //HAL_GPIO_WritePin(PD0_GPIO_Port, PD0_Pin, GPIO_PIN_SET);//BLUE LED ON 蓝灯亮2 ?3 u& c7 A0 T, D; h
- HAL_Delay(1000);: J. }- w! s @- @ H
- HAL_GPIO_TogglePin(PD0_GPIO_Port, PD0_Pin);//取反
! M. O: k& s) f8 F - }4 }& m: F% z* t" j
复制代码 : {0 T9 g4 B" O5 M
6.HAL库中GPIO控制:
* h/ S8 e$ x1 M) d. P) n
: }& b/ l/ u- V- /* IO operation functions *****************************************************/
* B' h! z$ V! s X3 c - GPIO_PinState ' P4 c4 R- W8 v; ]
0 S6 P7 b& n6 ]5 V+ Y6 g- HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin); //读GPIO& m6 Z- C. b8 d! y9 @9 P8 D
- HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState);//写
* ^ |3 Q2 K3 X- S0 n - HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);//取反GPIO
: f/ y5 ^" o- R - . M G; I1 f y& m. H
6 g( x( M8 C5 u- HAL_StatusTypeDef
0 P2 _) ]8 Z( a0 Q - 0 g. o# v! s- m; G
- HAL_GPIO_LockPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);//锁住管脚电平
8 h: \9 ~5 }8 T( Q3 D- k: I P - HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin);//外部中断管理函数 清外部中断/ s# {. K3 J7 P% {6 X
- HAL_GPIO_EXTI_Rising_Callback(uint16_t GPIO_Pin);//中断回调函数 R0 t4 m$ ^2 |$ m( \1 K2 d" _
- HAL_GPIO_EXTI_Falling_Callback(uint16_t GPIO_Pin);//中断回调函数
复制代码 7 v' n: z- y! I, K: |8 {! `% J
————————————————# b4 g6 }5 p% `2 m6 R9 \
版权声明:米蜂科技
1 n) N) e, d0 k1 Z
4 s `: r- h: C) b) g7 N+ c |