0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

STM32F407入门开发: 位带操作

DS小龙哥-嵌入式技术 来源:DS小龙哥-嵌入式技术 作者:DS小龙哥-嵌入式技 2022-05-28 13:50 次阅读

一、位带的文档介绍

STM32F407的位带操作可以实现类似51单片机中寄存器的操作方法,操作GPIO口代码简洁方便。 关于位段的操作在Cortex-M3M4权威指南里有详细描述:

支持位带操作后,可以使用普通的加载/存储指令来对单一的比特位进行读写。

在CM3位带区中,有两个区中实现了位带。 其中一个是 SRAM 区的最低 1MB 范围,第二个则是片内外设区的最低 1MB 范围。 这两个区中的地址除了可以像普通的 RAM 一样使用外,它们还都有自己的“位带别名区”,位带别名区把每个比特膨胀成一个 32 位的字。当你通过位带别名区访 问这些字时,就可以达到访问原始比特位的目的。

image.pngimage.pngimage.pngimage.pngimage.pngimage.png

二、位带实现代码

Sys.c文件增加以下代码:


#define GPIOA_IDR (0x40020000+0x10)
#define GPIOA_ODR (0x40020000+0x14)
#define GPIOB_IDR (0x40020400+0x10)
#define GPIOB_ODR (0x40020400+0x14)
#define GPIOC_IDR (0x40020800+0x10)
#define GPIOC_ODR (0x40020800+0x14)
#define GPIOD_IDR (0x40020C00+0x10)
#define GPIOD_ODR (0x40020C00+0x14)
#define GPIOE_IDR (0x40021000+0x10)
#define GPIOE_ODR (0x40021000+0x14)
#define GPIOF_IDR (0x40021400+0x10)
#define GPIOF_ODR (0x40021400+0x14)
#define GPIOG_IDR (0x40021800+0x10)
#define GPIOG_ODR (0x40021800+0x14)
#define GPIOH_IDR (0x40021C00+0x10)
#define GPIOH_ODR (0x40021C00+0x14)

//把“位带地址+位序号”转换成别名地址的宏
#define BITBAND(addr,bitnum) ((addr&0xF0000000)+0x2000000+((addr&0xFFFFF)<<5)+(bitnum<<2))
//把该地址转换成一个指针
#define MEM_ADDR(addr) *((volatile unsigned long *) (addr))
	
#define PAout(x) MEM_ADDR(BITBAND(GPIOA_ODR,x))
#define PAin(x) MEM_ADDR(BITBAND(GPIOA_IDR,x))
#define PBout(x) MEM_ADDR(BITBAND(GPIOB_ODR,x))
#define PBin(x) MEM_ADDR(BITBAND(GPIOB_IDR,x))
#define PCout(x) MEM_ADDR(BITBAND(GPIOC_ODR,x))
#define PCin(x) MEM_ADDR(BITBAND(GPIOC_IDR,x))
#define PDout(x) MEM_ADDR(BITBAND(GPIOD_ODR,x))
#define PDin(x) MEM_ADDR(BITBAND(GPIOD_IDR,x))
#define PEout(x) MEM_ADDR(BITBAND(GPIOE_ODR,x))
#define PEin(x) MEM_ADDR(BITBAND(GPIOE_IDR,x))
#define PFout(x) MEM_ADDR(BITBAND(GPIOF_ODR,x))
#define PFin(x) MEM_ADDR(BITBAND(GPIOF_IDR,x))
#define PGout(x) MEM_ADDR(BITBAND(GPIOG_ODR,x))
#define PGin(x) MEM_ADDR(BITBAND(GPIOG_IDR,x))
#define PHin(x) MEM_ADDR(BITBAND(GPIOH_IDR,x))
#define PHout(x) MEM_ADDR(BITBAND(GPIOH_ODR,x))
复制代码

Led.h 增加位带操作代码

#define LED0 PFout(9)
#define LED1 PFout(10)
#define BEEP PFout(8)

复制代码

Key.h增加位带操作代码

#define KEY0  PEin(4)
#define KEY1  PEin(3)
#define KEY2  PEin(2)
#define KEY_UP PAin(0)

复制代码

Main.c示例代码

#include "stm32f4xx.h" // Device header
#include "led.h"
#include "delay.h"
#include "key.h"
#include "usart.h"
#include "sys.h"
int main(void)
{
	u8 i,key;
	LED_Init();
	KEY_Init();
	USART1_Init(84,115200);
	while(1)
	{
		key=ScanKeyVal(0);
		if(key)
		{
			i=!i;
			LED0=!LED0;
			LED1=!LED1;
		}
	}
}
复制代码

三、DS18B20温度传感器示例-位带控制实现时序

#include "ds18b20.h"
/*
函数功能: 硬件初始化--IO配置
硬件连接: PB15
*/
void DS18B20_Init(void)
{
    /*1. 开时钟*/
    RCC->APB2ENR|=1<<3; //PB
    /*2. 配置GPIO口模式*/
    GPIOB->CRH&=0x0FFFFFFF;
    GPIOB->CRH|=0x30000000;
    /*3. 上拉*/
    GPIOB->ODR|=1<<15;
}

/*
函数功能: 发送复位脉冲检测DS18B20硬件--建立通信过程
返 回 值: 0表示成功  1表示失败  
*/
u8 DS18B20_Check(void)
{
    u8 i;
    DS18B20_OUT_MODE(); //配置IO口为输出模式
    DS18B20_OUT=0;      //拉低
    delay_us(580);       
    DS18B20_OUT=1;      //拉高
    
    DS18B20_IN_MODE();  //配置IO口为输入模式
    for(i=0;i<100;i++)
    {
        if(DS18B20_IN==0)break;
        delay_us(1);
    }
    if(i==100)return 1;
    
    for(i=0;i<250;i++)
    {
       if(DS18B20_IN)break;
       delay_us(1); 
    }
    if(i==250)return 1;
    return 0;
}

/*
函数功能: DS18B20写一个字节数据
*/
void DS18B20_WriteOnebyte(u8 cmd)
{
    u8 i;
    DS18B20_OUT_MODE(); //输出模式
    for(i=0;i<8;i++)
    {
        if(cmd&0x01) //发送1
        {
            DS18B20_OUT=0;
            delay_us(15);
            DS18B20_OUT=1;
            delay_us(45);
            DS18B20_OUT=1;
            delay_us(2);
        }
        else //发送0
        {
            DS18B20_OUT=0;
            delay_us(15);
            DS18B20_OUT=0;
            delay_us(45);
            DS18B20_OUT=1;
            delay_us(2);
        }
        cmd>>=1;
    }
}

/*
函数功能: DS18B20读一个字节数据
*/
u8 DS18B20_ReadOnebyte(void)
{
    u8 i;
    u8 data=0;
    for(i=0;i<8;i++)
    {
        DS18B20_OUT_MODE(); //输出模式
        DS18B20_OUT=0;
        delay_us(2);
        DS18B20_IN_MODE();
        delay_us(8);
        data>>=1; //右移1位
        if(DS18B20_IN)data|=0x80;
        delay_us(50);
        DS18B20_OUT=1;
        delay_us(2);
    }
    return data;
}

/*
函数功能: 读取一次DS18B20的温度数据
返回值: 读取的温度数据高低位
*/
u16 DS18B20_ReadTemp(void)
{
   u16 temp;
   u8 t_L,t_H;
   if(DS18B20_Check())return 1;
   DS18B20_WriteOnebyte(0xCC); //跳跃 ROM 指令 --不验证身份
   DS18B20_WriteOnebyte(0x44); //发送温度转换指令
    
   if(DS18B20_Check())return 2;
   DS18B20_WriteOnebyte(0xCC); //跳跃 ROM 指令 --不验证身份
   DS18B20_WriteOnebyte(0xBE); //读取RAM里的数据
   
   //读取温度
   t_L=DS18B20_ReadOnebyte(); //低字节
   t_H=DS18B20_ReadOnebyte(); //高字节
   temp=t_H<<8|t_L;
   return temp; 
}

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 温度传感器
    +关注

    关注

    48

    文章

    2900

    浏览量

    155855
  • DS18B20
    +关注

    关注

    10

    文章

    778

    浏览量

    80670
  • STM32F407
    +关注

    关注

    15

    文章

    187

    浏览量

    29355
收藏 人收藏

    评论

    相关推荐

    STM32F407 带配置步骤

    介绍STM32F407带操作方法,设置寄存器的偏移量,实现按GPIO口指定位进行读写操作,方便编程。
    的头像 发表于 07-06 14:30 1170次阅读
    <b class='flag-5'>STM32F407</b> <b class='flag-5'>位</b>带配置步骤

    STM32F407模板

    STM32F407模板,感兴趣可以看看。
    发表于 07-25 18:52 132次下载

    STM32F407 UCOS III实验

    STM32F407 UCOS III实验,介绍基于STM32F407的UCOSIII实例,参考下
    发表于 09-22 14:08 82次下载

    STM32F407 开发板原理图

    STM32F407 开发板原理图
    发表于 09-22 16:12 393次下载
    <b class='flag-5'>STM32F407</b> <b class='flag-5'>开发</b>板原理图

    STM32F407开发板用户手册】第13章 STM32F407启动过程详解

    STM32F407开发板用户手册】第13章 STM32F407启动过程详解
    发表于 11-23 18:06 73次下载
    【<b class='flag-5'>STM32F407</b><b class='flag-5'>开发</b>板用户手册】第13章 <b class='flag-5'>STM32F407</b>启动过程详解

    STM32F407开发板用户手册】第14章 STM32F407的电源,复位和时钟系统

    STM32F407开发板用户手册】第14章 STM32F407的电源,复位和时钟系统
    发表于 12-02 16:21 42次下载
    【<b class='flag-5'>STM32F407</b><b class='flag-5'>开发</b>板用户手册】第14章 <b class='flag-5'>STM32F407</b>的电源,复位和时钟系统

    STM32F407芯片介绍

    1. 文档准备做嵌入式开发的第一步就是了解主芯片,了解STM32F407主要要关注几个文档:1. stm32F407芯片手册2. stm32F407参考手册3. Arm Cortex-
    发表于 12-04 13:21 109次下载
    <b class='flag-5'>STM32F407</b>芯片介绍

    STM32F407开发板用户手册】第1章   初学STM32F407的准备工作

    STM32F407开发板用户手册】第1章   初学STM32F407的准备工作
    发表于 12-04 13:36 75次下载
    【<b class='flag-5'>STM32F407</b><b class='flag-5'>开发</b>板用户手册】第1章   初学<b class='flag-5'>STM32F407</b>的准备工作

    STM32F407开发板用户手册】第21章 STM32F407的NVIC中断分组和配置(重要)

    STM32F407开发板用户手册】第21章 STM32F407的NVIC中断分组和配置(重要)
    发表于 12-04 13:51 21次下载
    【<b class='flag-5'>STM32F407</b><b class='flag-5'>开发</b>板用户手册】第21章 <b class='flag-5'>STM32F407</b>的NVIC中断分组和配置(重要)

    STM32F407开发板用户手册】第8章 STM32F407的终极调试组件Event Recorder

    STM32F407开发板用户手册】第8章 STM32F407的终极调试组件Event Recorder
    发表于 12-04 14:21 19次下载
    【<b class='flag-5'>STM32F407</b><b class='flag-5'>开发</b>板用户手册】第8章 <b class='flag-5'>STM32F407</b>的终极调试组件Event Recorder

    STM32F407开发板用户手册】第19章 STM32F407的GPIO应用之按键FIFO

    STM32F407开发板用户手册】第19章 STM32F407的GPIO应用之按键FIFO
    发表于 12-05 15:21 39次下载
    【<b class='flag-5'>STM32F407</b><b class='flag-5'>开发</b>板用户手册】第19章 <b class='flag-5'>STM32F407</b>的GPIO应用之按键FIFO

    STM32F407开发板原理图下载

    STM32F407 开发板原理图,有兴趣的同学可以参考!
    发表于 04-29 17:09 61次下载

    STM32F407入门开发: 串口配置

    STM32F407 的串口资源非常丰富,功能也很强劲。 STM32F407 最多可提供 6 路串口,有分数波特率发生器、支持同步单线通信和半双工单线通讯、支持 LIN、 支持调制解调器操作、 智能卡
    的头像 发表于 05-28 13:51 1.1w次阅读
    <b class='flag-5'>STM32F407</b><b class='flag-5'>入门开发</b>: 串口配置

    stm32f407原理图

    stm32f407原理图
    发表于 07-14 16:07 205次下载

    STM32F407 FreeRTOS开发手册 V1.1

    STM32F407 FreeRTOS开发手册_V1.1PDF文件下载。
    发表于 07-31 11:16 52次下载