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

430學習筆記之我見

發布者:石頭上種莊稼最新更新時間:2021-03-18 來源: eefocus關鍵字:MSP430  學習筆記 手機看文章 掃描二維碼
隨時隨地手機看文章

簡介:這只是我在學習TI公司生產的16位超的功耗單片機MSP430的隨筆,希望能對其他朋友有所借鑒,不對之處還請多指教。講解430的書現在也有很多了,不過大多數都是詳細說明底層硬件結構的,看了不免有些空洞和枯燥,我認為了解一個MCU的操作首先要對其基礎特性有所了解,然后再仔細研究各模塊的功能。


1.首先你要知道msp430的存儲器結構。典型微處理器的結構有兩種:馮。諾依曼結構——程序存儲器和數據存儲器統一編碼;哈佛結構——程序存儲器和數據存儲器;MSP430系列單片機屬于前者,而常用的mcs51系列屬于后者。


0-0xf特殊功能寄存器;0x10-0x1ff外圍模塊寄存器;0x200-?根據不同型號地址從低向高擴展;0x1000-0x107f seg_b0x1080_0x10ff seg_a 供flash信息存儲


剩下的從0xffff開始向下擴展,根據不同容量,例如149為60KB,0xffff-0x1100


2. 復位信號是MCU工作的起點,430的復位型號有兩種:上電復位信號POR和上電清楚信號PUC。POR信號只在上電和RST/NMI復位管腳被設置為復位功能,且低電平時系統復位。而PUC信號是POR信號產生,以及其他如看門狗定時溢出、安全鍵值出現錯誤是產生。但是,無論那種信號觸發的復位,都會使MSP430在地址0xffff處讀取復位中斷向量,然后程序從中斷向量所指的地址開始執行。復位后的狀態不寫了,詳見參考書,嘿嘿。


3. 系統時鐘是一個程序運行的指揮官,時序和中斷也是整個程序的核心和中軸線。430最多有三個振蕩器,DCO內部振蕩器;LFXT1外接低頻振蕩器,常見的 32768HZ,不用外接負載電容;也可接高頻450KHZ-8M,需接負載電容;XT2接高頻450KHZ-8M,加外接電容。


430有三種時鐘信號:MCLK系統主時鐘,可分頻1 2 4 8,供cpu使用,其他外圍模塊在有選擇情況下也可使用;SMCLK系統子時鐘,供外圍模塊使用,可選則不同振蕩器產生的時鐘信號;ACLK輔助時鐘,只能由LFXT1產生,供外圍模塊。


4.中斷是430處理器的一大特色,因為幾乎每個外圍模塊都能產生,430可以在沒有任務時進入低功耗狀態,有事件時中斷喚醒cpu,處理完畢再次進入低功耗狀態。


整個中斷的響應過程是這樣的,當有中斷請求時,如果cpu處于活動狀態,先完成當前命令;如果處于低功耗,先退出,將下一條指令的pc值壓入堆棧;如果有多個中斷請求,先響應優先級高的;執行完后,等待中斷請求標志位復位,要注意,單中斷源的中斷請求標志位自動復位,而多中斷的標志位需要軟件復位;然后系統總中斷允許位SR.GIE復位,相應的中斷向量值裝入pc,程序從這個地址繼續執行。


這里要注意,中斷允許位SR.GIE和中斷嵌套問題。如果當你執行中斷程序過程中,希望可以響應更高級別的中斷請求時,必須在進入第一個中斷時把SR.GIE置位。


其實,其他的外圍模塊時鐘沿著時鐘和中斷這個核心來執行的。具體的結構我也不羅索了,可以參考430系列手冊。


我想在寫一下c語言對430編程的整體結構。基本上屬于框架結構,即整體的模塊化編程,其實這也是硬件編程的基本法則拉(可不是我規定的法則哦)。


首先是程序的頭文件,包括#include ,這是14系列,因為常用149;其他型號可自己修改。還可以包括#include "data.h" 等數據庫頭文件,或函數變量聲明頭文件,都是你自己定義的哦。


接著就是函數和變量的聲明 void Init_Sys(void);系統初始化


系統初始化是個整體的概念,廣義上講包括所有外圍模塊的初始化,你可以把外圍模塊初始化的子函數寫到Init_Sys()中,也可以分別寫各個模塊的初始化。但結構的簡潔,最好寫完系統的時鐘初始化后,其他所用到的模塊也在這里初始化。


void Init_Sys()


{


unsigned int i;


BCSCTL1&=~XT2OFF; //打開XT2振蕩器


do


{


IFG1 &= ~OFIFG; // 清除振蕩器失效標志


for (i = 0xFF; i > 0; i--); // 延時,等待XT2起振


}


while ((IFG1 & OFIFG) != 0); // 判斷XT2是否起振


BCSCTL2 =SELM_2+SELS; //選擇MCLK、SMCLK為XT2


//以下對各種模塊、中斷、外圍設備等進行初始化


........................................


_EINT(); //打開全局中斷控制


}


這里涉及到時鐘問題,通常我們選擇XT2為8M晶振,也即系統主時鐘MCLK為8M,cpu執行命令以此時鐘為準;但其他外圍模塊可以在相應的控制寄存器中選擇其他的時鐘,ACLK;當你對速度要求很低,定時時間間隔大時,就可以選擇ACLK,例如在定時器Timea初始化中設置。


主程序: void main( void )


{


WDTCTL = WDTPW + WDTHOLD; //關閉看門狗


InitSys(); //初始化


//自己任務中的其他功能函數


。。。。。。。。。。。。。。。。。。。。。


while(1);


}


主程序之后我要講講中斷函數,中斷是你做單片機任務中不可缺少的部分,也可以說是靈魂了(夸張嗎)。


/*****************************************************************************


各中斷函數,可按優先級依次書寫


***********************************************************************/


舉個定時中斷的例子:


初始化 void Init_Timer_A(void)


{


TACTL = TASSEL0 + TACLR; // ACLK, clear TAR


CCTL0 = CCIE; // CCR0 中斷使能


CCR0=32768; //定時1s


TACTL|=MC0; //增計數模式


}


中斷服務 #pragma vector=TIMERA0_VECTOR


__interrupt void TimerA0()


{


// 你自己要求中斷執行的任務


}


當然,還有其他的定時,和多種中斷,各系列芯片的中斷向量個數也不同。


這就是簡單的整體程序框架,寫得簡單啦,還忘諒解,明天詳細了解一下各外圍模塊的初始化和功能,晚安。


整體的程序設計結構,包括了所有外圍模塊及內部時鐘,中斷,定時的初始化。具體情況大家可以根據自己的需要添加或者減少,記住,模塊化設計時最有力的武器。


這可是個人總結的經典阿,謝謝支持。因為經常使用149,所以這是149的結構,其他的再更改,根據個人需要。


/*****************************************************************************


文件名:main.c


描述:MSP430框架程序。適用于MSP430F149,其他型號需要適當改變。


不使用的中斷函數保留或者刪除都可以,但保留時應確保不要打開不需要的中斷。


*****************************************************************************/


//頭文件


#include


//函數聲明


void InitSys();


int main( void )


{


WDTCTL = WDTPW + WDTHOLD; //關閉看門狗


InitSys(); //初始化


start:


//以下填充用戶代碼


LPM3; //進入低功耗模式n,n:0~4。若不希望進入低功耗模式,屏蔽本句


goto start;


}


/*****************************************************************************


系統初始化


******************************************************************************/


void InitSys()


{


unsigned int iq0;


//使用XT2振蕩器


BCSCTL1&=~XT2OFF; //打開XT2振蕩器


do


{


IFG1 &= ~OFIFG; // 清除振蕩器失效標志


for (iq0 = 0xFF; iq0 > 0; iq0--); // 延時,等待XT2起振


}


while ((IFG1 & OFIFG) != 0); // 判斷XT2是否起振


BCSCTL2 =SELM_2+SELS; //選擇MCLK、SMCLK為XT2


//以下填充用戶代碼,對各種模塊、中斷、外圍設備等進行初始化


_EINT(); //打開全局中斷控制,若不需要打開,可以屏蔽本句


}


/*****************************************************************************


端口2中斷函數


******************************************************************************/


#pragma vector=PORT2_VECTOR


__interrupt void Port2()


{


//以下為參考處理程序,不使用的端口應當刪除其對于中斷源的判斷。


if((P2IFG&BIT0) == BIT0)


{


//處理P2IN.0中斷


P2IFG &= ~BIT0; //清除中斷標志


//以下填充用戶代碼


}


else if((P2IFG&BIT1) ==BIT1)


{


//處理P2IN.1中斷


P2IFG &= ~BIT1; //清除中斷標志


//以下填充用戶代碼


}


else if((P2IFG&BIT2) ==BIT2)


{


//處理P2IN.2中斷


P2IFG &= ~BIT2; //清除中斷標志


//以下填充用戶代碼


}


else if((P2IFG&BIT3) ==BIT3)


{


//處理P2IN.3中斷


P2IFG &= ~BIT3; //清除中斷標志


//以下填充用戶代碼


}


else if((P2IFG&BIT4) ==BIT4)


{


//處理P2IN.4中斷


P2IFG &= ~BIT4; //清除中斷標志


//以下填充用戶代碼


}


else if((P2IFG&BIT5) ==BIT5)


{


//處理P2IN.5中斷


P2IFG &= ~BIT5; //清除中斷標志


//以下填充用戶代碼


}


else if((P2IFG&BIT6) ==BIT6)


{


//處理P2IN.6中斷


P2IFG &= ~BIT6; //清除中斷標志


//以下填充用戶代碼


}


else


{


//處理P2IN.7中斷


P2IFG &= ~BIT7; //清除中斷標志


//以下填充用戶代碼


}


LPM3_EXIT; //退出中斷后退出低功耗模式。若退出中斷后要保留低功耗模式,將本句屏蔽


}


/*****************************************************************************


USART1發送中斷函數


******************************************************************************/


#pragma vector=USART1TX_VECTOR


__interrupt void Usart1Tx()


{


//以下填充用戶代碼


LPM3_EXIT; //退出中斷后退出低功耗模式。若退出中斷后要保留低功耗模式,將本句屏蔽


}


/*****************************************************************************


USART1接收中斷函數


******************************************************************************/


#pragma vector=USART1RX_VECTOR


__interrupt void Ustra1Rx()


{


//以下填充用戶代碼


LPM3_EXIT; //退出中斷后退出低功耗模式。若退出中斷后要保留低功耗模式,將本句屏蔽


}


/*****************************************************************************


端口1中斷函數


多中斷中斷源:P1IFG.0~P1IFG7


進入中斷后應首先判斷中斷源,退出中斷前應清除中斷標志,否則將再次引發中斷


******************************************************************************/


#pragma vector=PORT1_VECTOR


__interrupt void Port1()


{


//以下為參考處理程序,不使用的端口應當刪除其對于中斷源的判斷。


if((P1IFG&BIT0) == BIT0)


{


//處理P1IN.0中斷


P1IFG &= ~BIT0; //清除中斷標志


//以下填充用戶代碼


}


else if((P1IFG&BIT1) ==BIT1)


{


//處理P1IN.1中斷


P1IFG &= ~BIT1; //清除中斷標志


//以下填充用戶代碼


}


else if((P1IFG&BIT2) ==BIT2)


{


//處理P1IN.2中斷


P1IFG &= ~BIT2; //清除中斷標志


//以下填充用戶代碼


}


else if((P1IFG&BIT3) ==BIT3)


{


//處理P1IN.3中斷


P1IFG &= ~BIT3; //清除中斷標志


//以下填充用戶代碼


}


else if((P1IFG&BIT4) ==BIT4)


{


//處理P1IN.4中斷


P1IFG &= ~BIT4; //清除中斷標志


//以下填充用戶代碼


}


else if((P1IFG&BIT5) ==BIT5)


{


//處理P1IN.5中斷


P1IFG &= ~BIT5; //清除中斷標志


//以下填充用戶代碼


}


else if((P1IFG&BIT6) ==BIT6)


{


//處理P1IN.6中斷


P1IFG &= ~BIT6; //清除中斷標志


//以下填充用戶代碼


}


else


{


//處理P1IN.7中斷


P1IFG &= ~BIT7; //清除中斷標志


//以下填充用戶代碼


}


LPM3_EXIT; //退出中斷后退出低功耗模式。若退出中斷后要保留低功耗模式,將本句屏蔽


}


/*****************************************************************************


定時器A中斷函數


多中斷中斷源:CC1~2 TA


******************************************************************************/


#pragma vector=TIMERA1_VECTOR


__interrupt void TimerA1()


{


//以下為參考處理程序,不使用的中斷源應當刪除


switch (__even_in_range(TAIV, 10))


{


case 2:


//捕獲/比較1中斷


//以下填充用戶代碼


break;


case 4:


//捕獲/比較2中斷


//以下填充用戶代碼


break;


case 10:


//TAIFG定時器溢出中斷


//以下填充用戶代碼


break;


}


LPM3_EXIT; //退出中斷后退出低功耗模式。若退出中斷后要保留低功耗模式,將本句屏蔽


}


/*****************************************************************************


定時器A中斷函數


中斷源:CC0


******************************************************************************/


#pragma vector=TIMERA0_VECTOR


__interrupt void TimerA0()


{


//以下填充用戶代碼


LPM3_EXIT; //退出中斷后退出低功耗模式。若退出中斷后要保留低功耗模式,將本句屏蔽


}


/*****************************************************************************


AD轉換器中斷函數


多中斷源:摸擬0~7、VeREF+、VREF-/VeREF-、(AVcc-AVss)/2


沒有處理ADC12TOV和ADC12OV中斷標志


******************************************************************************/


#pragma vector=ADC_VECTOR


__interrupt void Adc()


{


//以下為參考處理程序,不使用的中斷源應當刪除


if((ADC12IFG&BIT0)==BIT0)


{


//通道0


//以下填充用戶代碼


}


else if((ADC12IFG&BIT1)==BIT1)


{


//通道1


//以下填充用戶代碼


}


else if((ADC12IFG&BIT2)==BIT2)


{


//通道2


//以下填充用戶代碼


}


else if((ADC12IFG&BIT3)==BIT3)


{


//通道3


//以下填充用戶代碼


}


else if((ADC12IFG&BIT4)==BIT4)


{


//通道4


//以下填充用戶代碼


}


else if((ADC12IFG&BIT5)==BIT5)


{


//通道5


//以下填充用戶代碼


}


else if((ADC12IFG&BIT6)==BIT6)


{


//通道6


//以下填充用戶代碼


}


else if((ADC12IFG&BIT7)==BIT7)


{


//通道7


//以下填充用戶代碼


}


else if((ADC12IFG&BIT8)==BIT8)


{


//VeREF+


//以下填充用戶代碼


}


else if((ADC12IFG&BIT9)==BIT9)


{


//VREF-/VeREF-


//以下填充用戶代碼


}


else if((ADC12IFG&BITA)==BITA)


{


//溫度


//以下填充用戶代碼


}


else if((ADC12IFG&BITB)==BITB)


{


//(AVcc-AVss)/2


//以下填充用戶代碼


}


LPM3_EXIT; //退出中斷后退出低功耗模式。若退出中斷后要保留低功耗模式,將本句屏蔽


}


/*****************************************************************************


USART0發送中斷函數


******************************************************************************/


#pragma vector=USART0TX_VECTOR


__interrupt void Usart0Tx()


{


//以下填充用戶代碼


LPM3_EXIT; //退出中斷后退出低功耗模式。若退出中斷后要保留低功耗模式,將本句屏蔽


}


/*****************************************************************************


USART0接收中斷函數


******************************************************************************/


#pragma vector=USART0RX_VECTOR


__interrupt void Usart0Rx()


{


//以下填充用戶代碼


LPM3_EXIT; //退出中斷后退出低功耗模式。若退出中斷后要保留低功耗模式,將本句屏蔽


}


/*****************************************************************************


看門狗定時器中斷函數


******************************************************************************/


#pragma vector=WDT_VECTOR


__interrupt void WatchDog()


{


//以下填充用戶代碼


LPM3_EXIT; //退出中斷后退出低功耗模式。若退出中斷后要保留低功耗模式,將本句屏蔽


}


/*****************************************************************************


比較器A中斷函數


******************************************************************************/


#pragma vector=COMPARATORA_VECTOR


__interrupt void ComparatorA()


{


//以下填充用戶代碼


LPM3_EXIT; //退出中斷后退出低功耗模式。若退出中斷后要保留低功耗模式,將本句屏蔽


}


/*****************************************************************************


定時器B中斷函數


多中斷源:CC1~6 TB


******************************************************************************/


#pragma vector=TIMERB1_VECTOR


__interrupt void TimerB1()


{


//以下為參考處理程序,不使用的中斷源應當刪除


switch (__even_in_range(TBIV, 14))


{


case 2:


//捕獲/比較1中斷


//以下填充用戶代碼


break;


case 4:


//捕獲/比較2中斷


//以下填充用戶代碼


break;


case 6:


//捕獲/比較3中斷


//以下填充用戶代碼


break;


case 8:


//捕獲/比較4中斷


//以下填充用戶代碼


break;


case 10:


//捕獲/比較5中斷


//以下填充用戶代碼


break;


case 12:


//捕獲/比較6中斷


//以下填充用戶代碼


break;


case 14:


//TBIFG定時器溢出中斷


//以下填充用戶代碼


break;


}


LPM3_EXIT; //退出中斷后退出低功耗模式。若退出中斷后要保留低功耗模式,將本句屏蔽


}


/*****************************************************************************


定時器B中斷函數


中斷源:CC0


******************************************************************************/


#pragma vector=TIMERB0_VECTOR


__interrupt void TimerB0()


{


//以下填充用戶代碼


LPM3_EXIT; //退出中斷后退出低功耗模式。若退出中斷后要保留低功耗模式,將本句屏蔽


}


/*****************************************************************************


不可屏蔽中斷函數


******************************************************************************/

[1] [2]
關鍵字:MSP430  學習筆記 引用地址:430學習筆記之我見

上一篇:基于MSP430單片機的CPU卡模板程序(一)
下一篇:MSP430看門狗程序

推薦閱讀最新更新時間:2025-04-08 12:22

TI推出可降低常開智能手機、平板電腦及配件功耗MSP430微控制器
德州儀器 (TI) 宣布推出可降低常開智能手機、平板電腦及配件功耗的最新 MSP430? 微控制器 (MCU),為新一代手持消費類設備實現高級環境計算。開發人員可采用 MSP430F525x MCU 實現傳感器集線器、鍵盤控制與電池/電源管理功能傳輸,創建的便攜式消費類設備能夠使高功耗應用處理器及觸摸屏控制器處于待機狀態,而不是消耗系統電池。 MSP430F525x MCU 采用 1.8V 分軌 I/O 架構,無需外部電平轉換電路便可實現與應用處理器的無縫連接。客戶現在可創建能夠將 I/O 保持為 1.8V,將 MCU 保持在最大工作性能下的智能手機、平板電腦與配件。這些微控制器支持 3.5μs 的快速喚醒時間以及低至 1.6μA
[單片機]
用ozone調試stm32的boot跳APP的問題--Apple的學習筆記
一,前言 過年不能一直玩游戲呢~那么我干什么呢!又開始折騰了,記得之前做過一個boot跳app是正常的,原因是base工程一樣,一個做boot,一個做app,但是我app框架換成了用cubemx生成的之后,看上去boot就無法app了。所以我今天就來查下這個問題。 二,調查方法 首先要看是否boot跳入app其實也簡單,用一個led燈即可,總的來說我僅修改了app框架代碼,怎么就無法跳入app了,所以大體上我覺得是跳入APP的。但是我不想用led或printf來調試,我想用調試器來來說,但是keil沒有attach功能,怎么調試呢!我想到了ozone是可以attach的。 三,問題原因 用keil分別下載了boot+app
[單片機]
STM32自制GUI小游戲--Apple的學習筆記
一,前言 要過年了,我就玩會吧~GUI之前學習過了guilite源碼,那么我就調用它的API自己做個小游戲玩玩。步驟是先在vs上完成調試,然后移植到stm32F4開發板上。主要也想多用用新買的并口LCD屏,因為之前的ili9325并口8bit連camera不能用DMA,我又買了個ili9431并口16bit屏幕(連接camera方便DMA直接采集賦值),因為8bit的話,16bit需要先傳高bit再傳低bit給LCD。而camera DMA是4個字節按低地址到高地址寫到LCD,這樣就導致8bit LCD無法通過DMA連接camera了。跑題了,我順便述說我的新屏幕,哈哈~先看下游戲效果圖吧!其實可以理解為一個超級瑪麗小游戲。
[單片機]
ESP32學習筆記(20)——SPI(從機)接口使用
一、SPI簡介 SPI(Serial Peripheral Interface) 協議是由摩托羅拉公司提出的通訊協議,即串行外圍設備接口,是一種高速全雙工的通信總線。它被廣泛地使用在 ADC、LCD 等設備與 MCU 間,要求通訊速率較高的場合。 芯片的管腳上只占用四根線。 MISO: 主器件數據輸出,從器件數據輸入。 MOSI:主器件數據輸入,從器件數據輸出。 SCK: 時鐘信號,由主設備控制發出。 NSS(CS): 從設備選擇信號,由主設備控制。當NSS為低電平則選中從器件。 1.1 ESP32中SPI ESP32集成了兩個通用SPI控制器,可用作片外SPI主設備驅動的從節點 SPI2,有時也稱為HSPI SPI
[單片機]
FreeRTOS學習筆記(1)——移植源碼到STM32F103
一、簡介 FreeRTOS 是一個可裁剪、可剝奪型的多任務內核,而且沒有任務數限制。FreeRTOS 提供了實時操作系統所需的所有功能,包括資源管理、同步、任務通信等。 FreeRTOS 是用 C 和匯編來寫的,其中絕大部分都是用 C 語言編寫的,只有極少數的與處理器密切相關的部分代碼才是用匯編寫的,FreeRTOS 結構簡潔,可讀性很強!最主要的是非常適合初次接觸嵌入式實時操作系統學生、嵌入式系統開發人員和愛好者學習。 最新版本 V9.0.0(2016年),盡管現在 FreeRTOS 的版本已經更新到 V10.4.1 了,但是我們還是選擇 V9.0.0,因為內核很穩定,并且網上資料很多,因為 V10.0.0 版本之后是亞馬遜收
[單片機]
ALSA聲卡07_分析調用過程_學習筆記
1、編譯新的strace工具分析aplay和amixer應用程序對聲卡的調用過程 (1)因為舊的strace工具不能識別不能識別alsa聲卡驅動程序里面的ioctrl. (2)編譯過程參考 http://blog.csdn.net/qingkongyeyue/article/details/52228729 (3)出現錯誤 需要建立相關的設備節點 播放聲音和調整音量 (4)等待音頻播放完,能得到一個完整的log,把log文件拷貝回windows下進行分析 2、調用分析(aplay.log)(搜索設備節點“/dev/snd”) strace分析: aplay Windows.wav 應用程序打開一個設備 節點的時候
[單片機]
ALSA聲卡07_分析調用過程_<font color='red'>學習</font><font color='red'>筆記</font>
ALSA聲卡10_從零編寫之數據傳輸_學習筆記
1、引言 (1)應用程序使用聲卡的時候,數據流程是:應用程序把數據發送給驅動,驅動把數據發送給硬件聲卡,聲卡把數據轉換成聲音數據播放出去。 (2)可以使用兩種方式發送數據 第一種:app發數據,等驅動處理完后再發下一段(處理完再發下一段就會導致聲音會斷斷續續 ) 第二種:應用程序不斷地發數據,驅動程序不斷地取數據,不斷地發給硬件。解決了聲音斷續的問題,但是要創建一個非常大的緩沖區(在驅動程序里面申請的 ,稱其為buffer) 一個采樣點的數據包括左聲道數據和右聲道數據 這里hw_ptr是指針( 更新是指指針向后移) 2、怎么寫驅動(s3c2440_dma.c(platform)) (1)負責數據傳輸的是平臺部分里面
[單片機]
ALSA聲卡10_從零編寫之數據傳輸_<font color='red'>學習</font><font color='red'>筆記</font>
基于STM32F407的FreeRTOS學習筆記(7)
本期在二進制信號量的基礎上介紹計數信號量 01基本介紹 01.什么是計數信號量 計數信號量顧名思義是用來計數的信號量,相比于二進制信號量,計數信號量的并不只有兩種狀態。用官方的開發者文檔中的話來說,計數信號量可以看作長度大于1的隊列,我們并不關心其中的內容而是關系隊列是否為空。 關于隊列的公眾號可以參考這篇文章。 02.如何創建計數信號量 官方的參考文檔中提供了兩種創建方式(動態和靜態)我們使用動態創建方式。調用xSemaphoreCreateCounting函數 其中包含了兩個參數,一個是最大計數量還有一個是初始計數量。 創建一個SemaphoreHandler_t類型的句柄變量用以接收返回值。 03.釋放和獲取信號
[單片機]
基于STM32F407的FreeRTOS<font color='red'>學習</font><font color='red'>筆記</font>(7)
小廣播
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京B2-20211791 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 海城市| 东宁县| 龙口市| 江油市| 育儿| 彩票| 喜德县| 淳安县| 东辽县| 宜章县| 金乡县| 六枝特区| 郧西县| 五大连池市| 乐东| 凤台县| 习水县| 二连浩特市| 宜君县| 额济纳旗| 绥江县| 平遥县| 淅川县| 平罗县| 常熟市| 恩平市| 亚东县| 峨山| 普兰店市| 乐亭县| 青冈县| 新泰市| 沭阳县| 阳东县| 余庆县| 临邑县| 湛江市| 泰州市| 靖安县| 青州市| 南皮县|