从今天起,开始学习32,这个作为学习资料的整理。有51的基础,具体功能的实现写在这儿,只会写32的特殊的地方。所以具体不会太详细(可能也有错,如果您顺路看的时候发现了错误,请斧正,感激不尽)
目录
第一课,跑马灯(端口的输出设置)
一.端口配置
1.个人理解的概念
首先,我们要打开32的端口时钟,芯片为了省电,所以所有的端口都是关闭的。我们需要通过打开时钟给端口激活。所以我们32的端口配置过程为:打开时钟---配置端口。
2.端口的配置
首先,我们需要用命令打开时钟:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOD, ENABLE);
该参数表示,激活A D两口的端口。然后我们需要对端口进行输出设置,可以使用如下结构体:
GPIO_InitTypeDef GPIO_InitStructure;
该结构体,则是GPIO口的配置,接下来我们可以设置它的“公用”参数,比如输出模式,输出速度:
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
设置好了它的输出模式和速度,我们就可以对一个IO口进行配置了:
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //选择管脚
GPIO_Init(GPIOA, &GPIO_InitStructure); //生效更改于GPIOA
所以,两个IO口的设置可能看起来是这样:
void LED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOD, ENABLE);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_Init(GPIOD, &GPIO_InitStructure);
}
3.头文件的定义
头文件的定义可以让我们的代码风格像51一样,如LED=1,其定义方式如下:(注意#define后面没有分号)
#define LED0 PAout(8)
该定义约等于51的 sbit LED0 = PA.8
二.程序的输出代码
32的高低电平输出的方法有几个,如以下代码:
GPIO_ResetBits(GPIOA,GPIO_Pin_8); //LED0输出低
GPIO_SetBits(GPIOD,GPIO_Pin_2); //LED1输出高
PAout(8)=0; //LED0输出低
PDout(2)=1; //LED1输出高
三.头文件的定义方法
除了头文件的.c内容,我们的头文件.h还需要额外的内容:
#ifndef __NAME_H //头文件的开始标志,只需要替换NAME为.h的名字即可
#define __NAME_H
#include "sys.h" //头文件的引用
#define LED0 PAout(8) //常量的定义
#define LED1 PDout(2)
void LED_Init(void); //函数的前引用
#endif //文件结束标志
四.该节涉及到的资料和未整理部分
1.头文件快速模板
#ifndef __ _H
#define __ _H
#include
#define
#endif
2.端口定义的快速模板
void _Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOD, ENABLE);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
3.输出模式选择
1、浮空输入GPIO_IN_FLOATING ——浮空输入,可以做KEY识别,RX1
2、带上拉输入GPIO_IPU ——IO内部上拉电阻输入
3、带下拉输入GPIO_IPD —— IO内部下拉电阻输入
4、模拟输入GPIO_AIN ——应用ADC模拟输入,或者低功耗下省电
5、开漏输出GPIO_OUT_OD ——IO输出0接GND,IO输出1,悬空,需要外接上拉电阻,才能实现输出高电平。当输出为1时,IO口的状态由上拉电阻拉高电平,但由于是开漏输出模式,这样IO口也就可以由外部电路改变为低电平或不变。可以读IO输入电平变化,实现C51的IO双向功能
6、推挽输出GPIO_OUT_PP ——IO输出0-接GND, IO输出1 -接VCC,读输入值是未知的
7、复用功能的推挽输出GPIO_AF_PP ——片内外设功能(I2C的SCL,SDA)
8、复用功能的开漏输出GPIO_AF_OD ——片内外设功能(TX1,MOSI,MISO.SCK.SS)
4.PPT内其他内容整理
1个初始化函数:
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);
2个读取输入电平函数:
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);
2个读取输出电平函数:
uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);
4个设置输出电平函数:
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);