總網頁瀏覽量

2020年5月4日 星期一

STM32 UART串列通訊程式設計(一)

STM32  Uart串列通訊使用的技術主要有三種:

1.  POLL            :使用HAL提供的函式:HAL_UART_Transmit
                                                                       HAL_UART_Receive
2.  INTERRUPT:使用HAL提供的函式:HAL_UART_Transmit_IT
                                                                       HAL_UART_Receive_IT
3.  DMA             :使用HAL提供的函式:HAL_UART_Transmit_DMA
                                                                       HAL_UART_Receive_DMA

1. POLL
    一般是用所謂的blocking mode(阻斷模式),就是傳送/接收data時不被中斷,一直到傳送/接收完成為止,因此,如果只是使用UART沒有做其它的事,可用這種方式,但是如果還有其它的事要做,可能會受影響。
基本上,用POLL方式有幾個地方要注意。POLL使用HAL提供的函式形式如下,
HAL_UART_Transmit (&huart, Tx_data, sizeof (data), time);
HAL_UART_Receive(&huart, Rx_data, n, time); //接收 n bytes data
其中huart是Uart handle, Tx_data是要傳送的data buffer位址,sizeof (data)是傳輸量,Rx_data是接收buffer,time是timeout時間,timeout稱超時時間,也就是在此時間必須把data傳輸/接收完成,否則會有error或異常現象出現。因此傳大量data時,timeout要設長一點,timeout是以1ms為單位。
從上述可知,若有重要的事要做,又必須等它傳完data才能去做,在此情況下,可以改用INTERRUPT或DMA方式。

2.  INTERRUPT
    在INTERRUPT 模式,是使用所謂的non-blocking mode 模式(非阻斷模式),當傳送完成會呼叫 HAL_UART_TxCpltCallback( )函式,接收完成會呼叫HAL_UART_RxCpltCallback( )函式,使用者可在這些函式內寫上傳送/接收完成後要做的事情。

3. DMA 
    DMA也是使用non-blocking mode 模式(非阻斷模式),在DMA模式,DATA傳送/接收一半會有一個半傳輸完成的INTERRUPT被觸發產生,呼叫 HAL_UART_TxHalfCpltCallback /HAL_UART_RxHalfCpltCallback函式。
而當DATA傳送/接收完成,會呼叫 HAL_UART_TxCpltCallback / HAL_UART_RxCpltCallback 函式。
這樣的設計意義,對傳送端來說,是當後半段的DATA開始要傳輸時,便可將新的DATA寫入前半段,以加速資料的傳輸,這也是所謂的circular mode。

總結: 

1. 關於STM32的UART 串連通訊,最重要的是使用INTERRUPT模式,POLL模式一般不使用,因系統不會只單純做UART通訊,且效率不好。 

2. 在實際的應用上,往往不知要接收的資料有多長,所以使用HAL提供的函式,有點不切實際,唯一可以利用的是只接收一個CHARACTER就產生INTERRUPT的方式,再以接收的DATA來判斷是否是最後一個CHARACTER,(例如以"ENTER"做判斷標準),若不是最後字元,就照順序存入接收BUFFER,等收到"ENTER"後,就知道已完整收到DATA,可以繼續處理後續的事。 





















2020年4月23日 星期四

1 STM32 GPIO 重點整理(二)

對STM32L1系列,針對Cat.1 and Cat.2器件,它的中斷系統有45個可遮罩中斷(maskable interrupt)。有16級優先次序可設定(16 programmable priority levels),是由4個bit來設定其優先級,分佈情形如下圖:




外界中斷/事件控制器(External interrupt/event controller EXTI)

它是由24個邊緣檢知器組成(edge detectors for generating event/interrupt requests),有三種觸發模式:上升緣、下降緣、或只要上升緣下降緣任一種,可以產生24個中斷請求 (  Cat.1 和 Cat.2 器件只有23個) ,硬體架構如下圖:


GPIO當中斷源使用時,屬於外界中斷,共佔用了7個向量資源,如上表中粉紅色框框所示,標示為: EXTI0,EXTI1,EXTI2,EXTI3,EXTI4 ,EXTI9_5,EXTI15_10共7個。其中GPIO5~GPIO9共用同一個中斷,GPIO10~GPIO15共用同一個中斷,其硬體架構如下圖所示:




EXTI16~EXTI23的配置如下:    
                                               
• EXTI line 16 連接 PVD 輸出
• EXTI line 17 連接 RTC Alarm 事件
 • EXTI line 18 連接USB Device FS wakeup事件
 • EXTI line 19 連接 RTC Tamper and TimeStamp 事件
 • EXTI line 20 連接 RTC Wakeup 事件
 • EXTI line 21 連接 Comparator 1 wakeup 事件
 • EXTI line 22 連接Comparator 2 wakeup 事件
 • EXTI line 23 連接 channel acquisition 中斷

和以上外界中斷相關的暫存器(EXTI registers)如下:




由以上的MAP圖表,可知GPIO5~9GPIO10~15各共用一個中斷,可由暫存器的4BIT以決定是那一個GPIO  PORT使用該PIN用來做中斷源,以避免混淆。

                                                           中斷服務流程


EXTI 產生外部中斷事件,主程式會中斷執行,先去執行中斷服務函式,完成中斷服務函式後,再回主程式繼續執行。以EXTI15_10為例說明:

1. EXTI15_10_IRQHandler函式為外部中斷10~15號線的中斷服務函式,當外部中斷10~15號線產生外部中斷時會呼叫EXTI15_10_IRQHandler函式,中斷當前執行的程式,處理器開始執行中斷服務函式內的程式,執行完之後繼續執行中斷前的程式。

2. 因為STM32L1的硬體結構決定了外部中斷10~15號線共用一個中斷向量,因此只能擁有一 個中斷服務函式。而HAL架構使用 HAL_GPIO_EXTI_IRQHandler()函式和HAL_GPIO_EXTI_Callback()函式,讓使用者以為每個外部中斷線都擁有自己的中斷服務函式。

3. 實際上,EXTI15_10_IRQHandler函式是在stm32l1xx_it.c的程式中定義,並呼叫了HAL_GPIO_EXTI_IRQHandler(GPIO_PIN)

4. HAL_GPIO_EXTI_IRQHandler( )是在stm32l1xx_hal_gpio.c中定義。該函式判斷外部中斷是由哪一號外部中斷線產生的,並且清除中斷掛起暫存器中的對應位,然後呼叫外部中斷回撥函式HAL_GPIO_EXTI_Callback(),並將產生外部中斷的中斷線(GPIO_PIN)作為引數傳遞給外部中斷回撥函式HAL_GPIO_EXTI_Callback()

5. 而上面的所有工作都由STM32CubeMX幫我們做好了,我們只需要在main.c檔案中重定義 HAL_GPIO_EXTI_Callback()函式就行了。

6. 因為所有外部中斷都會呼叫HAL_GPIO_EXTI_Callback()函式,所以我們需要在 HAL_GPIO_EXTI_Callback()函式內部根據輸入的GPIO_PIN引數判斷是哪一號外部中斷線 產生了外部中斷,然後根據不同的外部中斷執行不同的程式碼。

7. 因此我們使用語句if(GPIO_PIN == GPIO_PIN_No)的方式判斷該外部中斷是否是由外部中斷GPIO_PIN_No號線產生的,然後執行後面程式碼。

註:中斷優先順序(不僅限於外部中斷), 可以在STM32CubeMX中的NVIC Configuration中設定。



















2020年4月2日 星期四

1 STM32 GPIO 重點整理(一)


學任何一種MCU,最重要的一課,就是要把GPIO搞清楚,以下是用STM32 L1系列所做的重點整理,其餘系列也是一樣,可以參考。
註:在圖上按左鍵可放大圖檢示

GPIO基本結構




















GPIO可以設為4種模式之一:
1.  General input
2.  General output
3.  Analog
4.  AF(Alternate function)

General input   可設為以下三種之一:
1. Input floating
2. Input pull-up
3. Input pull-down

General output  可設為以下二種之一:
1. Output open-drain with pull-up or pull-down 
2. Output push-pull with pull-up or pull-down

AF(Alternate function) 可設為以下二種之一:
1. Alternate function push-pull with pull-up or pull-down
2. Alternate function open-drain with pull-up or pull-down

有關GPIO的使用,原文有詳細說明,節錄如下:

































I/O配置為INPUT

























I/O配置為OUTPUT



























I/O PORT 配置為OUTPUT時,注意:

Open drain mode
mode下,P-MOS完全沒作用,output register "0"使 N-MOS 導通,輸出為 Low
"1"使N-MOS 關閉,I/O在高阻抗狀態(Hi-Z)

Push-pull mode
N-MOS 導通,P-MOS 就會關閉,輸出為 Low
P-MOS 導通,N-MOS 就會關閉,輸出為 High
因為 N-MOS P-MOS 的狀態都相反,所以稱為 push-pull
output register "0"使 N-MOS導通"1"使 P-MOS導通

綜上所述,要讓Output值同設定值,要將Output mode設為Push-pull mode

I/O PORT 配置AF(Alternate function)













I/O PORT 配置Analog



註:
在電源重啟後,所有的 Pin 都是 Input FloatingGPIO 切換到其他功能都是關閉的。直到 reset完成,GPIOA13-15 GPIOB3-4 才會切換到 JTAG 用於除錯。此時,
PA15: JTDI in pull-up
PA14: JTCK/SWCLK in pull-down
PA13: JTMS/SWDAT in pull-up
PB4:  NJTRST in pull-up
PB3: JTDO in floating state

UART1_TX(PA9) / UART1_RX(PA10) 來當成 UART loader,用來更新 Firmware


2019年10月30日 星期三

如何安裝KEIL STM32 MCU 開發環境

針對WINDOWS 10 作業系統,安裝步驟如下:
一、安裝 KEIL 開發程式

1.  到KEIL公司下載開發程式,網址:   http://www2.keil.com/mdk5/
     按當前最新版Download MDK v5.28。
2. 填入個人資料表格,E-MAIL要正確填入,其餘可隨便填,傳給KEIL公司。因會接
    到一封確認信,信內需連結至 一新網址。
3. 在新網頁找到DOWNLOADS項目。
4. 找到  Product Downloads ,點進去。
5. 再填寫一張個人資料表傳送後,會出現下載的檔案MDK528A.EXE (818,557K) 。
6. 下載完成後就可安裝KEIL程式。安裝時可一直按OK,在問是否安裝ULINK時可按
   不安裝。(若要安裝也可,若你是要用ULINK)。

二、安裝ST-LINK  驅動程式

1. 到ST公司網站的頁面,https://www.st.com/content/st_com/en.html 在Search處填
    入STLINK字搜尋。
2. 在tools &software列出的各種stlink硬體型號,選符合自己產品的型號下載。(例如
    是使用STLINK-V3SET這款產品,在part number 那一欄就選擇STLINK-V3SET
    點進去後在新網頁選擇STSW-LINK009下載,會進入一個新網頁。
3. 在get software 處需接受licence,並填寫一張表格傳給公司,公司會傳一個有連結
    位置的email給你,收信後就可連結下載了, 下載後照指示很容易安裝。

三、安裝J-Link/J-Trace 驅動程式

1. 到安裝KEIL的路徑:C:\Keil_v5\ARM\Segger\USBDriver  ,選擇InstDrivers安裝
    程式,開始安裝,安裝完成後,將Jlink 線的USB接頭插入電腦,打開電腦管理
    頁面,可看到在【連接埠 (COM 和 LPT)】底下出現【JLink CDC UART Port
    (COMx)】,表示安裝完成。






     

2019年6月13日 星期四

如何在Orcad繪圖中建立新零件,可參考下列文章:
http://yufan-fansbook.blogspot.com/2014/09/orcad-orcad-creat-new-part-in-orcad.html

2017年11月16日 星期四

光電編碼器(一)


光電編碼器(一)


一、什麼叫光電編碼器

光電編碼器是通過讀取光電編碼盤上的圖案或編碼資訊來表示與光電編碼器相連的電機轉子的位置資訊。實際上,它是將所測得的角位移轉換為脈沖形式的數位訊號輸出。根據光電編碼器的工作原理可以將光電編碼器分為絕對式光電編碼器與增量式光電編碼器,下面介紹增量式光電編碼器絕對式光電編碼器的結構與工作原理。

二、增量式光電編碼器

1. 增量式光電編碼器的結構與工作原理

增量式光電編碼器是一個碼盤上只開出三條碼道,由內向外分別為ABC,如圖1(a)所示。在AB碼道的碼盤上 ,等距離地開有透光的縫隙,二條碼道上相鄰的縫隙互相錯開半個縫寬,其展開圖如圖1(b)所示,第三條碼道C只開出一個縫隙,用來表示碼盤的零位。在碼盤的二側分別安裝光源和光敏元件,當碼盤轉動時,光源經過透光和不透光區域,相應地,每條碼道將有一系列脈沖從光敏元件輸出,碼道上有多少個縫隙就會有多少個脈沖輸出,將這些脈沖整形後,輸出的脈沖信號如圖1(c )所示


      圖增量式編碼原理圖

2. 編碼盤方向的辨別

編碼盤旋轉方向的辨別可以採用圖2所示的電路實現,以下說明圖2所示電路的辨向原理。

          
         2   增量編碼器辨向電路和輸出波形

經過放大後整形後的AB二相脈沖分別輸入到D觸發器的D端和CP端,如圖2(a)所示,因此D觸發器的CP端在A脈沖的上升緣觸發。由於A B脈沖相位相差90° 當正轉時,B脈沖超前A脈沖90°,觸發器總是在B脈沖處於高電平觸發,如圖2(b)所示。這時Q=1表示正轉,當反轉時,A脈沖超前B脈沖90°,觸發器總是在B處於低電平時觸發,這時Q=0表示反轉。
AB脈沖的另一路徑經AND gate之後,輸出計數脈沖。這樣,用Q-Q控制可逆計數器是加計數還是減計數,就可以使計數器對計數脈沖進行計數。
C相脈沖接到計數器的復位端(RESET),實現每轉一圈復位一次計數器。這樣無論是正轉還是反轉,計數值每次反應的都是相對於上次角度的增量,形成增量編碼。

          
       圖3  增量式編碼器結構


      
            圖4  增量式編碼器結構


產品實體圖


























2017年3月4日 星期六

如何在windows 10使用微軟的超級終端機

微軟的Windows 10沒有超級終端機,用下列方法就可以使用:

1. 從已安裝Windows XP作業系統的電腦,複制檔案
【C:\Program Files\Windows NT\hypertrm.exe】到windows 10的 任何資料夾。
2. 複制Windows XP的檔案【C:\Windows\System32\hypertrm.dll】到windows 10的
【C:\Windows\syswow64\】資料夾。
3. 執行hypertrm.exe,就可以在Windows 10中使用HyperTerminal了。

OnLine

counter