STM32 MCU

STM32 FreeRTOS Introduction-1

FreeRTOS 架構 官方網站:http://www.freertos.org/FreeRTOS 是一個相對其他作業系統而言較小的作業系統。最小化的 FreeRTOS 核心僅包括 3 個 .c 文件(tasks.c、queue.c、list.c)和少數標頭檔,總共不到 9000 行程式碼,還包括了註解和空行。一個典型的編譯後 binary(二進位碼)小於 10 KB。FreeRTOS 的程式碼可以分為三個主要區塊:任務、通訊和硬體界面。 任務 (Task): FreeRTOS 的核心程式碼約有一半是用來處理多數作業系統首要關注的問題:任務,任務是擁有優先權的用戶所定義的 C 函數。task.c 和 task.h 負責所有關於建立、排程和維護任務的繁重工作。 通訊 (Communication): 任務很重要,不過任務間可以互相通訊則更為重要!它帶出了 FreeRTOS 的第二項議題:通訊。FreeRTOS 核心程式碼大約有 40% 是用來處理通訊的。queue.c 和 queue.h 負責處理 FreeRTOS 的通訊,任務和中斷(interrupt)使用佇列(佇列,queue)互相發送數據,並且使用 semaphore 和 mutex 來派發 critical section 的使用信號。 硬體界面:有近 9000 行的程式碼組成基本的 FreeRTOS,這部份是與硬體無關的(hardware-independent),同一份程式碼在不同硬體平台上的 FreeRTOS 都可以運行。大約有 6% 的 FreeRTOS 核心代碼,在與硬體無關的 […]

STM32 FreeRTOS Introduction-1 Read More »

I2C Slave mode on STM32 Introduction

前言 I2C有2種不同模式可以操作使用master 與 slave模式,大部分在操控sensor MCU都是以master模式去做操控,部分EEPROM會需要搭配MCU作為slave操作,但當slave HAL會需要已知長度才能正常work,這邊會特別介紹LL模式修正不特定長度 STM32CubeMX Setting Stm32cubeMX上的設定Master與Slave基本上沒有太大差異,唯一要注意的是slave address不能為0x00 至於為甚麼Slave address為什麼不能為0目前猜測可能為下ST I2C slave addr 是用AND GATE,來跟OAR1作比對相同就成立中斷,而設定成0X00會造成永遠不中斷 STM32CubeIDE(HAL) 這邊(HAL)slave會用到函數如下 這邊用HAL_I2C_Slave_Receive做簡單示範一般會搭配中斷做撰寫 另外針對中段部分會使用到callback(HAL_I2C_SlaveTxCpltCallback()/HAL_I2C_SlaveRxCpltCallback()) STM32CubeMX(LL) Setting 這邊因為要編輯底層所以不選用HAL在設定上有以下2個地方的不同 把I2C修改成LL編輯 把.c/.h檔案分離出來方便單獨編輯 STM32CubeIDE(LL) 首先要開啟中斷並在中斷stm32g0xx_it.c後面_it.c內找到void I2C1_IRQHandler(void)編輯中斷要執行的事情,基本上會用到的是中斷flag判讀等等範例如下 注意事項 在執行中斷程式時要注意必須把I2C中斷打開與使用前建議會讓他重新開起reset確保訊號正常,其範例如下 參考 How to create an I2C slave device using the STM32Cube Library I2C: Inter-Integrated Circuit 【STM32CUBEMX】 I2C Slave 实现 STM32 I2C multi-device connection

I2C Slave mode on STM32 Introduction Read More »

Sleep Low Power Modes For STM32L4

前言 現在MCU都會被要求有節約省電,ST針對省電版本MCU推出L系列與最新的U5系列,此章節主要會介紹各個省電模式下的操作,與Sleep mode為例子會使用到的範例程式,配合客戶目前遇到問題,提點說明要點,與注意事項。(此章節也會介紹L4系列MCU) STM32L系列核心 這邊可以看到圖表L4的核心處理器已來到Core-M4能對應的運算效能也大大增加 Low-power modes summary 這邊會以L系列中常使用的L4為主作介紹,下表為L4在各狀態下哪些部分會進入休眠哪些是可以使用的(耗電流是可以達成的但控制條件與注意事項較為嚴苛) Low-power modes transitions STM32L4 Sleep mode實作 在看完上述介紹後,對於Low pow系列有比較深入認知,這邊我們來實作Low Pow Sleep mode模式 硬體注意事項 GPIO漏電問題 焊接問題 GPIO漏電問題 GPIO端口在STM32進入低功耗模式後有電荷流動。这是由於有壓差所造成的,因此在進入低功耗模式前先把各GPIO腳位拉到與外界水位相同我們可以看以下範例來協助了解 案例1:LCD模組連接MCU在進入STOP mode後功耗整板800多uA非1.6uA(代碼是相同的) 問題分析 摘除LCD模組後功耗下降至500uA 個模組都是以GPIO來控制開關 解法:GPIO在進入STOP mode前先把腳位全部拉到HIGH(LCD電為水平相同) 焊接問題 此問題其實也與GPIO問題原理雷同,主要是焊接接觸不良也會有漏電的現象 Coding撰寫 要能達到極為省電關閉部必要的Clock來源與GPIO腳位這2點是極為重要 主程式如下 參考 STM32L高性能低功耗实战设计 实验:低功耗系统设计–基于NUCLEO-L476RG SLEEP Mode in STM32F103 || CubeIDE || Low Power Mode || Current Consumption STM32超低功耗入门之低功耗运行模式

Sleep Low Power Modes For STM32L4 Read More »

STM32Cube Tool Introduction-2

Preface  上篇章針對STM32CubeMX做完介紹後,這章節會進入程式編譯CubeIDE與燒入方式CubeProgram做深入介紹 STM32CubeIDE 網路資源主要撰寫主要以MDK與CubeIDE為大宗,這邊以CubeIDE為主軸介紹。第一步來先介紹基本介面如下圖 黃框:設定欄列表,主要最常使用到的是甲蟲符號的Debug與播放按鍵的燒入扭 紅框:為已開的專案型態 藍框:為程式編輯視窗 綠框:在程式燒入後可以去跑RAM等使用比率但非Stack/Heap Debug mode 這邊進入到Debug mode時候,可以看到分成3大區塊,最左手邊是可以看到目前程式運行到哪邊詳細確認,右邊眼鏡EXP位置可以即時去監控目前內部變數的狀況,中間程式區塊就是目前跑到的涵式區域。紅框區域是主要用在程式執行下一步或停止Debug mode,而黃色區塊跟一般程式一樣可以設定斷點 STM32CubeProgram 目前CubeProgram主要是用到是在於燒入與option byte setting,在於配置Flash等等是一個相對方便的軟體,下面可以看一下基本操作介面這邊注意一般ST給的公版都會支援ST-LINK,如果要使用SPI與I2C燒入等等就需要使用ST官方的ST-LinKV3 紅框:連接或燒入方式選定方式 黃框:燒入設定與實際燒入使用 橘框(OB):option byte setting 藍框:擦拭全部記憶體位置 中間區塊是顯示Flash位置與資料,且快按滑鼠左鍵2下可以直接修改內部數值 在燒入部分可以看到上圖,主要設定3個區塊 綠框:首先選擇要燒入的檔案,這邊可以選擇Bin檔或Hex檔 藍框:設定燒入的起始位置(一般是使用到雙Bank或切割APP才會需要設定此位置一般不特別設定) 紅框:開始燒入 下圖我們可以來看到Option Bytes設定(STM32與STM8最大不同在於Option Bytes已不會再額外生成檔案,因此再批量燒入時都會用Command line形式燒入) 上圖比較需要注意的設定是Read out Protection與User Configuration,這邊RDP一般是設定AA,設定BB可以防阻由外部程式讀取內部程式。但這邊切記如果CC是不可逆,一但切成CC燒入MCU就等同燒斷,無法在讀取與燒入其他程式。PS:這邊設定BB切回AA時,會觸發Flash資料全部擦除,因此設定BB就不用怕程式被盜取在User Configuration最常被使用到是Boot0/Boot1與IWDG設定,這邊每顆MCU在此區況設定都會有些許不同需詳細閱讀其reference manual更動Option Bytes時切記中途不要斷電(會導致系統錯誤可能會使Option Bytes錯亂無法復歸),等修改完成後在斷電重新上電,讓系統確實吃到新的設定 STM32CubeProgram Command Line 這邊ST有給予2種版本可以開啟CubeProgram,其中CLI開啟如下圖,可以在Bin的資料夾中找到指令部分可以參考ST官網UM2237文件,這邊提供一個當設定IWDG設定出錯無法在正常修改Option Bytes時的解法(以G031為例) .\STM32_Programmer_CLI.exe -c port=swd mode=UR -ob rdp=1              //RDP 設定為level1  (0xBB) .\STM32_Programmer_CLI.exe

STM32Cube Tool Introduction-2 Read More »

STM32Cube Tool Introduction-1

Preface  ST官方推出許多針對自家產品MCU的方便使用工具,在不同應用有不同的工具可以對應使用,本章節會針對STM32CudeMX做入門操作介紹。 STM32CubeMX ST在前置作業時為了方便大家能夠快速建置底層的code出了一款STM32CubeMX,CubeMX主要是用在前期MCU設置階段使用,後續編譯程式需要使用到其他軟體 由上圖有三個方框處分別是 綠框:之前所建置過的專案 黃框:初始乾淨的MCU專案(適用在自己製作板子使用) 紅框:以ST官方給的板子為基礎所建置出來的專案(EX:Nucleo board系列) 這邊可以透過上圖MCU/MPU Selector來去挑選所需要的MCU,其中Peripheral是一個很方便的塞選,可以依照所需求的腳位去塞選出對應的MCU選項(EX:ADC*3 CAN*2可以透過這個選取) Pin Setting 這邊以ST官方版子新建置Nucleo-64(STM32L433)為範例接續下去說明 上圖操作主要分成3大區塊下面就提點幾個區塊要注意的地方與簡單設置操作 綠框:主要是選擇各項功能開啟設定區域(EX:Can bus /UART/I2C等等) 黃框:主要是建置流程設定依序由左至右設置 紅框:這區域主要是看你所設定腳位圖示化區域 第一個要注意的地方是在SYS選單這邊,這邊是主要要注意試燒入設置的地方,這邊選擇Serial Wire,在最右側圖形化部分就會出現燒入時候預設的PIN腳(!!注意!!不要把腳位全部設置完畢,才發現沒預留燒入腳位要重新設計!!) 這邊綠色腳位是以使用開啟的,灰色部分則是還未使用,滑鼠可以移動到灰色區域然後左鍵,就會出現上圖選單。這邊就可以知道該腳位可以來做什麼用途(這邊建議是先使用上面所教先設置,在使用此方法更換所需要PIN腳位置)PS:這邊有一個小技巧是滑鼠壓住+ctrl壓住你綠色設置腳位,會出現黑色閃爍腳位,這就表示你可以更換的位置,直接拖移即完成更換 Clock Setting 該區域主要是在設置各線路所使用Clock的狀態,可以在方框內直接填入數字即可完成設置這邊要注意的是要依照datashhet做Clock分配,不然clock為MCU主要控制項目錯亂了會DeBug很久~沒特別就可以直接跳過 Final Setting 這邊主要是要設置下圖下拉式選單,後續要使用什麼編輯器去撰寫你的程式,因為我們主要使用ST官方給的STM32CubeIDE,我們這邊是選STM32CubeIDE,專案存取路徑與名稱設置好後,就基本設置完畢,按下右上方GENERATE CODE就可以生成專案程式了。 Other Setting 下圖是主要設置把GENERATE CODE的涵式庫單獨區分檔案出來方便你去編修(EX:I2C.h等等) 下圖區塊主要是設置涵式庫使用的層級,HAL為應用層為ST官方所提供,部分專業會想使用LL,LL主要是底層的程式方塊選用LL後最好搭配上面把.c/.h分離開來方便去撰寫 小結 本章節主要針對CubeMX做介紹適合新手閱讀,下章節會針對CubeIDE與CubeProgram作介紹 參考 STM32CubeMX STM32筆記(9):使用STM32CubeMX與Keil開發環境

STM32Cube Tool Introduction-1 Read More »

Low Power PWM(Timer) API on STM32WB

前言 隨者低功號產品越來越要求,ST就推出Low power應用的MCU與相對應腳位,其中ST MCU中的L系列就是專屬的Low power的MCU,另外部分MCU也有低功耗腳位的MCU 例如F7、H7、G0、G4與WB系列,本章節會針對LPTIM這隻腳位去做詳細解說與用法切換震盪來源 LPTIM功能 LPTIM:Low-power timer,即低功耗定時器(16bit)LPTIM與一般TIM不同處主要是在除了待機模式下全部電源模式保持運行,而且沒有內部時鐘源也能運行下圖我們也可以看到L0與G0不相同,因此不同的系列LPTIM的設置會有不同需要再確認(其中WB系列與G0系列相同) 注意:CLKMUX選擇對應的是CFGR寄存器的bit0:CKSEL,用于控制内核clock選擇由内部時鐘源(APB或LSE、LSI和HSI等任何其他內部震盪器)提供。也可以選擇由外部clock源通過 LPTIM 外部 Input提供。 LPTIM特性 內部clock:LSE、 LSI、 HSI 或 APB LPTIM輸入的外部clock(在沒有LP震盪器情況可以使用脈衝計數器)其中LPTIM具有Glicth濾波器(如下圖) LPTIM_ClockConfigTypeDef定義 Source可以選擇如下 #define LPTIM_CLOCKSOURCE_APBCLOCK_LPOSC  ((uint32_t)0x00U) #define LPTIM_CLOCKSOURCE_ULPTIM             LPTIM_CFGR_CKSEL 第一種表示LPTIM 使用內部clock(APB 或APB 或 LSE、LSI和HSI等)第二種表示LPTIM 由外部Clock通過 LPTIM 外部 Input1 提供Clock。 Timer底層配置(GPIO、Clock、中斷) HAL_LPTIM_Init就會调用HAL_LPTIM_MspInit PS:HAL_LPTIM_DeInit就會调用HAL_LPTIM_MspDeInit基本設置外還需要配置好GPIO、Clock、中斷才能完整使用,以下為配置LPTIM1使用PD13做PWM範例 小結流程 通過函数HAL_LPTIM_Init()做初始化 低功耗定時器的底層配置是通過函数HAL_LPTIM_MspInit()實現 選擇低功耗定時器支持的6種工作模式 PWM模式:使用HAL_LPTIM_PWM_Start()或 HAL_LPTIM_PWM_Start_IT() 單脈衝模式:在此模式下,當滿足條件時,輸出出可以切換高低電壓,使用HAL_LPTIM_SetOnce_Start()或 HAL_LPTIM_SetOnce_Start_IT() Encoder模式:HAL_LPTIM_Encoder_Start()或HAL_LPTIM_Encoder_Start_IT()!!注意非每個LPTIM都支持此模式!! 超時模式:HAL_LPTIM_TimeOut_Start()或 HAL_LPTIM_TimeOut_Start_IT() 計數模式:HAL_LPTIM_Counter_Start()或  HAL_LPTIM_Counter_Start_IT() 停止任何模式:用户可以通過调用相應的API來停止任何模式: HAL_LPTIM_Xxx_Stop

Low Power PWM(Timer) API on STM32WB Read More »

Inter-Integrated Circuit(I2C)

大綱 以下文章主要以I2C master為出發,如果是要尋找I2C slave 可點擊右邊文章 I2C的物理層 I2C傳輸數據線=> SDA數據線:時鐘 Ref:《IIC原理超詳細講解—值得一看》 Ps:的理論理想傳輸距離為通信,用於由於乾擾和傳輸速度的提高,實際上的IC只有15M遠,一般適合板極器件,不適合中長距離的通信本題STM32與硬體須注意事項 I2C數據傳輸 IIC的每一天偵查數據由9bit組成如果是發送數據 8bit data+1bit ACK如果是設備地址數據則8bit包含7bit設備地址+1bit方向 數據是由為一組而傳輸的,因此需要額外發送8位傳感器或應用程序體去設置接收設置PS:因傳輸訊號為先傳輸數據為雙線結構,所以傳輸數據發送端:地址(8bit)+數據(8bit) STM32CubeMX I2C設定 Ref:【STM32】HAL庫STM32CubeMX教程十二—IIC(讀取AT24C02) PS:共用Clock是需要盡可能避免的,因為會出現時序互相干擾現象,如需在使用時必須排好時間流程序 最後是轉出STM32cubeIDE可編輯的程式碼 I2C 程式撰寫 Ref:使用I2C STM32F0 HAL庫編程計算 另外也有以下4種Function可以使用 I2C傳輸失敗 針對第2點可以使用以下程式去解

Inter-Integrated Circuit(I2C) Read More »

Controller Area Network(CAN BUS) ON STM32

前言 控制器區域網路 (Controller Area Network,簡稱CAN或者CAN bus) 是一種功能豐富的車用匯流排標準。被設計用於在不需要主機(Host)的情況下,允許網路上的單晶片和儀器相互通信。 它基於訊息傳遞協定,設計之初在車輛上採用復用通信線纜,以降低銅線使用量,後來也被其他行業所使用。在碩士班論文底下有使用dsPIC30F4011(Microchip)晶片來實作CAN bus系統,如今因客戶需求開始研究起STM32 Can Bus的操作這邊會介紹接線與Can Bus範例程式等等操作 Can Bus接線 CAN 物理層的形式主要有兩種,左圖中的 CAN 通訊網路是一種遵循 ISO11898 標準的高速、短距離「閉環網路」,它的匯流排最大長度為 40m,通訊速度最高為 1Mbps,匯流排的兩端各要求有一個「120 歐」的電阻。 右圖中的是遵循 ISO11519-2 標準的低速、遠距離「開環網路」,它的最大傳輸距離為 1km,最高通訊速率為 125kbps,兩根匯流排是獨立的、不形成閉環,要求每根匯流排上各串聯有一個「2.2千歐」的電阻。 PS:這邊硬體接線請注意必加電阻與CAN transceiver ,千萬不要傻傻的MCU的Can腳位直接接出來!!!! MESSAGE TRANSFER(CAN通訊的資料格式) CAN2.0有兩種版本,CAN2.0A(Standard),CAN2.0B(Extended)。 Start of Frame(SOF):送出1位元dominant(0),用來同步。 Arbitration Field:表示節點的優先權,用來判別優先權。若多個節點同時傳送,在仲裁欄位逐一比對優先權, 位元為dominant(0)可優先傳送。長度有兩種11bits(Standard identifier)和29bits(Extended Identifier)。 RTR :為優先判斷與資料接收與否的識別 RTR=dominant(0),表資料要傳出,RTR=recessive(1),表要接收資料。 IDE: 標準格式(Standard identifier)為dominant(0);延伸格式(Extended Identifier)為 recessive(1)。 R0:保留 CAN Bus上的傳輸圖解 可以看到下圖分別有3個傳輸裝置分別是A、B、C會把資料同時放到Bus線路上這邊只要留意每個裝置傳輸時候給予微小delay時間即可避免資料傳輸重疊衝突 STM32cubeMX設置與範例程式 怎麼設定波特率呢?

Controller Area Network(CAN BUS) ON STM32 Read More »

ADC introduction on STM32

前言 ADC簡單說就是類比訊號轉出城數位訊號,下面有幾個基本名詞介紹 解析度:讀出的資料的長度,如8位就是最大值為255的意思,即範圍[0,255],12位就是最大值為4096,即範圍[0,4096] 通道:ADC輸入引腳,通常一個ADC控制器控制多個通道,如果需要多通道的話,就得進行每個通道掃描了 ADC的轉換方式 單次轉換,一次只轉換一個通道 連續轉換,轉換完成一個通道後立即自動執行下一個通道的轉換 掃描模式,開啟一次後,自動的連續讀取多個通道 ADC的三種工作方式 阻塞模式(查詢模式) 中斷模式 DMA模式 PS:這邊有幾點要注意ADC晶片通常有正參考電壓和負參考電壓,通常正參考電壓連線到VCC,負參考電壓連線到GND cubemx基礎配置 PS:Single-ended和Differentialt差異在於比較准位的不同 範例程式 基本上ADC的使用並不困難比照範例即可實現參考詳細篇友介紹其他高階用法,歡迎參考。一般類比的產品在控制上已經比較少見,主要在LED上可能比較常使用 參考 STM32CubeMX学习笔记(8)——ADC接口使用 STM32 ADC詳細篇(基於HAL庫)

ADC introduction on STM32 Read More »

Flash Operating on STM32 And HardFault Check

前言 近期客戶開始研究STM32G031 Flash讀寫,因客戶在寫入Flash使用官網給的Sample code然後再加入Timer 中斷後會持續跑入HardFault_Handler(),我開始研究Flash狀態與HardFault_Handler檢查程序 HardFault_Handler檢查程序 首先這邊和網路上不同使用的是STM32cudeIDE非MDK,因此網站上所建立的偵錯方法可能不完全適用。這邊先介紹會進入HardFault原因 記憶體溢位或則訪問越界。 堆疊溢位。 檢查方法 使用STM32內建檢查 單步執行尋找 使用內建檢查如下圖可以直接初步檢查問題所在,結果如下方所顯示 第二種方法是使用單步執行或設定斷點(最原始方法) Flash Operating Flash Write HAL_FLASH_Unlock() 檢查FLASH_SR 中的 BSY 位 FLASH_CR 寄存器中的 PG 位置 1 寫入 HAL_FLASH_Lock(); 官方的宣告涵式 下方是官方給的sample code Flash Read 演示結果 這邊使用STM32CubeProgrammer 去看內部Flash的數值可以看到全部寫入了12345678 注意事項 由上面演示結果來看Flash可以在指定位置寫入你要的數值,但這邊要注意可以看一下,下面圖程式執行前後內部Flash結果可以看到在一開始程式執行時候就有固定區域存有資料,因此如果把固定區域覆寫其他資料就會造成執行錯誤進入HardFault_Handler(下圖程式裡面加入Timer中斷程式因此紀錄的原始位置比起純粹的寫入還要多)這邊請參考stm32g0 reference manual P70 來把起始寫入位置做改動才能正常運行如果要單純在指定位置寫入資料請參考STM32GO中Flash充当EEPROM的操作 參考 怎么查找STM32的硬件错误HardFault_Handler? 手把手教你查詢stm32 HardFault_Handler除錯及問題方法 STM32GO中Flash充当EEPROM的操作 FLASH Programming in STM32 STM32 Flash

Flash Operating on STM32 And HardFault Check Read More »

Shopping Cart