下手STM32有一段时间了,感觉刚入门时很难,无处下手,现在学到了点皮裘,写出来和咱们共享一下。
首要,什么叫GPIO?这个问题,答案是我也不知道!至少现在我没有必要知道,我只需知道他其实便是51单片机的那种IO口罢了,不同的是,51单片机的IO口是不需求装备形式的,而STM32的IO口(哦,不,应该说是GPIO口,╮(╯▽╰)╭,真绕舌头)是需求装备形式和时钟的(好吧,又冒出一个时钟来,够费事的),在这里要阐明一下,STM32的GPIO,假如你要用它,就要做两步作业,榜首是装备形式、速度,第二是装备其时钟并使能(形似说两步有点勉强)。估量现在咱们现已糊涂了,好吧,别急,我一点一点给咱们解说解说;
咱们榜首步要知道GPIO的那八种形式是什么,怎样用。GPIO的八种形式如下:
(1)浮空输入:In_Floating
(2)带上拉输入:IPU(In Push_Up)
(3)带下拉输入:IPD(In Push_Down)
(4)模仿输入:AIN(Anolog In)
(5)开漏输出:OUT_PD(OD 代表开漏,既Open Drain,OC代表开集,Open Collect)
(6)推挽输出:OUT_PP(PP代表推挽式,Push_Pull)
(7)复用功用推挽输出:AF_PP(AF代表复用功用,Alternate-Fuction)
(8)复用功用开漏输出:AF_OD
好吧,就这八种形式,打字打得我手都酸了、、、、、、
这八种形式什么时分用哪种,这个问题值得研讨,不过也不用现在就玩命地研讨,今后在使用过程中渐渐就领会到了,所以在这里我就不多说了。
再便是装备GPIO的翻转速度了,有10M、2M和50M,详细装备方法等最终咱们贴个完好的代码就理解了。
GPIO装备说完了,再说说时钟装备,时钟装备其实便是一堆让初学者看不懂的代码,不过看多了渐渐领会,你就理解他究竟是在说什么了,在写程序的时分能够直接从他给的工程中移植过来,然后修正一下相关的制造就行了,先贴个代码,然后再解说。
上图是装备时钟的代码,我挨着行解说一下:
SystemInit();看姓名就知道这个是体系初始化,究竟初始化了些什么,我的意思是不知道,现在也不用知道,你就写这么一句就行了;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA
|RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC
|RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE
|RCC_APB2Periph_ADC1 | RCC_APB2Periph_AFIO
|RCC_APB2Periph_SPI1, ENABLE );
这几句有点长,看着就头晕,可是咱们不怕,一句一句看,RCC_APB2PeriphClockCmd()这个函数姓名有点怪,它叫做使能或失能APB2外设时钟(这姓名够绕嘴的),不用管它,直接仿制过来就行,再看括号里边的,RCC_APB2Periph_USART1,这个代表的是USART1的时钟是和APB2的相同,下面的几个都是这么个意思,用或符号衔接在一起,然后再加上个ENABLE,这就算使能了你想要用的管脚,咱们要注意啊,上面的代码是我随意找的,在实际使用过程中,详细是能什么,要看你用到什么,就使能什么,不用最好别使能,以免形成不用要的搅扰和费事。
好了,咱们一开端说的两个问题说完了,下面说一下怎么让GPIO输出凹凸电平吧。其实吧这个问题很简略,许多的材料一说到这个问题,就开端讲寄存器,一讲寄存器,就涉及到内部原理,好吧,总算,初学者不淡定了,脑子成了一堆浆糊,然后决心受挫,然后就降低了学习功率,其实我个人认为大不用,已然有库函数,那咱们就先用库函数,等库函数用熟了,再自己渐渐领会库函数里边的寄存器操作。看下面两条句子:
GPIO_SetBits(GPIOD, GPIO_Pin_9);
GPIO_ResetBits(GPIOD, GPIO_Pin_9);
榜首句的意思是将GPIOD9口置位(咱们假定这个口的形式是输出形式),第二句的意思是将GPIOD9口清零(相同的假定)。哈哈,怎样样,简略吧,这便是根本的IO口操作,这样,你就能成功点亮或许平息指定的LED了,下面附上一段例程,咱们自己渐渐研讨。
#include “stm32f10x.h”
//——————————————-GPIO初始化—————————————–//
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOD, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
//————————————–装备体系时钟,使能各外设时钟———————————//
void RCC_Configuration(void)
{
SystemInit();
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB
| RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD
| RCC_APB2Periph_GPIOE, ENABLE );
}
//———————————–装备一切外设——————————//
void Init_All_Periph(void)
{
RCC_Configuration();
GPIO_Configuration();
}
//—————————————-延时函数——————————————–//
void Delay(vu32 nCount)
{
for(; nCount != 0; nCount–);
}
//——————————————主函数——————————————–//
int main(void)
{
Init_All_Periph();
while(1)
{
GPIO_SetBits(GPIOD, GPIO_Pin_8);
GPIO_ResetBits(GPIOD, GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11);
Delay(0xEFFFF);
GPIO_SetBits(GPIOD, GPIO_Pin_9);
GPIO_ResetBits(GPIOD, GPIO_Pin_8 | GPIO_Pin_10 | GPIO_Pin_11);
Delay(0xEFFFF);
GPIO_SetBits(GPIOD, GPIO_Pin_10);
GPIO_ResetBits(GPIOD, GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_11);
Delay(0xEFFFF);
GPIO_SetBits(GPIOD, GPIO_Pin_11);
GPIO_ResetBits(GPIOD, GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10);
Delay(0xEFFFF);
GPIO_ResetBits(GPIOD, GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10);
}
}
声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/yingyong/258092.html