应该不会有人看吧,就自己记一下听课要记得知识点。
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口。需要先定义一个结构体变量,然后再给结构体赋值,最后调用这个函数。这个函数就会自动读取结构体的值,然后自动把外设的各个参数配置好。
一般初始化外设都是使用这个Init函数来完成的。
void GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct);
这个函数可以把结构体变量赋一个默认值。
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的读取函数了,下面四个是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);
上面八个就可以实现读写GPIO口的功能。
更新1:
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);
前两个参数也是指定端口的,而BitVal是根据第三个参数的值 来设置指定的端口。
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);
GPIOx 选择外设;PortVal 可以同时对16个端口进行写入操作。
好好好,灯已经亮起来了,嵌入式点灯工程师。
更新2:
更细致的对GPIO的几个常见的读取函数做个说明:
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
一般读取按键需要用到这个函数,这个函数是用来读取输入数据寄存器某个端口的输入值,后面的俩参数是指定一个端口。
返回值是uint8_t 代表这个端口的高低电平。
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);
这个函数是用来读取整个输入数据寄存器的,唯一的参数用来指定外设。
返回值uint_16 是16位的数据,每一位代表一个端口值。
uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
这个函数是用来读取输出数据寄存器的某一个位,所以实际上不是用来读取端口的输入数据的,一般用于输出数据上,看看自己输出了啥玩意儿。
uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);
这个也是用来读取整个输出寄存器的。
(其实这些内容都写过一次了,没来得及发布,电脑蓝了)
所以说:如果想读取GPIO口的话,需要用ReadInput的这俩函;如果在输出模式下想看看输出了什么,才需要用到ReadOutput的这俩函数。
更新3:
关于OLED 屏幕的坐标定义:
总共4行16列
1 2 3 4 5 6 7 8....16
1
2
3
4
输出单个字符:对应在OLED_ShowChar(); 函数中的参数。(1 , 1 ,' A ')就是在一行一列打一个a出来。注意是单引。
输出字符串:对应在OLED_ShowString(2,8,"xxx");就是在2行8列开始打一个“xxx”的字符串,注意是双引。
显示无符号十进制数据:OLED_ShowNum(2,1,12345,5);就是在2行1列开始输出长度为5的12345,如果最后面的长度比前面的数字长,就会在前面补0,比如(2,1,12345,8),显示结果就是00012345,如果后面的长度比前面数字短,那就会把高位数据切割掉,比如(2,1,12345,4)显示结果就是2345。
显示有符号十进制数字:OLED_ShowSignedNum(1,6, 12345 , 5);显示结果就是+12345,如果是
(1,6, -18 , 2),显示结果就是-18。
显示十六进制数:OLED_ShowHexNum(4,1,0xAA55,4);那就显示AA55。
显示二进制数字:OLED_ShowBinNum(1,4,0xAA55,16);显示结果是1010101001010101。
清屏:OLED_CLear();
更新4:
外部中断的配置流程:(学会这五步,马上进天禄)
第一步:RCC配置,打开所有涉及到的外设的时钟,外设不打开时钟是没法工作的。
第二步:配置GPIO,选择端口模式为输入模式(输入\输出),
第三步:配置AFIO,选择这一路的GPIO,连接到后面的EXTI。
第四步:配置EXTI,选择边沿触发方式,可以选择上升沿下降沿或者双边沿。还有选择相应的触发方式,可以选择中断响应和事件相应。
AFIO的配置函数:
GPIO_AFIODeInit(void);
第五步:配置NVIC,给中断选择一个适合的优先级。最后通过NVIC,外部中断信号就能进入CPU了。
这个函数是用来复位AFIO外设的,调用此函数,AFIO的配置就会全部清除。
GPIO_PinLockConfig();
这个函数是用来锁定GPIO配置的,调用此函数之后这个引脚的配置就会被锁定,防止意外更改。
void GPIO_EventOutputConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);
void GPIO_EventOutputCmd(FunctionalState NewState);
这两个函数是用来配置AFIO的事件输出功能的。
void GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalState NewState);
可以用来进行引脚重映射,第一个参数可以选择你要重映射的方式,第二个是参数的新的状态。
void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);
调用这个函数可以配置AFIO的数据选择器,来选择想要的中断引脚。
第一个参数:GPIO_PortSourceGPIOx,可以选择某个GPIO外设作为外部中断源。
void GPIO_ETH_MediaInterfaceConfig(uint32_t GPIO_ETH_MediaInterface);
这个函数和以太网配置有关,STM32F103C8T6没有以太网,所以也用不到。(那为啥函数库里有这玩意儿...)。
更新5:
EXTI的函数 (别吵别吵,这里很关键。)
void EXTI_DeInit(void);
调用它就可以把EXTI的配置都清除,恢复上电的默认状态。
void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct);
可以根据这个结构体里的参数配置EXTI外设。初始化EXTI就是用这个函数
void EXTI_StructInit(EXTI_InitTypeDef* EXTI_InitStruct);
调用这个函数可以把参数传递的结构体变量赋一个默认的值。
上面这三个函数基本所有的外设都有,就像是库函数的模板函数一样,基本每个外设都需要这个类型的函数。
void EXTI_GenerateSWInterrupt(uint32_t EXTI_Line);
这个函数是用来软件触发外部中断的。调用这个函数,参数给一个指定的中断线,就能软件触发一次这个外部中断。
下面的四个也是库函数的模板函数,很多模块都有,他们在这里的用处是用来查看标志位的:
FlagStatus EXTI_GetFlagStatus(uint32_t EXTI_Line);
可以获取指定的标志位是否被置1了。
void EXTI_ClearFlag(uint32_t EXTI_Line);
对置1的标志位进行清除。
ITStatus EXTI_GetITStatus(uint32_t EXTI_Line);
对于这些标志位,有些标志位比较紧急,在置标志位后会触发中断,在中断函数里,如果你想查看标志位和清除标志位,就可以用这俩函数,这个是获取中断标志位是否被置1了。
void EXTI_ClearITPendingBit(uint32_t EXTI_Line);
清除中断挂起标志位。
更新6:
接下来是一些NVIC的库函数的解释:
void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);
两个参数:
pre-emption priority 抢占优先级。
subpriority 响应优先级。
用来中断分组的,参数是中断分组的方式。
void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);
根据结构体里面指定的参数初始化NVIC。
void NVIC_SetVectorTable(uint32_t NVIC_VectTab, uint32_t Offset);
设置中断向量表。
void NVIC_SystemLPConfig(uint8_t LowPowerMode, FunctionalState NewState);
系统低功耗配置。
一般都是先用void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup); 指定一下中断的分组,然后再用void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);初始化一下NVIC就行了。
更新7:
OLED屏幕的一些函数:
OLED_ReverseArea(uint8_t X, uint8_t Y, uint8_t Width, uint8_t Height);
指定区域反色
void OLED_Reverse(void);
全屏反色显示
void OLED_ShowChinese(uint8_t X, uint8_t Y, char *Chinese);
void OLED_ShowImage(uint8_t X, uint8_t Y, uint8_t Width, uint8_t Height, const uint8_t *Image);
显示中文和显示图片
void OLED_Printf(uint8_t X, uint8_t Y, uint8_t FontSize, char *format, ...);
基本都可以用这个函数在oled屏幕上做显示。
具体用法:前面两个参数还是指定坐标,以及指定字体大小,之后的部分就和printf用法一样,格式化字符串,比如要显示数字就是“Num1:%d,Num2:%d”这个%d是占位符,实际打印时会替换为后面的可变参数。
显示字符就用%c;显示字符串直接写或者用%s;显示无符号十进制数字用%u或者%d;有符号用%d;显示16进制数字用%x或者%X(看你的十六进制数字的英文字母想大写还是小写)。