赞
踩
1》GPIO----通用输入输出端口(引脚)
数字电路中的三种状态:高(3.3V) 低(0V) 高阻
作用:
1,输出
高电平(3.3V) 低电平(0V)
2,输入
高电平(3.3V) 低电平(0V)
2》在STM32上GPIO按组划分,分为GPIOA,GPIOB。。。。GPIOG
每组最多16个引脚 GPIOA0.。。。。。GPIOA15
3》MCU片上外设控制手册《STM32F10xxx参考手册中文版.pdf》
4》八种输入输出模式
施密特触发器:纠正电平
上拉电阻:电阻一端接电源,另一端接信号线
下拉电阻:电阻一端接地,另一端接信号线
1,输入浮空:没有上拉电阻,也没有下拉电阻,输入0,输入数据寄存器读到0,输入1,输入数据寄存器读到1,没有输入,读到上一次的状态
2,输入上拉:有上拉电阻,没有下拉电阻,输入0,输入数据寄存器读到0,输入1,输入数据寄存器读到1,没有输入,读到高电平(1)
3,输入下拉:有下拉电阻,没有上拉电阻,输入0,输入数据寄存器读到0,输入1,输入数据寄存器读到1,没有输入,读到低电平(0)
4,模拟输入:没有上拉电阻,也没有下拉电阻,并且不经过施密特触发器直接进入芯片内部的片上外设
5,开漏输出:没有P-mos,不能输出高电平,当输出数据寄存器写1时,输出为高阻
6,推挽输出:通过输出数据寄存器,写入0和1,控制引脚上面的低电平和高电平输出
(通用:GPIO受内核控制的输出数据寄存器控制)
(复用:GPIO受片上外设控制)
7,开漏复用输出:没有P-mos,不能输出高电平
8,推挽复用输出:能够输出高电平和低电平
5》标准外设库驱动LED
《STM32固件库使用手册_v3.5版本.pdf》---介绍标准外设库中函数的手册
-------------------------------------------------------------------------------------------------------------------------
//dri_led.c ----------------------------------------------------------------------------------------------------------
#include "dri_led.h"
//粗延时函数,微秒
void delay(void)
{
uint32_t i,j;
for (i=0; i<10000; i++)
{
for (j=0; j<100; j++)
;
}
}
void ledb_close(void)
{
GPIO_InitTypeDef GPIO_InitStruct6;
// 0.打开GPIOC的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
// 1.将GPIOC6、7、8设置成通用推挽输出,输出速度2MHZ
GPIO_InitStruct6.GPIO_Pin =GPIO_Pin_6;
GPIO_InitStruct6.GPIO_Speed =GPIO_Speed_2MHz;
GPIO_InitStruct6.GPIO_Mode =GPIO_Mode_Out_PP;
GPIO_Init(GPIOC, &GPIO_InitStruct6);
// 2.关灯
GPIO_SetBits(GPIOC, GPIO_Pin_6);
}
void ledg_close(void)
{
GPIO_InitTypeDef GPIO_InitStruct7;
// 0.打开GPIOC的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
// 1.将GPIOC6、7、8设置成通用推挽输出,输出速度2MHZ
GPIO_InitStruct7.GPIO_Pin =GPIO_Pin_7;
GPIO_InitStruct7.GPIO_Speed =GPIO_Speed_2MHz;
GPIO_InitStruct7.GPIO_Mode =GPIO_Mode_Out_PP;
GPIO_Init(GPIOC, &GPIO_InitStruct7);
// 2.关灯
GPIO_SetBits(GPIOC, GPIO_Pin_7);
}
void ledr_close(void)
{
GPIO_InitTypeDef GPIO_InitStruct8;
// 0.打开GPIOC的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
// 1.将GPIOC6、7、8设置成通用推挽输出,输出速度2MHZ
GPIO_InitStruct8.GPIO_Pin =GPIO_Pin_8;
GPIO_InitStruct8.GPIO_Speed =GPIO_Speed_2MHz;
GPIO_InitStruct8.GPIO_Mode =GPIO_Mode_Out_PP;
GPIO_Init(GPIOC, &GPIO_InitStruct8);
// 2.关灯
GPIO_SetBits(GPIOC, GPIO_Pin_8);
}
//开灯
void ledb_open(void)
{
GPIO_ResetBits(GPIOC, GPIO_Pin_6);
}
void ledg_open(void)
{
GPIO_ResetBits(GPIOC, GPIO_Pin_7);
}
void ledr_open(void)
{
GPIO_ResetBits(GPIOC, GPIO_Pin_8);
}
//控制灯的开关
void led_ctrl(int LED, int OPCL)
{
if (OPCL==open)
{
switch (LED)
{
case blue:
{
ledb_open();
delay();
break;
}
case green:
{
ledg_open();
delay();
break;
}
case red:
{
ledr_open();
delay();
break;
}
case yellow:
{
ledg_open();
ledr_open();
delay();
break;
}
case cyan:
{
ledb_open();
ledg_open();
delay();
break;
}
case purple:
{
ledb_open();
ledr_open();
delay();
break;
}
case white:
{
ledb_open();
ledg_open();
ledr_open();
delay();
break;
}
}
}
else if (OPCL==close)
{
switch (LED)
{
case blue:
{
GPIO_SetBits(GPIOC, GPIO_Pin_6);
delay();
break;
}
case green:
{
GPIO_SetBits(GPIOC, GPIO_Pin_7);
delay();
break;
}
case red:
{
GPIO_SetBits(GPIOC, GPIO_Pin_8);
delay();
break;
}
case yellow:
{
GPIO_SetBits(GPIOC, GPIO_Pin_7);
GPIO_SetBits(GPIOC, GPIO_Pin_8);
delay();
break;
}
case cyan:
{
GPIO_SetBits(GPIOC, GPIO_Pin_6);
GPIO_SetBits(GPIOC, GPIO_Pin_7);
delay();
break;
}
case purple:
{
GPIO_SetBits(GPIOC, GPIO_Pin_6);
GPIO_SetBits(GPIOC, GPIO_Pin_8);
delay();
break;
}
case white:
{
GPIO_SetBits(GPIOC, GPIO_Pin_6);
GPIO_SetBits(GPIOC, GPIO_Pin_7);
GPIO_SetBits(GPIOC, GPIO_Pin_8);
delay();
break;
}
}
}
}
-------------------------------------------------------------------------------------------------------------------------
//dri_led.h ----------------------------------------------------------------------------------------------------------
#ifndef _DRI_LED_H
#define _DRI_LED_H
#include "stm32f10x.h"
enum led_color {blue=0, green, red, yellow, cyan, purple, white};
enum openclose {close=0, open};
void delay_us(u16 time);
void ledb_close(void);
void ledg_close(void);
void ledr_close(void);
void ledb_open(void);
void ledg_open(void);
void ledr_open(void);
void led_ctrl(int LED, int OPCL);
#endif // _DRI_LED_H
-------------------------------------------------------------------------------------------------------------------------
//main.c ------------------------------------------------------------------------------------------------------------
#include "dri_led.h"
int main (void)
{
int i,ix,j,jx;
ledb_close();
ledg_close();
ledr_close();
while (1)
{ for (i=0; i<7; i++)
{
for (j=1; j>=0; j--)
{
ix=i%7;
jx=j%2;
led_ctrl(ix, jx);
}
}
}
}
-------------------------------------------------------------------------------------------------------------------------
结果:七种颜色的灯轮流闪烁。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。