娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

單片機(jī)位操作詳解

發(fā)布者:溫馨小屋最新更新時(shí)間:2025-02-25 來(lái)源: jianshu關(guān)鍵字:單片機(jī)  位操作  固件函數(shù)庫(kù) 手機(jī)看文章 掃描二維碼
隨時(shí)隨地手機(jī)看文章

1.把最低位置1 

 int byt=0x50;

寫(xiě)成:byt|=0x01; 或者 byt|=(0x01<<0);  //要把哪位置1  就左移幾位

代碼

#include

int main(void)

{

int byt=0x50; //

    byt|=(0x01<<0);//要把哪位置1  就左移幾位

     //byt&=~(0x01<<0);//要把哪位清0  就左移幾位取反 再進(jìn)行與操作

    printf('%x',byt);

}

2.把某位清零或置1


#include

#define SET_BIT(x,bit)  (x|=(1<

#define RESET_BIT(x,bit)  (x&=(~(1<

int main(void)

{

  int bty=0x58;   //0101 1000

  SET_BIT(bty,0);  //把第一位置1

  printf('置一 %xn',bty);

  RESET_BIT(bty,0);//把第一位清0

  printf('清零 %xn',bty);

}



一個(gè)32位數(shù)據(jù) 字節(jié)讀取操作

1.獲取單字節(jié)

#include

#define GET_LOW_BYTE0(x)  ((x>>0)&0x000000FF) //取第0個(gè)字節(jié)

#define GET_LOW_BYTE1(x)  ((x>>8)&0x000000ff) //取第1個(gè)字節(jié)

#define GET_LOW_BYTE2(x)  ((x>>16)&0x000000ff)//取第2個(gè)字節(jié)

#define GET_LOW_BYTE3(x)  ((x>>24)&0x000000ff)//取第3個(gè)字節(jié)

int main(void)

{

unsigned long a =0x12345678;

printf('0x%x的第0個(gè)字節(jié)為: 0x%xn',a,GET_LOW_BYTE0(a));  //0x78

printf('0x%x的第1個(gè)字節(jié)為: 0x%xn',a,GET_LOW_BYTE1(a)); //0x56

printf('0x%x的第2個(gè)字節(jié)為: 0x%xn',a,GET_LOW_BYTE2(a)); //0x34

printf('0x%x的第3個(gè)字節(jié)為: 0x%xn',a,GET_LOW_BYTE3(a)); //0x12

}


2.獲取第幾位

#include

#define GET_BIT(x,bit) ((x&(1<>bit) /*獲取第bit位*/

int main(void)

{

unsigned int byt=0x58;         /*二進(jìn)制為0101 1000 */

printf('0x%x的第0位為: %dn',byt,GET_BIT(byt,0));

printf('0x%x的第3位為: %dn',byt,GET_BIT(byt,3));

printf('0x%x的第4位為: %dn',byt,GET_BIT(byt,4));

printf('0x%x的第5位為: %dn',byt,GET_BIT(byt,5));

printf('0x%x的第6位為: %dn',byt,GET_BIT(byt,6));

printf('0x%x的第7位為: %dn',byt,GET_BIT(byt,7));

}



一個(gè)32bit數(shù)據(jù)的位,字節(jié)清零操作

1.清零某個(gè)字節(jié)

#include

//32位數(shù)據(jù)清零某個(gè)字節(jié)

#define CLEAR_LOW_BYTE0(x) (x&=0xffffff00)

#define CLEAR_LOW_BYTE1(x) (x&=0xffff00ff)

#define CLEAR_LOW_BYTE2(x) (x&=0xff00ffff)

#define CLEAR_LOW_BYTE3(x) (x&=0x00ffffff)

int main(void)

{

unsigned long a=0x11223344;

unsigned long b=0x11223344;

unsigned long c=0x11223344;

unsigned long d=0x11223344;

printf('第0個(gè)字節(jié)清空%xn',CLEAR_LOW_BYTE0(a));

printf('清空第1個(gè)字節(jié)%xn',CLEAR_LOW_BYTE1(b));

printf('第2個(gè)字節(jié)清空%xn',CLEAR_LOW_BYTE2(c));

printf('清空第3個(gè)字節(jié)%xn',CLEAR_LOW_BYTE3(d));

}






STM32寄存器配置

STM32有幾套固件函數(shù)庫(kù),這些固件庫(kù)函數(shù)以函數(shù)的形式進(jìn)行1層或者多層封裝(軟件開(kāi)發(fā)中很重要的思想之一:分層思想),但是到了最里面的一層就是對(duì)寄存器的配置。

我們平時(shí)都比較喜歡固件庫(kù)來(lái)開(kāi)發(fā),大概是因?yàn)楣碳?kù)用起來(lái)比較簡(jiǎn)單,用固件庫(kù)寫(xiě)出來(lái)的代碼比較容易閱讀。

最近一段時(shí)間一直在配置寄存器,越發(fā)地發(fā)現(xiàn)使用寄存器來(lái)進(jìn)行一些外設(shè)的配置也是很容易懂的。

使用寄存器的方式編程無(wú)非就是往寄存器的某些位置1、清零以及對(duì)寄存器一些狀態(tài)位進(jìn)行判斷、讀取寄存器的內(nèi)容等。

這些基本操作在上面的例子中已經(jīng)有介紹,我們依舊以實(shí)例來(lái)鞏固上面的知識(shí)點(diǎn)(以STM32F1xx為例):

(1)寄存器配置

看一下GPIO功能的端口輸出數(shù)據(jù)寄存器  (GPIOx_ODR) (x=A..E)  :

假設(shè)我們要讓PA10引腳輸出高、輸出低,可以這么做:

方法一:

GPIOA->ODR |=1<<10;/* PA10輸出高(置1操作) */

GPIOA->ODR &= ~(1<<10);/* PA10輸出低(清0操作) */

也可用我們上面的置位、清零的宏定義:

SET_BIT(GPIOA->ODR,10);/* PA10輸出高(置1操作) */

CLEAR_BIT(GPIOA->ODR,10);/* PA10輸出低(清0操作) */

方法二:

GPIOA->ODR |= (uint16_t)0x0400;/* PA10輸出高(置1操作) */

GPIOA->ODR &= ~(uint16_t)0x0400;/* PA10輸出低(清0操作) */

貌似第二種方法更麻煩?還得去細(xì)心地去構(gòu)造一個(gè)數(shù)據(jù)。

但是,其實(shí)第二種方法其實(shí)是ST推薦我們用的方法,為什么這么說(shuō)呢?因?yàn)镾T官方已經(jīng)把這些我們要用到的值給我們配好了,在stm32f10x.h中:

這個(gè)頭文件中存放的就是外設(shè)寄存器的一些位配置。

所以我們的方法二等價(jià)于:

GPIOA->ODR |= GPIO_ODR_ODR10;/* PA10輸出高(置1操作) */

GPIOA->ODR &= ~GPIO_ODR_ODR10;/* PA10輸出低(清0操作) */

兩種方法都是很好的方法,但方法一似乎更好理解。

配置連續(xù)幾位的方法也是一樣的,就不介紹了。簡(jiǎn)單介紹配置不連續(xù)位的方法,以TIM1的CR1寄存器為例:

設(shè)置CEN位為1、設(shè)置CMS[1:0]位為01、設(shè)置CKD[1:0]位為10:

TIM1->CR1 |= (0x1<<1)| (0x1<<5) |(0x2<<8);

這是組合的寫(xiě)法。當(dāng)然,像上面一樣拆開(kāi)來(lái)寫(xiě)也是可以的。

(2)判斷標(biāo)志位

以狀態(tài)寄存器(USART_SR) 為例:

判斷RXNE是否被置位:

/* 數(shù)據(jù)寄存器非空,RXNE標(biāo)志置位 */

if(USART1->SR & (1<<5))

{

/* 其它代碼 */

USART1->SR &= ~(1<<5);/* 清零RXNE標(biāo)志 */

}

或者:

/* 數(shù)據(jù)寄存器非空,RXNE標(biāo)志置位 */

if(USART1->SR & USART_SR_RXNE)

{

/* 其它代碼 */

USART1->SR &= ~USART_SR_RXNE;/* 清零RXNE標(biāo)志 */

}

四、總結(jié)

以上就是本次關(guān)于位操作的一點(diǎn)總結(jié)筆記,有必要掌握。雖然說(shuō)在用STM32的時(shí)候有庫(kù)函數(shù)可以用,但是最接近芯片內(nèi)部原理的還是寄存器。有可能之后有用到其它芯片沒(méi)有像ST這樣把寄存器相關(guān)配置封裝得那么好,那就不得不直接操控寄存器了。

此外,使用庫(kù)函數(shù)的方式代碼占用空間大,用寄存器的話,代碼占用空間小。之前有個(gè)需求,我能用的Flash的空間大小只有4KB,遇到類似這樣的情況就不能那么隨性的用庫(kù)函數(shù)了。


i<<3 相當(dāng)于把所有2進(jìn)制左移3位  右邊補(bǔ)零

左移n位相當(dāng)于 乘以2的n次方 前提是數(shù)據(jù)不能丟失

i>>3 相當(dāng)于把所有2進(jìn)制右移3位 

右移n位 相當(dāng)于除以2的n次方


關(guān)鍵字:單片機(jī)  位操作  固件函數(shù)庫(kù) 引用地址:單片機(jī)位操作詳解

上一篇:[課程-014位帶操作——GPIO的輸入和輸出控制]
下一篇:SPI通信四大模式

推薦閱讀最新更新時(shí)間:2025-06-24 12:11

stm32專題三:操作—GPIO輸出和輸入
位帶操作其實(shí)很簡(jiǎn)單,就是把位帶區(qū)某寄存器的特定位,用公式給映射到位帶別名區(qū)的32位地址上,該地址在編譯器看來(lái)是個(gè)立即數(shù),因此需要強(qiáng)制類型轉(zhuǎn)換成32位地址指針,最后對(duì)指針取值操作。 特別值得注意的是,在強(qiáng)制類型轉(zhuǎn)換成地址時(shí),一定要加volatile關(guān)鍵詞,不然一定會(huì)被編譯器level-3優(yōu)化掉,導(dǎo)致程序出錯(cuò)。博主一開(kāi)始是直接使用(unsigned int *),然后在這里調(diào)試了很久,一直沒(méi)發(fā)現(xiàn)問(wèn)題所在,突然想到三級(jí)優(yōu)化,加上volatile后程序正常執(zhí)行。 以下是位帶宏定義和輸入—輸出測(cè)試代碼, #include stm32f10x.h #include bsp_led.h #include bsp_key.h
[單片機(jī)]
【STM32】GPIO的相關(guān)配置寄存器、庫(kù)函數(shù)、操作
STM32F1xx官方資料: 《STM32中文參考手冊(cè)V10》-第8章通用和復(fù)用功能IO(GPIO和AFIO) 《Cortex-M3權(quán)威指南(中文)》第5章 位帶操作 硬件連接 假設(shè)跑馬燈實(shí)驗(yàn)的硬件連接如上圖所示,LED0連接PB5,LED1連接PE5。由于在LED的另一端是VCC3.3,所以當(dāng)PB5或PE5為低電平的時(shí)候,LED燈會(huì)亮。此時(shí)GPIO應(yīng)采取推挽輸出的模式。 GPIO的相關(guān)配置寄存器 STM32的每組GPIO口包括7個(gè)寄存器。也就是說(shuō),每個(gè)寄存器可以控制一組GPIO的16個(gè)GPIO口。這7個(gè)寄存器分別為: GPIOx_CRL:端口配置低寄存器(32位) GPIOx_CRH:端口配置高寄存器(32
[單片機(jī)]
【STM32】GPIO的相關(guān)配置寄存器、庫(kù)函數(shù)、<font color='red'>位</font><font color='red'>操作</font>
Keil創(chuàng)建新的STM32工程以及CortexM3的操作
  上周實(shí)驗(yàn)課照例很水,首先是準(zhǔn)備工作沒(méi)做好,J-Link的驅(qū)動(dòng)沒(méi)裝好,而且由于機(jī)房電腦本身的問(wèn)題好多機(jī)子無(wú)法正確裝驅(qū)動(dòng),或者在進(jìn)入keil后會(huì)彈出莫名錯(cuò)誤、閃退等情況,方老師說(shuō)得好,當(dāng)我們浪費(fèi)時(shí)間再做這些事情的時(shí)候(浪費(fèi)時(shí)間很大程度上是因?yàn)闄C(jī)房電腦造成的),好一點(diǎn)的學(xué)校早就在寫(xiě)程序了。這么多時(shí)間已經(jīng)浪費(fèi)了,還有多少能剩下來(lái)看代碼進(jìn)而理解它呢?   從新建一個(gè)工程開(kāi)始學(xué)習(xí),再加上上周實(shí)驗(yàn)課的位帶操作相關(guān)內(nèi)容,有需要的同學(xué)可以看看,也希望指正相關(guān)錯(cuò)誤:) 1.新建工程   在keil中新建一個(gè)基于51的工程挺簡(jiǎn)單,不過(guò)新建一個(gè)STM32工程要復(fù)雜一些,多了一些步驟,需要建立更詳細(xì)的工程目錄,導(dǎo)入一些CMSIS(Cortex Mic
[單片機(jī)]
Keil創(chuàng)建新的STM32工程以及CortexM3的<font color='red'>位</font>帶<font color='red'>操作</font>
今年嵌入式展,MCU開(kāi)啟神仙打架
這幾天,德國(guó)Embedded World國(guó)際嵌入式展正式召開(kāi)。和往年一樣,今年的嵌入式展各大MCU巨頭又開(kāi)啟了神仙打架模式。 可以說(shuō),這些巨頭發(fā)布的產(chǎn)品,一個(gè)比一個(gè)夸張。 TI:小,實(shí)在是太小了 跟其他廠商的策略不一樣,德州儀器(TI)推出了一款全球最小的MCU——MSPM0C1104,進(jìn)一步擴(kuò)展了其MSPM0 MCU產(chǎn)品組合。 這款MCU沒(méi)別的,就是小,很小,非常小。其采用晶圓芯片級(jí)封裝 (WCSP) ,面積僅為 1.38mm2,相當(dāng)于一粒黑胡椒。TI稱這款MCU比業(yè)界目前最小的MCU還小38%。具體有多小呢,看下面的圖就懂了。 別看它這么小,性能也不含糊,該有的功能都有。通過(guò)TI官網(wǎng)介紹,MSPM0C110
[嵌入式]
今年嵌入式展,<font color='red'>MCU</font>開(kāi)啟神仙打架
調(diào)試器連接MCU不穩(wěn)定怎么辦?
有沒(méi)有小伙伴遇到使用GDlink或者Jlink調(diào)試GD32 MCU的時(shí)候出現(xiàn)不穩(wěn)定的情況,剛要發(fā)現(xiàn)問(wèn)題時(shí)調(diào)試器和MCU斷開(kāi)連接了,這個(gè)時(shí)候可能抓狂的心都有了。今天就教給大家?guī)讉€(gè)提高調(diào)試器連接MCU穩(wěn)定性的方法。 1、調(diào)試器和MCU之間連線的長(zhǎng)度。 當(dāng)出現(xiàn)連接不穩(wěn)定的時(shí)候,我們首先需要檢查調(diào)試器和MCU之間的連線是不是過(guò)長(zhǎng),一般是在10cm以下為佳,距離越短,連接越穩(wěn)定。 2、適當(dāng)降低調(diào)試器仿真速度。 我們可以在IDE中去設(shè)置調(diào)試器的仿真速度,以keil為例,默認(rèn)一般是5MHz,當(dāng)出現(xiàn)連接不穩(wěn)定時(shí),可適當(dāng)降低速度,比如1MHz。當(dāng)然也不能太低,否則反而會(huì)不利于仿真。 3、盡量使用排線連接 仿真器和MCU盡量使用排線進(jìn)行連接
[單片機(jī)]
調(diào)試器連接<font color='red'>MCU</font>不穩(wěn)定怎么辦?
8單片機(jī)體系的直接軟件構(gòu)架(C51系列)
1.啟動(dòng)文件的編制 $ NOMOD51 ;Ax51宏匯編器控制命令:禁止預(yù)定義的8051 ;自定義上電后需要初始化的儲(chǔ)存區(qū)域 ;間接尋址區(qū)IDATA起始地址固定為0 IDATALEN EQU 8OH ;指定需要初始化的IDATA區(qū)長(zhǎng)度(以字節(jié)為單位) XDATASTART EQU OH ;需要初始化的外部直接尋址區(qū)XDATA的起始地址 XDATALEN EQU OH ;指定需要初始化的XDATA區(qū)長(zhǎng)度(以字節(jié)為單位) PDATASTART EQU OH ;指定需要初始化的頁(yè)尋址區(qū)PDATA起始地址 PDATALEN EQU OH ;指定需要初始化的PDATA
[單片機(jī)]
【GD32 MCU 入門教程】GD32 MCU 常見(jiàn)外設(shè)介紹(1)RCU 時(shí)鐘介紹
眾所周知,時(shí)鐘是MCU能正常運(yùn)行的基本條件,就好比心跳或脈搏,為所有的工作單元提供時(shí)間 基數(shù)。時(shí)鐘控制單元提供了一系列頻率的時(shí)鐘功能,包括多個(gè)內(nèi)部RC振蕩器時(shí)鐘(IRC)、一個(gè)外部 高速晶體振蕩器時(shí)鐘(HXTAL)、一個(gè)外部低速晶體振蕩器時(shí)鐘(LXTAL)、一個(gè)或多個(gè)鎖相環(huán)(PLL) 一個(gè)HXTAL時(shí)鐘和LXTAL時(shí)鐘監(jiān)視器、時(shí)鐘預(yù)分頻器、時(shí)鐘多路復(fù)用器和時(shí)鐘門控電路等。 本章,我們將通過(guò)一個(gè)“輸出HXTAL時(shí)鐘信號(hào)” 的實(shí)驗(yàn)來(lái)熟悉RCU的工作流程。 1.1RCU 配置 GD32系列MCU在啟動(dòng)后首先會(huì)執(zhí)行Reset Handler,緊接著就會(huì)執(zhí)行SystemInit()函數(shù),而時(shí)鐘的初始化,就是在這個(gè)函數(shù)中進(jìn)行,其主要的功能是配
[單片機(jī)]
【GD32 <font color='red'>MCU</font> 入門教程】GD32 <font color='red'>MCU</font> 常見(jiàn)外設(shè)介紹(1)RCU 時(shí)鐘介紹
你了解你的GD32 MCU系統(tǒng)主頻是多少嗎 ?
系統(tǒng)時(shí)鐘是GD32 MCU的時(shí)基,可以理解為系統(tǒng)的心跳,片上所有的外設(shè)以及CPU最原始的時(shí)鐘都來(lái)自于系統(tǒng)時(shí)鐘,因而明確當(dāng)前系統(tǒng)時(shí)鐘是多少非常重要,只有明確了系統(tǒng)時(shí)鐘,才能夠?qū)崿F(xiàn)準(zhǔn)確的定時(shí)、準(zhǔn)確的采樣間隔以及準(zhǔn)確的通信速率等。 以GD32F303為例,其系統(tǒng)時(shí)鐘配置在system_gd32f30x.c中,如下圖所示,可以通過(guò)打開(kāi)或者關(guān)閉相關(guān)的宏定義進(jìn)行時(shí)鐘配置,GD32以及提供了一些時(shí)鐘配置的函數(shù),可以通過(guò)宏定義開(kāi)關(guān)進(jìn)行選擇。 確認(rèn)當(dāng)前系統(tǒng)時(shí)鐘有以下兩個(gè)方法: 1、軟件方式確認(rèn) 使用void SystemCoreClockUpdate(void)函數(shù)進(jìn)行更新當(dāng)前系統(tǒng)時(shí)鐘SystemCoreClock,該函數(shù)為根據(jù)當(dāng)前RCU
[單片機(jī)]
你了解你的GD32 <font color='red'>MCU</font>系統(tǒng)主頻是多少嗎 ?
小廣播
設(shè)計(jì)資源 培訓(xùn) 開(kāi)發(fā)板 精華推薦

最新單片機(jī)文章

 
EEWorld訂閱號(hào)

 
EEWorld服務(wù)號(hào)

 
汽車開(kāi)發(fā)圈

 
機(jī)器人開(kāi)發(fā)圈

電子工程世界版權(quán)所有 京ICP證060456號(hào) 京ICP備10001474號(hào)-1 電信業(yè)務(wù)審批[2006]字第258號(hào)函 京公網(wǎng)安備 11010802033920號(hào) Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 玉门市| 许昌市| 甘南县| 监利县| 石屏县| 延长县| 宁明县| 驻马店市| 普格县| 淄博市| 朝阳市| 三原县| 玉溪市| 彭山县| 东丰县| 布拖县| 呼伦贝尔市| 阳春市| 东港市| 株洲市| 容城县| 德兴市| 淳化县| 静安区| 怀仁县| 大埔区| 松阳县| 鹤峰县| 永州市| 加查县| 江源县| 定兴县| 金华市| 浠水县| 资中县| 视频| 平湖市| 铜陵市| 蓝山县| 绥化市| 凤台县|