PA0 PB0 --PG0對應同一個中斷線號,設計外部中斷硬件電路時不要重複,如PA0和PB0不能同時設計爲外部中斷
在stm32的頭文件和啓動文件設計中,中斷線號10~15共用相同的入口函數,因此需要在中斷中進行判斷,來確定是那個信號觸發了中斷,如下代碼判斷
/****************************************************************
* function : EXTI15_10_IRQHandler
* Description : 外部中斷10和13共用中斷入口,通過觸發後狀態檢查確定
觸發中斷的管腳並執行相應代碼。
* input : 無
* output : 無
*****************************************************************/
void EXTI15_10_IRQHandler(void)
{
ITStatus EXTI10_Status;
ITStatus EXTI13_Status;
EXTI10_Status = EXTI_GetITStatus(EXTI_Line10); //獲得外部中斷10的狀態
EXTI13_Status = EXTI_GetITStatus(EXTI_Line13); //獲得外部中斷13的狀態
if(EXTI10_Status == SET)
{
led_light_up(1);
}
if(EXTI13_Status == SET)
{
led_light_up(2);
}
EXTI_ClearFlag(EXTI_Line10 | EXTI_Line13); /*清除外部中斷10或者13的掛起位 */
}
當CPU退出停止模式時,會強制切換到內部時鐘,因此在進入停止模式後一句要加上SystemInit()重新配置系統時鐘,避免時鐘改變,所以注意,時鐘的初始化是放在緊鄰進入停止模式後,喚醒後程序馬上就接着執行睡眠後面的初始化時鐘語句。
STM32三種啓動模式對應的存儲介質均是芯片內置的,它們是:
1)用戶閃存 = 芯片內置的Flash。
2)SRAM = 芯片內置的RAM區,就是內存啦。
3)系統存儲器 = 芯片內部一塊特定的區域,芯片出廠時在這個區域預置了一段Bootloader,就是通常說的ISP程序。這個區域的內容在芯片出廠後沒有人能夠修改或擦除,即它是一個ROM區。
在每個STM32的芯片上都有兩個管腳BOOT0和BOOT1,這兩個管腳在芯片復位時的電平狀態決定了芯片復位後從哪個區域開始執行程序,見下表:
BOOT1=x BOOT0=0 從用戶閃存啓動,這是正常的工作模式。一般我們使用JTAG或者SWD模式下載程序時,就是下載到這個裏面,重啓後也直接從這啓動程序
BOOT1=0 BOOT0=1 從系統存儲器啓動,這種模式啓動的程序功能由廠家設置。
BOOT1=1 BOOT0=1 從內置SRAM啓動,這種模式可以用於調試。
系統存儲器是芯片內部一塊特定的區域,STM32在出廠時,由ST在這個區域內部預置了一段BootLoader,也就是我們常說的ISP程序,這是一塊ROM,出廠後無法修改。
一般來說,我們選用這種啓動模式時,是爲了從串口下載程序,因爲在廠家提供的BootLoader中,提供了串口下載程序的固件,可以通過這個BootLoader將程序下載到系統的Flash中。但是這個下載方式需要以下步驟:
Step1:將BOOT0設置爲1,BOOT1設置爲0,然後按下復位鍵,這樣才能從系統存儲器啓動BootLoader
Step2:最後在BootLoader的幫助下,通過串口下載程序到Flash中
Step3:程序下載完成後,又有需要將BOOT0設置爲GND,手動復位,這樣,STM32纔可以從Flash中啓動
可以看到,利用串口下載程序還是比較的麻煩,需要跳帽跳來跳去的,非常的不注重用戶體驗
而且一鍵下載之後,程序從系統存儲器啓動
從待機模式喚醒後的代碼執行等同於復位後的執行(採樣啓動模式引腳,讀取復位向量等)。
電源控制/狀態寄存器(PWR_CSR)將會指示內核由待機狀態退出
STM32 的 硬件IIC 是雞肋!請謹慎使用 開啓FSMC則IIC就無法工作
在STC 單片機中內置了EEPROM(其實是採用IAP 技術讀寫內部FLASH 來 實現EEPROM),這樣就節省了片外資源,使用起來也更加方便
串口下載又叫ISP下載,PLC通過485線控制變頻器調速,電腦用USB轉串口連接PLC。用CH340的話,變頻器一旦啓動,電腦端和PLC的通訊就很容易中斷,用FT232則無此問題
STM32F107的APB1(PCLK1)操作速度限制在36MHZ,其掛載外設如DAC1\SPI2速度在36MHZ以下,APB2全速。
PCLK1對應APB1外設
定時器的倍頻器,當APB的分頻爲1時,它的倍頻值爲1,否則它的倍頻值就爲2
重映射我們同樣要使能複用功能的時候講解的 2 個時鐘外, 還要使能 AFIO 功能時鐘, 然後
要調用重映射函數
搶佔優先級的級別高於響應優先級。而數值越小所代表的優先級就越高
因爲 LOAD 僅僅是一個 24bit 的寄存器,延時的 ms 數不能太長。否則超出了 LOAD 的範圍,高位會被捨去,導致
延時不準。最大延遲 ms 數可以通過公式:nms<=0xffffff*8*1000/SYSCLK 計算。SYSCLK 單
位爲 Hz,nms 的單位爲 ms。如果時鐘爲 72M,那麼 nms 的最大值爲 1864ms。超過這個值,建
議通過多次調用 delay_ms 實現,否則就會導致延時不準確
usart.c裏面包含了2個函數一個是void USART1_IRQHandler(void);另外一個是void uart_init(u32
bound);裏面還有一段對串口 printf 的支持代碼,如果去掉,則會導致 printf 無法使用,雖然軟
件編譯不會報錯,但是硬件上 STM32 是無法啓動的,這段代碼不要去修改
分頻因子要確保 ADC1 的時鐘(ADCCLK)不要超過 14Mhz。 這個我們設置分頻因子位 6,時鐘爲 72/6=12MHz,庫函數的實現方法是:RCC_ADCCLKConfig(RCC_PCLK2_Div6);