1.发牢骚
我,又来点灯啦!51的相关博客会在寒假更新完,32就先不着急,慢慢玩吧,主要是还想玩玩arduino,最近想了想还是慢慢来吧,才大一里,马路戏院商店天空海阔,任你行。
今天的博客就是讲一下通过stm32f103c8t6最小系统板点亮一个led灯和led流水灯的实现。
2.点灯步骤
操作stm32的GPIO分三步,
第一步,使用RCC开启GPIO时钟;
第二步,使用GPIO_Init函数初始化GPIO;
第三部,使用输出或者输入函数控制GPIO;
为啥要开启时钟呢,可以这样去理解,时钟就是心脏,然后GPIO就是各个器官,器官固然重要,但是没有心脏是工作不了的!配置时钟就是安装心脏。专业的来说,时钟就是系统核心,STM32微控制器的时钟信号,以驱动微控制器在内部的不同部分,包括GPIO。如果没有先配置好时钟,其他模块就不会有正确的时钟信号去驱动它们,导致无法正常工作。
3.硬件连接
1.硬件器材
下载器用的DAP—LINK(也可以用ST—LINK),
stm32f103c8t6最小系统板,面包板,跳线,LED灯
2.LED灯连接图
这个是接线图,我们按照接线图来接,LED灯接在A0管脚。
下面是实物图
4.正式点灯
【1】我看不懂的函数们
我们这里用了RCC和GPIO两个外设,我们先找到RCC的库,看有哪些函数
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);
这三个是我们经常用到的,我们一个一个来学
AHB外设时钟
void RCC_AHBPeriphClockCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState)
这个函数的作用是启用或禁用AHB外设时钟的,有两个参数。
第一个参数是选择哪个外设
这里就是提供的选择,stm32互联型设备可以在第一个列表选择,非互联的可以在第二个列表选择,就是英语看的很头疼
第二个参数就是对你选中的这个外设输入启用或禁用,就是使能或不使能。
APB2外设时钟
void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)
这个函数同样是有两个参数的,第一个参数是选择哪个外设,第二个参数是选择使能或不使能
APB1外设时钟
- void RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState)
这个除了名字和外设和APB2不一样,其余都是一样的,我把函数解释贴在这里
GPIO库函数
这里我们用到的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基础的话,就什么难度
【2】点灯咯~~
通过查看函数,我们可以知道,我们的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可算亮了!
终于点完了,好开心,可以睡觉了!!
5.结语
困死了,睡觉睡觉~~
评论记录:
回复评论: