我,又来点灯啦!51的相关博客会在寒假更新完,32就先不着急,慢慢玩吧,主要是还想玩玩arduino,最近想了想还是慢慢来吧,才大一里,马路戏院商店天空海阔,任你行。
今天的博客就是讲一下通过stm32f103c8t6最小系统板点亮一个led灯和led流水灯的实现。
操作stm32的GPIO分三步,
第一步,使用RCC开启GPIO时钟;
第二步,使用GPIO_Init函数初始化GPIO;
第三部,使用输出或者输入函数控制GPIO;
为啥要开启时钟呢,可以这样去理解,时钟就是心脏,然后GPIO就是各个器官,器官固然重要,但是没有心脏是工作不了的!配置时钟就是安装心脏。专业的来说,时钟就是系统核心,STM32微控制器的时钟信号,以驱动微控制器在内部的不同部分,包括GPIO。如果没有先配置好时钟,其他模块就不会有正确的时钟信号去驱动它们,导致无法正常工作。
下载器用的DAP—LINK(也可以用ST—LINK),
stm32f103c8t6最小系统板,面包板,跳线,LED灯
这个是接线图,我们按照接线图来接,LED灯接在A0管脚。
下面是实物图
我们这里用了RCC和GPIO两个外设,我们先找到RCC的库,看有哪些函数
然后你一看,哇好多函数,咋办里,不要担心,这只是一部分,虽然看上去有好多啊,我也觉得,但是我们用到的只有下面的几个:
void RCC_AHBPeriphClockCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState);
void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);
void RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState);
这三个是我们经常用到的,我们一个一个来学
void RCC_AHBPeriphClockCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState)
这个函数的作用是启用或禁用AHB外设时钟的,有两个参数。
第一个参数是选择哪个外设
这里就是提供的选择,stm32互联型设备可以在第一个列表选择,非互联的可以在第二个列表选择,就是英语看的很头疼
第二个参数就是对你选中的这个外设输入启用或禁用,就是使能或不使能。
void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)
这个函数同样是有两个参数的,第一个参数是选择哪个外设,第二个参数是选择使能或不使能
void RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState)
这个除了名字和外设和APB2不一样,其余都是一样的,我把函数解释贴在这里
这里我们用到的GPIO库函数不多,以下几条
这里只对其进行一个大概的解释,就不一一列举,有兴趣的可以自行参照函数库
void GPIO_DeInit(GPIO_TypeDef* GPIOx);
/* 参数是GPIOA,GPIOB等,调用这个函数,所制定的GPIO口就会被复位 */
void GPIO_AFIODeInit(void);
/* 这个函数可以复位AFIO外设 */
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);
/* 用结构体参数初始化GPIO口的值,需要先创建一个结构体,赋值结构体来配置外设参数 */
void GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct);
/* 把结构体变量赋一个默认值 */
// 下面这四个函数是GPIO的读取函数
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);
uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);
// 下面四个是GPIO的写入函数
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);
以上就是我们今天要用到的函数的介绍,关键在于英文能不能看懂,其实有点c基础的话,就什么难度
通过查看函数,我们可以知道,我们的GPIOA是在RCC_APB2上连接的
首先调用这个函数RCC_APB2PeriphClockCmd
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE );
//选择GPIOA,ENABLE
接着调用GPIO_Init()
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode =
GPIO_InitStructure.GPIO_Pin =
GPIO_InitStructure.GPIO_Speed =
GPIO_Init(GPIOA, )
//这里结构体变量都没有配置
GPIO的8种工作模式
GPIO_Mode_AIN = 0x0,//模拟输入
GPIO_Mode_IN_FLOATING = 0x04,//浮空输入
GPIO_Mode_IPD = 0x28,//下拉输入
GPIO_Mode_IPU = 0x48,//上拉输入
GPIO_Mode_Out_OD = 0x14,//开漏输出
GPIO_Mode_Out_PP = 0x10,//推挽输出
GPIO_Mode_AF_OD = 0x1C,//复用开漏
GPIO_Mode_AF_PP = 0x18//复用推挽
我们点灯用推挽输出。
最后配置完成后我们代码是这个
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);//结构体指针
下面开始输出了
调用函数GPIO_ResetBits
这个函数可以控制P0端口低电平,函数定义如下:
我们的配置如下 :
GPIO_ResetBits(GPIOA,GPIO_Pin_0);//低电平点亮
从而我们得到完整代码
#include "stm32f10x.h" // Device header
int main(void)
{
/* GPIO初始化 */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE );
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/*配置完成后,我们开始输出 */
GPIO_ResetBits(GPIOA,GPIO_Pin_0);//这里是低电平点亮
while(1)
{}
}
编译下载后,结果
灯,亮了,亮了,亮了啊,我cao可算亮了!
终于点完了,好开心,可以睡觉了!!
困死了,睡觉睡觉~~