A. stm32 匯編文件如何引用外部結構體
#define USART1 ((USART_TypeDef *) USART1_BASE)
即#define USART1 ((USART_TypeDef *) 0x4001 3800)
就句話的意思是,0X4001 3800是一個指向USART_TypeDef結構體的指針,現在給這指針取了一個名字USART1。
至於這個0x4001 3800是怎麼來的,請看RM0008 Reference manual 文檔51 頁 TABLE3的第7行。
B. stm32cubemx怎麼使用
STM32Cube 是一個全面的軟體平台,包括了ST產品的每個系列。平台包括了STM32Cube 硬體抽象層(一個STM32抽象層嵌入式軟體,確保在STM32系列最大化的便攜性)和一套的中間件組件(RTOS, USB, FatFs, TCP/IP, Graphics, 等等).
直觀的STM32微控制器的選擇和時鍾樹配置
微控制器圖形化配置外圍設備和中間件的功能模式和初始化參數
C代碼生成項目覆蓋STM32微控制器的初始化符合IAR™,Keil的™和GCC編譯器。
對於新的產品設計,我們強烈推薦使用STM32Cube來加速你的開發過程,並為以後的產品平台移植打下良好的基礎。
1.新建工程
打開STM32cubeMX軟體,點擊New Project。選擇對應開板MCU(STM32F103ZET6)。
選擇工程後進入工程界面,如下圖所示。
2. 配置外設。
RCC設置,選擇HSE(外部高速時鍾)為Crystal/Ceramic Resonator(晶振/陶瓷諧振器)
GPIO口功能選擇,PF6,PF7,PF8,PF9為LED1-LED4.找到對應管腳設置為GPIO_Output模式。(黃色引腳為該功能的GPIO已被用作其他功能,可以忽略。綠色表示管腳已使用)
3. 時鍾配置
時鍾配置採用圖形配置,直觀簡單。各個外設時鍾一目瞭然。STM32最高時鍾為72M,此處只有在HCLK處輸入72,軟體即可自動配置。(RCC選擇外部高速時鍾)。
4.功能外設配置
在配置框我們可以看到有幾個區域,分別對應的功能設置如下
Multimedia(多媒體):音頻視頻、LCD
Control(控制):定時器
Analog(模擬):DAC、ADC
Connectivity(通訊連接):串口、SPI 、I2C、USB、ETH
SYStem(系統):DMA(直接存儲器存取)、GPIO、NVIC、RCC、看門狗
middlewares(中間件): FreeRTOS、FATFS、LwIP、USB
此工程中DMA沒用的不用配置,NVIC(嵌套中斷向量控制器(Nested Vectored Interrupt Controller))配置中斷優先順序。RCC不用配置。
GPIO Pin Level (管腳狀態):低電平
GPIO mode (管腳模式 ):推挽輸出
Maximum output speed (最大輸出速度):低速
User Label (用戶標簽):LED1
更改用戶標簽,管腳配置圖會顯示管腳的標簽。
4. 功耗計算
這個根據配置的外設計算功耗,不用理會。
5. 生成工程報告
點擊Project –>Generate Reports或者點擊快捷圖標生成報告。系統會提示先創建一個工程項目。點擊Yes設置工程。
輸入工程名,選擇工程路徑(注意不要出現中文,否則可能出錯)。工具鏈/IDE選擇MDK-ARM V5。最後面可以設置堆棧大小,此處默認不作修改。
在Code Generator中找到Generated files框,勾選Generated periphera initialization as a pair of '.c/.h' files per IP。外設初始化為獨立的C文件和頭文件。
點擊生成報告,工程目錄下會生成txt文件和pdf文件,裡面記錄了我們剛才的設置。
6. 生成工程代碼
點擊Project –>Generate Code或者點擊快捷圖標生成工程代碼。
點擊Open Project打開工程。到此就配置好工程外設初始化。
點擊Build按鈕,Build Optput信息框會輸出沒有錯誤沒有警告。
6. 添加應用程序
在gpio.c文件中可以看到LED管腳的初始化函數。
在stm32f1xx_hal_gpio.h頭文件中可以看到GPIO的操作函數。
在main函數中的while循環中添加LED流水燈效果的應用程序。
重新編譯程序,點擊下載到Open103Z-C開發板。如果提示錯誤,可以點擊圖標對Option for Target 的Dubug選項進行修改。(圖上選的是ST-LINK)
點擊Settings->Flash Download勾選 Reset and Run選項。這樣程序下載後自動啟動運行,不用再按一下復位或者重新上電才能運行。
程序下載到Open103Z-C開發板。可以看到LED1~LED4依次被點亮,實現流水燈的效果。
總結:STM32Cube提供了固件庫,用戶可直接調用固件庫函數來開發,並且可以很好的實現STM32-MCU全系列的代碼一致性。同時STM32CubeMX工具提供的可視化引腳、外設、時鍾等配置功能,可以幫助快速完成工程的建立、初始化。大大降低了開發者的工作量。
C. 如何通過JLINK燒寫文件到百為STM32開發板外部的NOR FLASH
我們平時的程序都是燒寫到STM32的內部FLASH里的,所以可以通過串口或JLINK直接下載就可以了。
而ST官方DEMO的資源文件,和uclinux的image文件都是燒寫到外部NOR FLASH的,
除了可以用DFU方式下載.dfu文件之外,還可以用JLINK燒寫.bin文件和.hex等文件,而且JLINK燒寫NOR的速度比DFU快很多。
這里我們來介紹一下,是怎麼通過JLINK燒寫字型檔到NOR FLASH里的:
1、首先打開SEGGER-> JLink ARM Vx.xx -> J-Flash ARM
2、然後點File -> open project,
在彈出的選擇框中選擇工程文件:C:\Program Files\SEGGER\JLinkARM_V424\Samples\JFlash\ProjectFiles\STM32F103ZE_ST_MB672_CFI_1x16.jflash
3、然後點File -> open data file 打開要燒寫的文件,這里以字型檔HZK16.bin為例
4、然後會彈出一個地址設置框,這里我們填寫NOR FLASH的起始地址64000000
5、設置好上面的步驟後,下面點Target -> connect連接設備
連接成功後,在下面的LOG框中看到Connected successfully的信息
6、最後就可以點Target -> program & valify燒寫了
等待燒寫完成,文件就成功燒寫到外部NOR FLASH了
如果要燒寫多個文件,步驟3、完成後,接著加一個步驟File -> Merge data file。後面步驟一樣。
如果我們燒寫的兩個文件,會擦除FLASH的同一個塊,那就要用Merge data file,不然後面燒的就會把前面燒的擦除了。
D. stm32f4 如何往外部存儲sram寫數據
STM32控制器晶元內部有一定大小的SRAM及FLASH作為內存和程序存儲空間,但當程序較大,內存和程序空間不足時,就需要在STM32晶元的外部擴展存儲器了。STM32F4系列晶元可以擴展外部SRAM用作內存。
__TM32晶元擴展內存與給PC擴展內存的原理是一樣的,只是PC上一般以內存條的形式擴展,而且內存條實質是由多個內存顆粒(即SDRAM晶元)組成的通用標准模塊,而STM32擴展時,直接與SRAM晶元連接。
_蔡婊媧⑵? SRAM的存儲單元以鎖存器來存儲數據。這種電路結構不需要定時刷新充電,就能保持狀態(當然,如果斷電了,數據還是會丟失的),所以這種存儲器被稱為「靜態(Static)」RAM。
_栽謔導視τ貿『現校_RAM 一般只用於 CPU 內部的高速緩存(Cache),而外部擴展的內存一般使用 DRAM。
E. 在STM32F4中,處理器和外部設備的數據傳輸方式有哪些
CPU與外設之間數據傳送都是通過內存實現的。
外圍設備和內存之間的常用數據傳送控制方式有四種
(1)程序直接控制方式:就是由用戶進程直接控制內存或CPU和外圍設備之間的信息傳送。這種方式控制者都是用戶進程。
(2)中斷控制方式:被用來控制外圍設備和內存與CPU之間的數據傳送。這種方式要求CPU與設備(或控制器)之間有相應的中斷請求線,而且在設備控制器的控制狀態寄存器的相應的中斷允許位。
(3)DMA方式:又稱直接存取方式。其基本思想是在外圍設備和內存之間開辟直接的數據交換通道。
(4)通道方式:與DMA方式相類似,也是一種以內存為中心,實現設備和內存直接交換數據的控制方式。與之不同的是,在DMA方式中數據傳送方向、存放數據內存始址以及傳送的數據塊長度等都是由CPU控制,而在通道方式中這些都是由專管輸入輸出的硬體——通道來進行控制。
F. stm32怎麼從外部flash
這個沒有現存的辦法,你只能通過寫一段代碼到STM32中,再讓你的代碼實現讀取bin文件數據,通過STM32來寫入,直接使用jlink下載器之類的是不行的。
G. STM32的FSMC連接LCD的問題。
若外部設備的地址寬度是16位的,則是HADDR[25:1]與STM32的CPU引腳FSMC_A[24:0]一一對應。也就是說,內部產生的地址應該要左移一位,FSMC_A16=1,代表著第17位為1,而不是第16位為1。如果外部設備的地址寬度是8位的話,則不會出現這個問題。
再舉一個例子,如果選擇NOR的第4個存儲區,使用FSMC_A0來控制RS引腳,則訪問數據區的地址為0x60000002,訪問LCD寄存器的地址為:0x6000 0000。