单片机物联网开发资料:
链接:https://pan.baidu.com/s/1XzodQuML7CqZ4ZKinDGKkg?pwd=bgep
提取码:bgep
===========================================
单片机GPIO的Do输出功能
1、功能描述
根据MP3的声音频率,让LED灯以不同的高度(LED的多少),不同的频率不断闪烁
2、通用IO
2.1 GPIO功能描述
1每个GPI/O端口有两个32位配置寄存器(GPIOx_CRL,GPIOx_CRH),两个32位数据寄存器(GPIOx_IDR,GPIOx_ODR),一个32位置位/复位寄存器(GPIOx_BSRR),一个16位复位寄存器(GPIOx_BRR)和一个32位锁定寄存器(GPIOx_LCKR).
GPIO端口的每个位可以由软件分配设置成多种模式:
- 输入浮空
- 输入上拉
- 输入下拉
- 模拟输入
- 开漏输出
- 推挽式输出
- 推挽式复用功能
- 开漏复用功能
2每个I/O端口位可以自由编程,然而I/O端口寄存器必须按32位字被访问(不允许半
字或字节访问)。GPIOx_BSRR 和 GPIOx_BRR寄存器允许对任何GPIO寄存器的读/更改的独立访问;这样,在读和更改访问之间产生IRQ时不会发生危险。
3 I/O端口位的基本结构
4 端口位配置表
5输出模式位
2.2 GPIO库函数
函数名 | 描述 |
GPIO_Init | 根据 GPIO_InitStruct中指定的参数初始化GPIOx寄存器 |
2.3 使用GPIO基本步骤
- 给GPIO_InitStruct中的参数赋值,完成初始化就可以使用个GPIO,
Note:任何外设使用之前都要开启相应的时钟
/* GPIO Init structure definition */
typedef struct
{
u16 GPIO_Pin; // 管脚IO口寄存器 ;
GPIOSpeed_TypeDef GPIO_Speed; // 管脚频率 ;
GPIOMode_TypeDef GPIO_Mode; // 管脚模式 ;
}GPIO_InitTypeDef;
3、硬件电路
3.1 LED硬件电路连接原理图
3.2 LED硬件电路引脚连接
Note:8个LED是CPU通过74LS164实现的单工通信
原理图标号 | 引脚功能 | Cortex M3引脚 | IO口功能选择 |
164_CLR | 74LS164的清零 | PE11 | 推挽式输出 |
164_CLK | 74LS164的时钟 | PB5 | 推挽式输出 |
164_Data | 74LS164的数据 | PE10 | 推挽式输出 |
4、软件代码
4.1 LED模块代码
/*******************************************************************************
* Function Name : LED_Init
* Description : LED引脚初始化
* Input : None
* Return : None
*******************************************************************************/
void LED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure; // 声明一个IO口结构体变量
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE , ENABLE); // 使能APB2外设GPIOE时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB , ENABLE); // 使能APB2外设GPIOB时钟
//==========PE口IO结构体初始化============
GPIO_InitStructure.GPIO_Pin = LS164_DATA|LS164_CLR; //选择PE.10,PE.11
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //管脚频率为50MHZ
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //模式为推挽输出
GPIO_Init(GPIOE, &GPIO_InitStructure); //初始化GPIOE寄存器
//==========PB口IO结构体初始化============
GPIO_InitStructure.GPIO_Pin = LS164_CLK; //选择PB.5
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //管脚频率为50MHZ
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //模式为推挽输出
GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化GPIOB寄存器
}
/*******************************************************************************
* Function Name : LED_Display
* Description : 向74LS164发送一个8位数据。
* Input : data 需要发送的数据
* Return : None
*******************************************************************************/
void LED_Display(u8 data)
{
u8 j; //定义一个8位无符号整型变量j
GPIO_ResetBits(GPIOE, LS164_CLR); //74LS164输出清零
GPIO_SetBits(GPIOE, LS164_CLR);
//----------------模拟时钟信号,循环8次完成数据传送---------------
for(j=0; j<8; j++)
{
GPIO_ResetBits(GPIOB, LS164_CLK); //向74LS164发送一个低电平时钟信号
if ( (data & 0x01) != 0 ) //低位先传送。判断最低位是否为1
GPIO_SetBits(GPIOE, LS164_DATA);
else
GPIO_ResetBits(GPIOE, LS164_DATA);
data >>=1; //data右移一位
GPIO_SetBits(GPIOB, LS164_CLK); //向74LS164发送一个高电平时钟信号
}
GPIO_ResetBits(GPIOB, LS164_CLK);
}
4.2 LED主函数代码
int main(void)
{
u8 const LED_TAB[9]={0x00,0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff};
u8 i=0;
#ifdef DEBUG
debug();
#endif
RCC_Configuration();//使能外设时钟
LED_Init(); //LEDGPIO管脚初始化
//========实现流水灯效果==========
while (1)
{
for(i=0;i<9;i++)
{
LED_Display(LED_TAB[i]);
Delay_Ms(1000);
}
}
}