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次方
#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次方
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次方
上一篇:[課程-014位帶操作——GPIO的輸入和輸出控制]
下一篇:SPI通信四大模式
推薦閱讀最新更新時(shí)間:2025-06-24 12:11






設(shè)計(jì)資源 培訓(xùn) 開(kāi)發(fā)板 精華推薦
- Microchip 升級(jí)數(shù)字信號(hào)控制器(DSC)產(chǎn)品線 推出PWM 分辨率和 ADC 速度業(yè)界領(lǐng)先的新器件
- 意法半導(dǎo)體STM32MP23x:突破成本限制的工業(yè)AI應(yīng)用核心
- 意法半導(dǎo)體推出用于匹配遠(yuǎn)距離無(wú)線微控制器STM32WL33的集成的匹配濾波芯片
- ESP32開(kāi)發(fā)板連接TFT顯示屏ST7789跳坑記
- 如何讓ESP32支持analogWrite函數(shù)
- LGVL配合FreeType為可變字體設(shè)置字重-ESP32篇
- 使用樹(shù)莓派進(jìn)行 ESP32 Jtag 調(diào)試
- ESP32怎么在SPIFFS里面存儲(chǔ)html,css,js文件,以及網(wǎng)頁(yè)和arduino的通訊
- ESP32 freeRTOS使用測(cè)試
- 基于霍爾傳感器的自行車測(cè)速
- LT3470AIDDB 12V 降壓轉(zhuǎn)換器的典型應(yīng)用電路
- OP295GSZ 4.5V、低壓差運(yùn)算放大器基準(zhǔn)的典型應(yīng)用
- STEVAL-ISA098V1,使用 L7985A 的演示板,HSOP8 封裝中的 2 A 降壓開(kāi)關(guān)
- NCP2811 NOCAP高級(jí)立體聲耳機(jī)放大器典型應(yīng)用電路
- STM3210C-EVAL,基于 STM32F107VCT STM32 ARM Cortex-M3(256KB 閃存)連接線 MCU 的評(píng)估板
- 使用 ROHM Semiconductor 的 BD45321 的參考設(shè)計(jì)
- EVAL40WFLYP7950VTOBO1、40W 適配器評(píng)估板在無(wú)緩沖器反激中使用 950V CoolMOS P7 和 ICE2QS03G QR 反激控制器以提高效率
- L296P大電流開(kāi)關(guān)穩(wěn)壓器典型應(yīng)用電路
- 用于便攜式應(yīng)用的 RT9524 線性單節(jié)鋰離子電池充電器 IC 的典型應(yīng)用電路
- 意法半導(dǎo)體公布2025年第二季度財(cái)報(bào)和電話會(huì)議時(shí)間安排
- 利用人工智能提升車間生產(chǎn)效率
- 方案分享 | ARXML 規(guī)則下 ECU 總線通訊與 ADTF 測(cè)試方案
- 車載SerDes產(chǎn)業(yè)起飛!國(guó)產(chǎn)新品密集炸場(chǎng)
- 出貨量激增1.34倍! 5G車規(guī)模組成標(biāo)配,三大廠商新品同臺(tái)競(jìng)技
- 6月新能源市場(chǎng):零跑創(chuàng)新高;比亞迪海外突破;理想滑坡
- 基于中科芯車規(guī)MCU的LED矩陣大燈應(yīng)用方案
- 蘋(píng)果被判侵犯3G專利,需向西班牙公司TOT賠償1.1億美元
- 從設(shè)計(jì)概念到 FPGA 原型僅需數(shù)分鐘,印度 InCore 完成 SoC Generator 平臺(tái)硅驗(yàn)證
- 消息稱因難尋客戶,三星推遲美國(guó)芯片工廠的完工時(shí)間
- mini2440裸機(jī)試煉之——Uart與pc端實(shí)現(xiàn)文件、字符傳輸
- mini2440裸機(jī)試煉之IIS——音樂(lè)播放器
- mini2440裸機(jī)試煉之——IIC控制EEPROM數(shù)據(jù)傳輸
- mini2440裸機(jī)試煉之——看門狗中斷和復(fù)位操作
- STM32F10x 學(xué)習(xí)筆記之USART實(shí)現(xiàn)串口通訊 DMA 方式
- 機(jī)器人的到來(lái),人類的工作會(huì)被機(jī)器人取代,我們將何去何從
- 智能電銷機(jī)器人vs電銷員工,5項(xiàng)能力PK
- 2018,期待我國(guó)機(jī)器人產(chǎn)業(yè)的崛起
- 解放電銷人的大腦,智齒科技電銷機(jī)器人上線
- 汽車總線向CAN FD升級(jí) 需要簡(jiǎn)化設(shè)計(jì)并降低成本