摘要:總線掛載的外設有等。外設地址映射片上外設區分為三條總線,根據外設速度的不同,不同總線掛載著不同的外設,掛載低速外設,和掛載高速外設。
STM32-F1系列(如圖2-1):
基礎型,主頻為72M(內核為cortex-M3),CPU位數=32。
我們所用的芯片是STM32F103vet6
STM32表示產品的類型,以STM32F103VET6為例
F表示通用系列的子系列
103代表增強型系列
V代表的引腳數100引腳
E代表內嵌flash數6代表32K字節Flash,8代表64K字節Flash,B代表128K字節Flash,C代表256K字節Flash,D代表384K字節Flash,E代表512K字節Flash。
T代表封裝其中H代表BGA封裝,T代表LQFP封裝,U代表VFQFPN封裝。
6這一項代表工作溫度范圍,其中6代表-40——85℃,7代表-40——105℃。
圖2-1
APB1總線掛載的外設有:DAC、PWR、BKP、bxCAN、USB、I2C2、I2C1、UART5、UART4、USART3、USART2、SPI3/I2S、SPI2/I2S、IWDG、WWDG、RTC、TIM7、TIM6、TIM5、TIM4、TIM3、TIM2等。
APB2總線掛載的外設有:ADC1、ADC2、ADC3、USART1、SPI1、TIM1、TIM8、GPIOA、GPIOB、GPIOC、GPIOD、GPIOE、GPIOF、GPIOG、EXT、IAFIO等。
APB1:
DAC:數模轉化
PWR:電源功耗控制
BKP:備份數據
BxCAN:CAN總線是一種通信方式。STM32主要負責程序的運行,而CAN總線只是一種通信協議。STM32之間的通信可以通過CAN總線進行數據交換
USB 虛擬接口
I2C 串行通信協議,i2c接口
UART 調試串口
USART通用同步/異步接收器
SPI串行外設接口
IWDG獨立看門狗
WWDG 窗口看門狗
RTC實時時鐘
TIM 定時器
APB2:
ADC模數轉換
GPIO(abcdef)
EXT 外部中斷事件控制器
存儲器映射是指把芯片中或芯片外的FLASH,RAM,外設,BOOTBLOCK等進行統一編址。即用地址來表示對象。這個地址絕大多數是由廠家規定好的,用戶只能用而不能改。用戶只能在掛外部RAM或FLASH的情況下可進行自定義。
圖2-2
存儲器Block0內部區域功能劃分
①選項字節:用于配置讀寫保護、BOR級別、軟件/硬件看門狗以及器件處于待機或停止模式下的復位。當芯片不小心被鎖住之后,我們可以從RAM 里面啟動來修改這部分相應的寄存器位。地址范圍為:0x1FFF F800 - 0x1FFF F80F。
②系統存儲器:里面存的是ST出廠時燒寫好的isp自舉程序(即Bootloader),用戶無法改動。串口下載的時候需要用到這部分程序。地址范圍為:0x1FFF F000- 0x1FFF F7FF。
③FLASH:我們的程序就放在這里。地址范圍為:0x0800 0000 ~ 0x0807 FFFF (512KB)。
④取決于BOOT引腳,為FLASH、系統存儲器、SRAM的別名。地址范圍為:0x0000 0000 ~ 0x0007 FFFF。
⑤其他為預留。
儲存器Block1內部區域功能劃分
Block1用于設計片內的SRAM。我們使用的STM32F103VET6芯片的 SRAM是64KB,Block1內部區域的功能劃分SRAM(64KB)地址范圍為:0x2000 0000 ~0x2000 FFFF,其他預留。
內部 SRAM 區的大小是 512MB,用于讓芯片制造商連接片上的SRAM,這個區通過系統總線來訪問。在這個區的下部,有一個1MB的區間,被稱為“位帶區”。該位帶區還有一個對應的、32MB的“位帶別名(alias)區”,容納了8M個“位變量”(對比8051的只有128個位變量)。位帶區對應的是最低的1MB地址范圍,而位帶別名區里面的每個字對應位帶區的一個比特。位帶操作只適用于數據訪問,不適用于取指。通過位帶的功能,可以把多個布爾型數據打包在單一的字中,卻依然可以從位帶別名區中,像訪問普通內存一樣地使用它們。
儲存器Block2內部區域功能劃分:
Block2用于設計片內的外設,根據外設的總線速度不同,Block被分成了 APB(APB1和APB2)和AHB兩部分,Block2內部區域功能劃分:
①APB1總線外設,地址范圍為:0x4000 0000 ~ 0x4000 77FF;
②APB2總線外設,地址范圍為:0x4001 0000 ~ 0x4001 3FFF;
③AHB總線外設,地址范圍為:0x4001 8000 ~ 0x5003 FFFF;
存儲器Block2是片上外設區域,它們以四個字節為一個單元,共32bit,每一個單元對應不同的功能,當我們控制這些單元時就可以驅動外設工作。
如果直接驅動地址的話會非常麻煩并且不具有通用性。
比如GPIOB端口的輸出數據寄存器ODR的地址是0x4001 0C0C,寄存器是32bit,低16bit有效,對應著16個外部 IO,寫0/1對應的的IO則輸出低/高電平。
片上外設區分為三條總線,根據外設速度的不同,不同總線掛載著不同的外設,APB1掛載低速外設,APB2和AHB掛載高速外設。
圖2-3
圖2-4
圖2-5
圖2-6
圖2-7
寄存器地址 = 基地址 + 偏移地址
GPIOB_CRL = 0x4001 0C 00UL
GPIOB_CRH = 0x4001 0C 04UL
GPIOB_IDR = 0x4001 0C 08UL
GPIOB_ODR = 0x4001 0C 0CUL
GPIOB_BSRR = 0x4001 0C 10UL
GPIOB_BRR = 0x4001 0C 14UL
GPIOB_LCKR = 0x4001 0C 18UL
由此推出
GPIOA_CRL =0x4001 08 00UL
GPIOC_CRL =0x4001 10 00UL
…
c語言最小類型:字節類型,位bit,32bit=4字節
連續存儲節省空間
定義的結構體和寄存器大小一一對應,將基地址與結構體綁定,操作結構體相當于操作寄存器
結構體指針用‘->’賦值,普通變量用‘.’賦值,在程序中多用指針尋址,需認真學習
HES外部高速時鐘,HSI內部高速時鐘
圖2-8
圖2-9
圖2-10
圖2-11
圖2-12
圖2-13 配置內部時鐘
圖2-14
點擊右上角:GENERATE CODE生成項目文件
源碼(點亮LED燈,LED1閃爍):
//主程序部分 /* USER CODE BEGIN WHILE */ while (1) { Scan_keys(); /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ HAL_GPIO_WritePin(GPIOD,GPIO_PIN_4,GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOD,GPIO_PIN_5,GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOD,GPIO_PIN_6,GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOD,GPIO_PIN_3,GPIO_PIN_SET); HAL_Delay(500); HAL_GPIO_WritePin(GPIOD,GPIO_PIN_3,GPIO_PIN_RESET); HAL_Delay(500); } /* USER CODE END 3 */ 注:需要注意代碼規范,將代碼寫在/* USER CODE BEGIN 1 */ /* USER CODE END1 */ 里,否則更改CubeMX時注釋塊之外的內容會被刪除
代碼釋義:
兩個GPIO輸出的HAL庫函數
1、GPIO電平輸出HAL庫函數
void HAL_GPIO_WritePin(GPIO_TypeDefGPIOx,unit16_tGPIO_Pin,GPIO_PinState PinState);
三個參數:
GPIOx:目標引腳端口號
GPIO_pin:目標引腳引腳號
PinState:高電平—GPIO_PIN_SET;
低電平—GPIO_PIN_RESET;
2、GPIO電平翻轉HAL庫函數
void HAL_GPIO_TogglePin(GPIO_TypeDefGPIOx,unit16_tGPIO_Pin);
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/121239.html
32單片機固件庫入門(當我們新建工程時…的各種配置和目錄結構)–學習筆記 一,關于keil5內部的一系列配置 由于下述代碼的存在 每次如果想要包含stm32f10x_conf.h 只需要包含#include stm32f10x.h語句,同時包含下述宏定義 #ifdef USE_STDPERIPH_DRIVER #include stm32f10x_conf.h#endif 該宏定義可以在IDE中...
摘要:嚴格地說,應該是模仿實驗。為什么覺得無從下手,看資料沒有頭緒經驗總結看資料需要計劃耐心和速度這里所謂的資料包括書籍文檔。建議有報銷條件的同學自己設計一塊板子學習。無法報銷的同學,可以選購一款開發板學習。 STM32系列基于專為要求高性能、低成本、低功耗的嵌入式應用專門設計的ARMCortex...
摘要:我首先百度簡單了解了架構和架構的區別,以我個人的理解是架構代表之前的復雜指令集,而架構代表著精簡指令集。而我這次的學習的重點并不是圍繞著指令集,而是基于架構的開發板的應用上。以上就是我本次學習架構的筆記和心路歷程。 作為新手第一次接觸RISC-V架構時。我首先百度簡單了解了ARM架構和RIS...
摘要:處理器擁有的寄存器組。主堆棧指針復位后缺省使用的堆棧指針,用于操作系統內核以及異常處理例程包括中斷服務例程。進程堆棧指針由用戶的應用程序代碼使用。堆棧指針的最低兩位永遠是,這意味著堆棧總是字節對齊的。 ...
閱讀 1887·2021-09-27 13:35
閱讀 3433·2019-08-30 14:16
閱讀 2489·2019-08-30 10:52
閱讀 869·2019-08-29 16:35
閱讀 1422·2019-08-29 15:22
閱讀 3648·2019-08-23 18:21
閱讀 3139·2019-08-23 18:00
閱讀 3127·2019-08-23 16:50