使能PORTB口时钟
时间: 2023-08-29 20:08:01 浏览: 404
在大多数微控制器中,使能某个端口的时钟需要通过设置相应的寄存器来实现。以STM32为例,使能PORTB口时钟的方法如下:
1. 打开RCC外设时钟
在使用GPIO端口之前,需要先打开RCC外设时钟。RCC是Reset and Clock Control的缩写,用于控制芯片的复位和时钟。
```
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
```
2. 设置相应GPIO端口的模式和速度
在使用GPIO端口之前,需要设置相应GPIO端口的模式和速度。
```
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
```
以上代码将PB0~PB7设置为输出模式,最大输出速度为50MHz。其中,GPIOB是GPIO端口B的指针。
通过以上两步,就可以使能PORTB口时钟。
相关问题
u8 DHT11_Init(void) { RCC->APB2ENR|=1<<3; //使能PORTB口时钟 GPIOB->CRH&=0XFFFFFF0F;//PORTB9 推挽输出 GPIOB->CRH|=0X00000030; DHT11_Rst(); return DHT11_Check(); }
这段代码实现的功能是初始化DHT11传感器,并返回DHT11传感器是否响应的结果。函数的返回值为0表示DHT11传感器响应成功,为1表示DHT11传感器响应失败。
具体实现过程如下:
1. 使能PORTB口时钟,即将RCC_APB2ENR寄存器中的第3位(对应GPIOB口)置1,使能GPIOB口时钟。
2. 配置GPIOB口的CRH寄存器,将PORTB9口配置为推挽输出。
3. 发送复位信号,让DHT11传感器进入初始状态。
4. 调用DHT11_Check()函数判断DHT11传感器是否响应,如果响应成功,则返回0表示DHT11传感器响应成功;如果响应失败,则返回1表示DHT11传感器响应失败。
分析下代码#include "dht11.h" #include "delay.h" //复位DHT11 void DHT11_Rst(void) { DHT11_IO_OUT(); //SET OUTPUT DHT11_DQ_OUT=0; //拉低DQ delay_ms(20); //拉低至少18ms DHT11_DQ_OUT=1; //DQ=1 delay_us(30); //主机拉高20~40us } //等待DHT11的回应 //返回1:未检测到DHT11的存在 //返回0:存在 u8 DHT11_Check(void) { u8 retry=0; DHT11_IO_IN();//SET INPUT while (DHT11_DQ_IN&&retry<100)//DHT11会拉低40~80us { retry++; delay_us(1); }; if(retry>=100)return 1; else retry=0; while (!DHT11_DQ_IN&&retry<100)//DHT11拉低后会再次拉高40~80us { retry++; delay_us(1); }; if(retry>=100)return 1; return 0; } //从DHT11读取一个位 //返回值:1/0 u8 DHT11_Read_Bit(void) { u8 retry=0; while(DHT11_DQ_IN&&retry<100)//等待变为低电平 { retry++; delay_us(1); } retry=0; while(!DHT11_DQ_IN&&retry<100)//等待变高电平 { retry++; delay_us(1); } delay_us(40);//等待40us if(DHT11_DQ_IN)return 1; else return 0; } //从DHT11读取一个字节 //返回值:读到的数据 u8 DHT11_Read_Byte(void) { u8 i,dat; dat=0; for (i=0;i<8;i++) { dat<<=1; dat|=DHT11_Read_Bit(); } return dat; } //从DHT11读取一次数据 //temp:温度值(范围:0~50°) //humi:湿度值(范围:20%~90%) //返回值:0,正常;1,读取失败 u8 DHT11_Read_Data(u8 *temp,u8 *humi) { u8 buf[5]; u8 i; DHT11_Rst(); if(DHT11_Check()==0) { for(i=0;i<5;i++)//读取40位数据 { buf[i]=DHT11_Read_Byte(); } if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4]) { *humi=buf[0]; *temp=buf[2]; } }else return 1; return 0; } //初始化DHT11的IO口 DQ 同时检测DHT11的存在 //返回1:不存在 //返回0:存在 u8 DHT11_Init(void) { RCC->APB2ENR|=1<<3; //使能PORTB口时钟 GPIOB->CRH&=0XFFFFFF0F;//PORTB9 推挽输出 GPIOB->CRH|=0X00000030; DHT11_Rst(); return DHT11_Check(); }
这段代码是用来驱动温湿度传感器DHT11的。具体来说,代码中的函数包括:
1. DHT11_Rst():复位DHT11,拉低DQ引脚至少18ms,然后拉高20~40us。
2. DHT11_Check():等待DHT11的回应,返回1表示未检测到DHT11的存在,返回0表示存在。
3. DHT11_Read_Bit():从DHT11读取一个位,等待DHT11引脚变为低电平,然后等待40us,读取引脚状态。
4. DHT11_Read_Byte():从DHT11读取一个字节,读取8位数据,返回读到的数据。
5. DHT11_Read_Data():从DHT11读取一次数据,读取40位数据,判断校验和是否正确,如果正确则将温度和湿度值存储在传入的参数中,返回0表示正常,返回1表示读取失败。
6. DHT11_Init():初始化DHT11的IO口DQ,同时检测DHT11的存在,返回1表示不存在,返回0表示存在。
代码中使用了延时函数delay_ms()和delay_us(),以及读写GPIO的操作,其中GPIOB的9号引脚被用作DQ引脚。
阅读全文