STMCU小助手
发布时间:2022-5-24 10:12
0 N: ?* ?' ]" N 5 _" E! V: g3 S 步骤一声明GPIO的结构:" d3 d% c0 G8 D. `5 K GPIO_InitTypeDef GPIO_InitStructure;) f& G7 h* k9 u' U) l( T' L" T ( P. B, D, B1 u' O9 R8 b; B7 j) z) P+ T . i9 b# r3 `4 s- U 步骤二为变量GPIO_InitStructure的成员赋值,如果只设置其中的一部分成员,我们需要如下代码: /** * LED1->PC6,LED2->PC7,LED3->PC9 */4 l$ |+ h4 q- c9 g% d+ ]' v2 k 2 |+ L! H6 Y& v9 ^6 i: ?2 Z9 C* f GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_9;6 K: k6 W: B2 |5 Q; R% j5 t* r # \3 t: M' g V* V& G GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;, W5 h% q9 F. a" |, d GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;) q4 }0 ] H$ j1 H& O - m- f( ]( Y6 U3 l5 e6 n6 h GPIO_Init(GPIOC,&GPIO_InitStructure);( {. B: N" n% R1 V% m& u7 J& ? ( w( }) G- R: q# ^+ s 实际上这里省略掉一个函数: GPIO_StructInit,它是用来初始化变量! K2 e7 _ |0 F; m" y% y- Q& s GPIO_InitStructure的,经过实验,发现不用也可以。大家可以尝试一下:)然后 , |/ W' Q. c# a' R' R& e 修改该变量中的成员,有三个成员。在STM32开发板上,GPIO端口接的, n. J$ x. S' \4 ~& d4 Q6 q1 U PC6、 PC7、 PC9引脚。因此,我们在GPIO_Pin成员这里赋值GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_9。1 s9 X' \; ~* e$ }- _; S 9 d6 S: P l) t7 o; Y 在GPIO_Speed成员上赋值 GPIO_Speed_50MHz,4 G3 ?7 o9 {8 Q" l( T GPIO_Mode成员则是设置为 GPIO_Mode_Out_PP,表示推挽输出模式。* I) Z2 B: o+ |. n * K! A1 |) k) a ! b0 s3 T; Z/ \ 推挽输出——>(输出高电平电流和输出低电平电流一样大) Z$ \7 X; N$ j 7 }2 W$ H! F" z6 } D. b6 w3 h/ a 推挽电路是两个参数相同的三极管或MOSFET,以推挽方式存在于电路中,各负责正负半周的波形放大任务,电路工作时,两只对称的功率开关管每次只有一个导通,所以导通损耗小、效率高。输出既可以向负载灌电流,也可以从负载抽取电流。 ( @- g5 `5 V3 ^* O$ @: z 推挽电路适用于低电压大电流的场合,广泛应用于功放电路和开关电源中。9 U/ p G) S* k 优点是:结构简单,开关变压器磁芯利用率高,推挽电路工作时,两只对称的功率开关管每次只有一个导通,所以导通损耗小。. z$ s. Z8 C" J ! Y2 v1 u. F8 P0 M* A% J- R( G 缺点是:变压器带有中心抽头,而且开关管的承受电压较高;由于变压器原边漏感的存在,功率开关管关断的瞬间,漏源极会产生较大的电压尖峰,另外输入电流的纹波较大,因而输入滤波器的体积较大。 ! r1 d6 g1 L: N0 ^% a' b 三极管的推挽部分的简化电路图如图
$ B, y% ?+ c/ O! |3 }6 G; H 步骤三 调用函数GPIO_Init()来初始化外设GPIO,代码如下:6 H. X9 U6 K5 L/ H+ ]" b 5 G- s* h S* I GPIO_Init(GPIOC,&GPIO_InitStructure); ' T: s8 M% a& j ^( N : n# n1 m) O6 {/ \: E % r% Z6 v* ]+ O! x* X" z 步骤四使能。注意,在固件库中,GPIO没有GPIO_Cmd的函数,因此这个步骤省略。% d3 D5 F! {5 s7 o; h7 \( L 4 Q, N2 V2 e5 M+ ^ o# h& t 通过以上四个步骤,我们已经对GPIO进行了设置。还有一个问题不能忽略: 在设置外设前,我们必须给它调用一个时钟函数来使能外设时钟。6 C5 r6 w1 n! n) {! e$ \7 l- v ; r% K% ]. d7 j: X1 s F0 i 在CPU的用户手册中,我们知道,stm32有好几个时钟的,现在我们用哪个 % R' N" {% z+ D1 H* x( x' c 4 G1 Y% j( L. N& ^ 时钟呢?打开《STM32F10xxx参考手册》中文版的P25页,截图如下页所) w& h6 z$ k7 n7 }9 k+ i . b$ v9 U1 {7 @' A, n+ H+ g 示。我们使用的是GPIOC端口,因此,使用的是APB2。 7 ^7 v8 M5 o5 P3 f( S% z9 S
步骤五:定下这个APB2对应的函数后,我们就调用它:. Z! ?7 ]" u% H, p ) ~' O) X3 g9 |- p4 k: X RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);/ b9 `( d# p+ b , E( f, ~" h7 V; Y5 Y5 W" P 其中,第一个参数需要指示要开启什么端口的时钟,RCC_APB2Periph_GPIOx就是开启GPIOx的时钟,第二个参数需要指示是开启还是关闭,ENABLE/DISABLE。 % L; v( |+ S: B- @. } W 注意,这个时钟的使能函数,应该放在最前面。必须先有时钟,才能做后续的操作。 我们先看原理图里,LED如何连接的:
" p. g* g) _' i* X 从原理图,我们可以看到,要使得3个LED都亮起来,必须把对应的引脚 , y; W6 Z) m# o" A# e 清零。置1会让LED灭。现在打开STM32固件库文档,找到10.2小节,GPIO+ J" y9 V+ s8 @" Z2 C, J 库函数。GPIO设置的所有函数,都在这里。我们看下要使用GPIO库的哪个函 1 D: l/ S" |1 h X 数。找到:GPIO_SetBits();和GPIO_ResetBits();; E) T5 Y1 O3 v * J( f) f9 g2 M0 p7 c2 N( g 这两个函数,根据说明,分别是设置某个引脚为高电平和低电平。 5 D: W/ }7 O3 J1 H* d GPIO_SetBits函数是设置高电平,# B1 k* h4 }; R" ` 4 h4 n2 v% {. V# e) q GPIO_ResetBits函数则是清零操作。根据我们 获得的信息,写出如下代码:我们的目的是让所有的LED有规律地闪烁,并且无限循环。( e# C- \( m& {* L! r" k1 q! j; n( ] " @9 b6 e$ ^6 s, r1 [; H * d8 c& _/ v8 N: [( P7 w2 N & a5 c. t5 q4 s; c# q9 @ 我们还需要调用SystemInit();函数,来初始化整个系统,包括时钟设置到 ' Q4 Y: a% d4 X' r" N0 ^, _" V1 J! q 72MHZ。以上配置结束后,您就可以根据MDK+Jlink的相关教程,下载HEX , y3 _8 d, ]; `' y M' x+ x% b 文件到板子里进行调试了。% `: X; F+ x7 p# j+ w % z: ~' b" F2 f4 Y , O/ G7 Q% }. g6 ]! w! A " I3 `4 L" t6 ?4 E3 [) G" c$ Q |
【经验分享】STM32语音识别的智能蓝牙音箱(源程序+原理图+PCB+设计说明书+PPT)
想找个ST芯片
[GPIO] 使用新型抽象开始C++嵌入式编程,从GPIO开始
技术手册stm32f1xx中的一个小问题
【经验分享】STM32 HAL库移植FreeModbus详细步骤
【逢7发帖赢大礼】STM32开发之IC门禁卡UID读取方法!
实战经验 | Keil工程使用NEAI库的异常问题
经验分享 | FDCAN数据段波特率增加后发送失败的问题分析
STM32几种流行开发环境的优缺点
好用软件推荐-TouchGFX Designer
微信公众号
手机版