RM新时代网站-首页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

STM32F407入門開發(fā): 位帶操作

DS小龍哥-嵌入式技術(shù) ? 來源:DS小龍哥-嵌入式技術(shù) ? 作者:DS小龍哥-嵌入式技 ? 2022-05-28 13:50 ? 次閱讀

一、位帶的文檔介紹

STM32F407的位帶操作可以實現(xiàn)類似51單片機中寄存器的操作方法,操作GPIO口代碼簡潔方便。 關(guān)于位段的操作在Cortex-M3M4權(quán)威指南里有詳細描述:

支持位帶操作后,可以使用普通的加載/存儲指令來對單一的比特位進行讀寫。

在CM3位帶區(qū)中,有兩個區(qū)中實現(xiàn)了位帶。 其中一個是 SRAM 區(qū)的最低 1MB 范圍,第二個則是片內(nèi)外設(shè)區(qū)的最低 1MB 范圍。 這兩個區(qū)中的地址除了可以像普通的 RAM 一樣使用外,它們還都有自己的“位帶別名區(qū)”,位帶別名區(qū)把每個比特膨脹成一個 32 位的字。當你通過位帶別名區(qū)訪 問這些字時,就可以達到訪問原始比特位的目的。

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

二、位帶實現(xiàn)代碼

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)

//把“位帶地址+位序號”轉(zhuǎn)換成別名地址的宏
#define BITBAND(addr,bitnum) ((addr&0xF0000000)+0x2000000+((addr&0xFFFFF)<<5)+(bitnum<<2))
//把該地址轉(zhuǎn)換成一個指針
#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))
復(fù)制代碼

Led.h 增加位帶操作代碼

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

復(fù)制代碼

Key.h增加位帶操作代碼

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

復(fù)制代碼

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;
		}
	}
}
復(fù)制代碼

三、DS18B20溫度傳感器示例-位帶控制實現(xiàn)時序

#include "ds18b20.h"
/*
函數(shù)功能: 硬件初始化--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;
}

/*
函數(shù)功能: 發(fā)送復(fù)位脈沖檢測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;
}

/*
函數(shù)功能: DS18B20寫一個字節(jié)數(shù)據(jù)
*/
void DS18B20_WriteOnebyte(u8 cmd)
{
    u8 i;
    DS18B20_OUT_MODE(); //輸出模式
    for(i=0;i<8;i++)
    {
        if(cmd&0x01) //發(fā)送1
        {
            DS18B20_OUT=0;
            delay_us(15);
            DS18B20_OUT=1;
            delay_us(45);
            DS18B20_OUT=1;
            delay_us(2);
        }
        else //發(fā)送0
        {
            DS18B20_OUT=0;
            delay_us(15);
            DS18B20_OUT=0;
            delay_us(45);
            DS18B20_OUT=1;
            delay_us(2);
        }
        cmd>>=1;
    }
}

/*
函數(shù)功能: DS18B20讀一個字節(jié)數(shù)據(jù)
*/
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;
}

/*
函數(shù)功能: 讀取一次DS18B20的溫度數(shù)據(jù)
返回值: 讀取的溫度數(shù)據(jù)高低位
*/
u16 DS18B20_ReadTemp(void)
{
   u16 temp;
   u8 t_L,t_H;
   if(DS18B20_Check())return 1;
   DS18B20_WriteOnebyte(0xCC); //跳躍 ROM 指令 --不驗證身份
   DS18B20_WriteOnebyte(0x44); //發(fā)送溫度轉(zhuǎn)換指令
    
   if(DS18B20_Check())return 2;
   DS18B20_WriteOnebyte(0xCC); //跳躍 ROM 指令 --不驗證身份
   DS18B20_WriteOnebyte(0xBE); //讀取RAM里的數(shù)據(jù)
   
   //讀取溫度
   t_L=DS18B20_ReadOnebyte(); //低字節(jié)
   t_H=DS18B20_ReadOnebyte(); //高字節(jié)
   temp=t_H<<8|t_L;
   return temp; 
}

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 溫度傳感器
    +關(guān)注

    關(guān)注

    48

    文章

    2940

    瀏覽量

    156015
  • DS18B20
    +關(guān)注

    關(guān)注

    10

    文章

    779

    瀏覽量

    80822
  • STM32F407
    +關(guān)注

    關(guān)注

    15

    文章

    187

    瀏覽量

    29436
收藏 人收藏

    評論

    相關(guān)推薦

    STM32F407 帶配置步驟

    介紹STM32F407帶操作方法,設(shè)置寄存器的偏移量,實現(xiàn)按GPIO口指定位進行讀寫操作,方便編程。
    的頭像 發(fā)表于 07-06 14:30 ?1217次閱讀
    <b class='flag-5'>STM32F407</b> <b class='flag-5'>位</b>帶配置步驟

    STM32F407模板

    STM32F407模板,感興趣可以看看。
    發(fā)表于 07-25 18:52 ?133次下載

    STM32F407 UCOS III實驗

    STM32F407 UCOS III實驗,介紹基于STM32F407的UCOSIII實例,參考下
    發(fā)表于 09-22 14:08 ?82次下載

    STM32F407 開發(fā)板原理圖

    STM32F407 開發(fā)板原理圖
    發(fā)表于 09-22 16:12 ?393次下載
    <b class='flag-5'>STM32F407</b> <b class='flag-5'>開發(fā)</b>板原理圖

    STM32F407開發(fā)板用戶手冊】第13章 STM32F407啟動過程詳解

    STM32F407開發(fā)板用戶手冊】第13章 STM32F407啟動過程詳解
    發(fā)表于 11-23 18:06 ?73次下載
    【<b class='flag-5'>STM32F407</b><b class='flag-5'>開發(fā)</b>板用戶手冊】第13章 <b class='flag-5'>STM32F407</b>啟動過程詳解

    STM32F407開發(fā)板用戶手冊】第14章 STM32F407的電源,復(fù)位和時鐘系統(tǒng)

    STM32F407開發(fā)板用戶手冊】第14章 STM32F407的電源,復(fù)位和時鐘系統(tǒng)
    發(fā)表于 12-02 16:21 ?42次下載
    【<b class='flag-5'>STM32F407</b><b class='flag-5'>開發(fā)</b>板用戶手冊】第14章 <b class='flag-5'>STM32F407</b>的電源,復(fù)位和時鐘系統(tǒng)

    STM32F407芯片介紹

    1. 文檔準備做嵌入式開發(fā)的第一步就是了解主芯片,了解STM32F407主要要關(guān)注幾個文檔:1. stm32F407芯片手冊2. stm32F407參考手冊3. Arm Cortex-
    發(fā)表于 12-04 13:21 ?109次下載
    <b class='flag-5'>STM32F407</b>芯片介紹

    STM32F407開發(fā)板用戶手冊】第1章?? 初學(xué)STM32F407的準備工作

    STM32F407開發(fā)板用戶手冊】第1章?? 初學(xué)STM32F407的準備工作
    發(fā)表于 12-04 13:36 ?75次下載
    【<b class='flag-5'>STM32F407</b><b class='flag-5'>開發(fā)</b>板用戶手冊】第1章?? 初學(xué)<b class='flag-5'>STM32F407</b>的準備工作

    STM32F407開發(fā)板用戶手冊】第21章 STM32F407的NVIC中斷分組和配置(重要)

    STM32F407開發(fā)板用戶手冊】第21章 STM32F407的NVIC中斷分組和配置(重要)
    發(fā)表于 12-04 13:51 ?21次下載
    【<b class='flag-5'>STM32F407</b><b class='flag-5'>開發(fā)</b>板用戶手冊】第21章 <b class='flag-5'>STM32F407</b>的NVIC中斷分組和配置(重要)

    STM32F407開發(fā)板用戶手冊】第8章 STM32F407的終極調(diào)試組件Event Recorder

    STM32F407開發(fā)板用戶手冊】第8章 STM32F407的終極調(diào)試組件Event Recorder
    發(fā)表于 12-04 14:21 ?19次下載
    【<b class='flag-5'>STM32F407</b><b class='flag-5'>開發(fā)</b>板用戶手冊】第8章 <b class='flag-5'>STM32F407</b>的終極調(diào)試組件Event Recorder

    STM32F407開發(fā)板用戶手冊】第19章 STM32F407的GPIO應(yīng)用之按鍵FIFO

    STM32F407開發(fā)板用戶手冊】第19章 STM32F407的GPIO應(yīng)用之按鍵FIFO
    發(fā)表于 12-05 15:21 ?39次下載
    【<b class='flag-5'>STM32F407</b><b class='flag-5'>開發(fā)</b>板用戶手冊】第19章 <b class='flag-5'>STM32F407</b>的GPIO應(yīng)用之按鍵FIFO

    STM32F407開發(fā)板原理圖下載

    STM32F407 開發(fā)板原理圖,有興趣的同學(xué)可以參考!
    發(fā)表于 04-29 17:09 ?62次下載

    STM32F407入門開發(fā): 串口配置

    STM32F407 的串口資源非常豐富,功能也很強勁。 STM32F407 最多可提供 6 路串口,有分數(shù)波特率發(fā)生器、支持同步單線通信和半雙工單線通訊、支持 LIN、 支持調(diào)制解調(diào)器操作、 智能卡
    的頭像 發(fā)表于 05-28 13:51 ?1.1w次閱讀
    <b class='flag-5'>STM32F407</b><b class='flag-5'>入門開發(fā)</b>: 串口配置

    stm32f407原理圖

    stm32f407原理圖
    發(fā)表于 07-14 16:07 ?207次下載

    STM32F407 FreeRTOS開發(fā)手冊 V1.1

    STM32F407 FreeRTOS開發(fā)手冊_V1.1PDF文件下載。
    發(fā)表于 07-31 11:16 ?52次下載
    RM新时代网站-首页