主頁 >  其他 > 串口通信小試牛刀

串口通信小試牛刀

2021-10-26 10:40:58 其他

串口通信小試牛刀

嵌入式系統第6周作業2(暨第7周實驗)
一. 了解串口協議和RS-232標準,以及RS232電平與TTL電平的區別;了解"USB/TTL轉232"模塊(以CH340芯片模塊為例)的作業原理, 二. 安裝 stm32CubeMX,配合Keil,分別嘗試使用暫存器地址方式(匯編或C,不限) 和HAL庫這兩種方式,完成下列任務: 1、重做上一個LED流水燈作業,即用GPIO埠完成3只LED紅綠燈的周期閃爍, 2、完成一個STM32的USART串口通訊程式(查詢方式即可,暫不要求采用中斷方式),要求: 1)設定波特率為115200,1位停止位,無校驗位; 2)STM32系統給上位機(win10)連續發送“hello windows!”,win10采用“串口助手”工具接收, 三. 在沒有示波器條件下,可以使用Keil的軟體仿真邏輯分析儀功能觀察管腳的時序波形,更方便動態跟蹤除錯和定位代碼故障點, 請用此功能觀察第1題中3個GPIO埠的輸出波形,和第2題中串口輸出波形,并分析時序狀態正確與否,高低電平轉換周期(LED閃爍周期)實際為多少,

目錄

  • 串口通信小試牛刀
  • 一、串口通信協議:RS-232
    • 1.串口通信協議
    • 2. RS-232
    • 3.RS232電平與TTL電平的區別
    • 4.USB/TTL轉232模塊(以CH340芯片模塊為例)的作業原理
      • 1.模塊介紹
      • 2.模塊用途
      • 3.硬體設計
  • 二、stm32CubeMX的安裝
    • 1.配置環境變數
    • 2.安裝STM32CubeMX
    • 3.初始化代碼
    • 4.修改代碼并點亮流水燈
  • 三、STM32的USART串口通訊程式
    • 1.USART介紹
    • 2.USART配置:
    • 3.匯編實作
    • 4.hel庫實作
      • 1.SRM32CubeMX
      • 2.Keil
  • 三、總結
  • 四、參考文獻


一、串口通信協議:RS-232

1.串口通信協議

串口通信指串口按位(bit)發送和接收位元組,盡管位元位元組(byte)的串行通信慢,但是串口可以在使用一根線發送資料的同時用另一根線接收資料,串口通信協議是指規定了資料包的內容,內容包含了起始位、主體資料、校驗位及停止位,雙方需要約定一致的資料包格式才能正常收發資料的有關規范,在串口通信中,常用的協議包括RS-232、RS-422和RS-485,

2. RS-232

RS-232標準介面(又稱EIA RS-232)是常用的串行通信介面標準之一,它是由美國電子工業協會(EIA)聯合貝爾系統公司、調制解調器廠家及計算機終端生產廠家于1970年共同制定,其全名是“資料終端設備( DTE)和資料通信設備(DCE)之間串行二進制資料交換介面技術標準”,1

RS-232(ANSI/EIA-232標準)是IBM-PC及其兼容機上的串行連接標準,可用于許多用途,比如連接滑鼠、列印機或者Modem,同時也可以接工業儀器儀表,用于驅動和連線的改進,實際應用中RS-232的傳輸長度或者速度常常超過標準的值,RS-232只限于PC串口和設備間點對點的通信,RS-232串口通信最遠距離是50英尺,

3.RS232電平與TTL電平的區別

  • TTL電平標準:

    • 輸出L:<0.8V;H:>2.4V,
    • 輸入L:<1.2V;H:>2.0V,
    • TTL器件輸出低電平要小于0.8V,高電平要大于2.4V,輸入,低于1.2V就認為是0,高于2.0就認為是1,于是TTL電平的輸入低電平的噪聲容限就只有(0.8-0)/2=0.4V,高電平的噪聲容限為(5-2.4)/2=1.3V,
  • RS232標準:

    • 邏輯1的電平為-3~-15V,邏輯0的電平為+3~+15V,注意電平的定義反相了一次,RS232可做到雙向傳輸,全雙工通訊,為異步資料傳輸方式,最高傳輸速率可達到20Kbps,
  • RS232電平與TTL電平的區別:

    1. 電平的上限和下限定義不一樣,CMOS具有更大的抗噪區域, 同是5伏供電的話,ttl一般是1.7V和3.5V的樣子,CMOS一般是2.2V,2.9V的樣子,不準確,僅供參考,
    2. 電流驅動能力不一樣,ttl一般提供25毫安的驅動能力,而CMOS一般在10毫安左右,
    3. 需要的電流輸入大小也不一樣,一般ttl需要2.5毫安左右,CMOS幾乎不需要電流輸入,
    4. 很多器件都是兼容TTL和CMOS的,datasheet會有說明,如果不考慮速度和性能,一般器件可以互換,但是需要注意有時候負載效應可能引起電路作業不正常,因為有些ttl電路需要下一級的輸入阻抗作為負載才能正常作業,

4.USB/TTL轉232模塊(以CH340芯片模塊為例)的作業原理

1.模塊介紹

  1. 模塊特點
    CH340C USB轉TTL模塊以CH340C芯片為核心,內部自帶晶振,最高波特率可達2Mbps,軟體兼容CH341驅動,過流保護,引出相應的通訊介面與電源介面,通訊介面帶有指示燈指示作業狀態,通訊穩定,體積小,

    • 全速USB驅動,兼容USB2.0
    • 硬體全雙工串口,內置收發緩沖區
    • 支持波特率50bps~2Mbps
    • 輸出TTL電平3.3V,兼容5V的IO電平
  2. 模塊介面引腳

Symbol(符號)Type (型別)Deion(描述)
TXD輸出串行資料輸出口
RXD輸入串行資料輸出口
GND電源接地引腳
3V3電源3.3V電源輸出引腳(最高250mA)
5V電源3.3V電源輸出引腳(最高250mA)
DTS輸出MODEM聯絡輸出信號,請求發送
DTR輸出MODEM聯絡輸出信號,資料終端就緒

輸入輸出介面引腳均帶有LED指示燈
電源介面引腳中,5V的介面引腳帶有LED指示燈

2.模塊用途

電腦USB端是USB電平,單片機的信號是TTL電平,兩者的電平不同是無法進行通訊的,需要通過轉換才能實作相互通訊,CH340C USB 轉TTL模塊就是實作USB電平與TTL電平相互轉換的模塊,

  • USB:采用VCC、GND、D+、D-傳輸,電腦上的插口就是USB介面,
  • TTL:一般指單片機的邏輯電平,不同單片的供電的系統TTL的電平不一樣,3.3V單片的TTL電平就是:高電平3.3V(邏輯1),低電平0V(邏輯0),
  1. 單片機與上位機的通訊

    在除錯單片機程式的時候,想了解程式的執行情況或相關資訊,一般簡單的做法就是用串口把資訊發送給電腦,電腦接收到再通過上位機(串口除錯助手)顯示出來,但是單片機串口發送的信號是TTL電平,電腦能接收到的信號是USB電平,兩者無法直接通訊,USB轉TTL模塊可以把串口發送的TTL信號轉換成USB信號再發送給電腦,電腦就可以接收到單片機發送過來的信號并在上位機(串口除錯助手)上顯示出來,
  2. 單片機的ISP串口程式下載

    大部分單片機都可以使用串口的方式通過相應的上位機軟體來下載程式,但是電腦的USB出來的信號是USB信號,單片機是無法識別USB信號的,需要通過USB轉TTL模塊把USB信號轉換成TTL信號才能將程式下載到單片機中,
  3. MODEMD的韌體升級

    有些MODEM可以使用串口升級韌體,在模塊中也引出了RTS,DTR兩個MODEM信號輸出介面,并帶有相應的指示燈指示狀態,

3.硬體設計

硬體電路設計主要介紹以CH340C芯片為核心,設計出一個USB轉TTL的模塊(也就是該模塊),主要包括電源的設計、功能的設計等,其中選用的器件規格型號可以參考產品手冊的BOM表,
  • CH340C芯片引腳功能表
引腳序號引腳名稱型別引腳說明
1GND電源公共接地端,直接連到USB總線的地線
3RXD輸入串行資料輸入
4V3電源在3.3V電源電源電壓時連接VCC輸入外部電源 ; 在5V電源電壓時外接容量為0.1uF退藕電容
5D+USB信號直接連接到USB總線的D+資料線
6D-USB信號直接連接到USB總線的D-資料線
7XI輸入CH340C內部自帶晶振,必須懸空
8XO輸出CH340C內部自帶晶振,必須懸空
9CTS#輸入MODEM聯絡輸入信號,清除發送,低(高)有效
10輸入輸入MODEM聯絡輸入信號,資料裝置就緒,低(高)有效
11RI#輸入MODEM聯絡輸入信號,振鈴提示,低(高)有效
12DCD#輸入MODEM聯絡輸入信號,載波檢測,低(高)有效
13DCD#輸出MODEM聯絡輸入信號,資料終端就緒,低(高)有效
14RTS#輸出MODEM聯絡輸入信號,請求發送,低(高)有效
15R232電源輔助RS232使能,高有效,內置下拉
16VCC電源正電源輸入端,需外接0.1uF電源退藕電容
  • 模塊的電源設計
    • 在CH340C的引腳功能表中紅色部分是電源相關的引腳,對于不同電壓供電系統的TTL電平是不一樣的,大部分的系統是5V或3.3V供電,一般5V的系統是兼容3.3V的TTL電平的,但是3.3V系統是不兼容5V的,為了是能兼容3.3V與5V的系統,模塊的電源使用3.3V電源供電,
    • 電腦的USB介面電源輸出時5V,最大電流是500mA,在電路中為了防止意外的誤操作,在5V的電源端加了一個0.5A,6V的保險絲F1,當電壓超過6V或電流超過0.5A保險絲就會斷開對電路進行保護,
    • USB輸出的電壓是5V,而CH340C的芯片采用3.3V供電,為了使模塊的供電為3.3V,在電路中加入了一個LDO(低壓差線性穩壓器)U2,它可以把5V穩壓成3.3V,然后對CH340C進行供電(根據手冊要求V3引腳也要接3.3V的電源),每一個電源的輸入端都會加上一個0.1uF的濾波電容,
      在模塊引出的介面中:
    • 5V:USB的電源輸出,電壓為5V,電流最大可達500mA
    • 3V3:5V經過LDO穩壓后得到的3.3V電壓,電流最大可達25mA
    • GND:USB的GND
  • 模塊的USB轉TTL電路設計

    在CH340C的引腳功能表中藍色部分是信號相關的引腳,黑色部分的與設計無關的引腳,全部懸空,CH340C芯片的D-,D+與USB的D-,D+連接到一起作為USB電平的信號連接,同時引出TTL電平信號的介面TXD與RXD,還有兩個MODEM輸出信號介面RTS與DTR,
  • 模塊的指示燈電路設計

    為了檢測模塊是否通電正常,在5V的輸入端設計了一個指示燈LED1(紅色),該等亮表示模塊已經上電,通訊時需要了解資料的收發情況,在TXD,RXD資料介面中分別接入了LED2(藍色),LED3(綠色)指示燈,當模塊到資料時,RXD的指示燈就會亮;模塊發送資料時TXD的指示燈就會亮,另外引出的RTS與DTR信號介面也設計了LED4(黃色),LED5(綠色)指示燈,
    因為TXD,RXD,RTS,DTR介面都是從CH340C芯片管腳印出來的,CH340C是3.3V供電,所以設計對應的指示燈的電源應該選擇3.3V,TXD與RXD在CH340C中空閑時(沒有發生資料傳輸)是高電平的,對應的指示燈狀態時滅的,只有發生資料傳輸時指示燈才會亮,RTS與DTR介面時CH340C的MODEM輸出信號介面,對應的指示燈在用不同的上位機軟體它們的亮滅是不確定的,

二、stm32CubeMX的安裝

1.配置環境變數

云盤下載:這里使用了這個博客提供的云盤地址
https://blog.csdn.net/Brendon_Tan/article/details/107685563
但是需要Java環境支撐,去官網 https://www.java.com/zh_CN/download/windows-64bit.jsp下載之后遇到了的問題,搜索之后發現中文版的官網只支持32位的下載,這里需要把中文版網址的zh_CN改成en,訪問英文版的官網點擊download
找到
選擇x64的版本
就可以安裝STM32CubeMX了,

2.安裝STM32CubeMX

  1. 打開 SetupSTM32CubeMX-6.0.0.exe 檔案
  2. 點擊 Next
  3. 勾選 I accpt,點擊 Next
  4. 勾選第一個,點擊 Next
  5. 可以自己修改安裝路徑,點擊 Next
  6. Yes
  7. Next

  8. Next
  9. Done
  10. 成功
    但是還需要安裝依賴包



    完成!

3.初始化代碼

  1. File-New Project
  2. 之后會在線下載一些東西
  3. 選擇型號STM32F103C8,選中之后點擊start project
  4. System Core-SYS-debug-Serial Wire
  5. System Core-RCC-High Speed Clock-Crystal/Ceramic Resonator

  1. 勾選Clock Condigiguration-PLLCLK
  2. Pinout ViewPA0,PB9,PC15設定GPIO_Output
  3. Project Manager- Project -Toolchain / IDE-MDK-ARM
  4. Project Manager- Code Generator-Generated files-勾選第一個
  5. Generator Code
  6. Open Project

4.修改代碼并點亮流水燈

  1. 打開main.c檔案,在while函式里面添加實作功能的代碼
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,GPIO_PIN_RESET);//PA0
		HAL_Delay(1000);//1s
		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,GPIO_PIN_SET);//PA0
		HAL_Delay(1000);//1s		
		HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_RESET);//PB9
		HAL_Delay(1000);//1s
		HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_SET);//PB9
		HAL_Delay(1000);//1s		
		HAL_GPIO_WritePin(GPIOC,GPIO_PIN_15,GPIO_PIN_RESET);//PC15
		HAL_Delay(1000);//1s		
		HAL_GPIO_WritePin(GPIOC,GPIO_PIN_15,GPIO_PIN_SET);//PC15
		HAL_Delay(1000);//1s
  1. 編譯,沒有錯誤
  2. 在debug里修改Diog.dll和Parameter
    debug輸出波形圖
  3. 打開McuFly,運行

三、STM32的USART串口通訊程式

1.USART介紹

  1. 百度百科:
  • (Universal Synchronous/Asynchronous Receiver/Transmitter)
  • 通用同步/異步串行接收/發送器
  • USART是一個全雙工通用同步/異步串行收發模塊,該介面是一個高度靈活的串行通信設備,
  1. 主要特點
  • 全雙工操作(相互獨立的接收資料和發送資料);
  • 同步操作時,可主機時鐘同步,也可從機時鐘同步;
  • 獨立的高精度波特率發生器,不占用定時/計數器;
  • 支持5、6、7、8和9位資料位,1或2位停止位的串行資料幀結構;
  • 由硬體支持的奇偶校驗位發生和檢驗;
  • 資料溢位檢測;
  • 幀錯誤檢測;
  • 包括錯誤起始位的檢測噪聲濾波器和數字低通濾波器;
  • 三個完全獨立的中斷,TX發送完成、TX發送資料暫存器空、RX接收完成;
  • 支持多機通信模式;
  • 支持倍速異步通信模式,
  1. 功能引腳
引腳功能
TX發送資料輸出引腳
RX接收資料輸入引腳
SW_RX資料接收引腳,只用于單線和智能卡模式,屬于內部引腳,沒有具體外部引腳,
nRTS請求以發送(Request To Send), n 表示低電平有效,如果使能 RTS 流控制,當USART 接收器準備好接收新資料時就會將 nRTS 變成低電平;當接收暫存器已滿時,nRTS 將被設定為高電平,該引腳只適用于硬體流控制,
USART接收器準備好接收新資料時就會將 nRTS 變成低電平;當接收暫存器已滿時,nRTS 將被設定為高電平,該引腳只適用于硬體流控制,
nRTS將被設定為高電平,該引腳只適用于硬體流控制,
nCTS清除以發送(Clear To Send), n 表示低電平有效,如果使能 CTS 流控制,發送器在發送下一幀資料之前會檢測 nCTS 引腳,如果為低電平,表示可以發送資料,如果為高電平則在發送完當前資料幀之后停止發送,該引腳只適用于硬體流控制,
SCLK發送器時鐘輸出引腳,這個引腳僅適用于同步模式,

2.USART配置:

  • STM32在只有一個中斷的情況下,仍然需要配置優先級,其作用是使能某條中斷的觸發通道,STM32的中斷有至多兩個層次,分別是搶占優先級(主優先級)和子優先級(從優先級),而整個優先級設定引數的長度為4位,因此需要首先劃分搶占優先級位數和子優先級位數,通過NVIC_PriorityGroupConfig()實作;
  • 特定設備的中斷優先級NVIC的屬性包含在結構體NVIC_InitTypeDef中,其中欄位NVIC_IRQChannel包含了設備的中斷向量,保存在啟動代碼中;欄位NVIC_IRQChannelPreemptionPriority為主優先級,NVIC_IRQChannelSubPriority為從優先級,取值的范圍應根據位數劃分的情況而定;最后NVIC_IRQChannelCmd欄位是是否使能,一般置為ENABLE,最后通過NVIC_Init()來使能這一中斷向量,

3.匯編實作

  1. 打開Keil-Project-new peoject

  2. 新建檔案

  3. 芯片依舊選擇STM32F103C8

  1. 新建main.s

    代碼
;RCC暫存器地址映像             
RCC_BASE            EQU    0x40021000 
RCC_CR              EQU    (RCC_BASE + 0x00) 
RCC_CFGR            EQU    (RCC_BASE + 0x04) 
RCC_CIR             EQU    (RCC_BASE + 0x08) 
RCC_APB2RSTR        EQU    (RCC_BASE + 0x0C) 
RCC_APB1RSTR        EQU    (RCC_BASE + 0x10) 
RCC_AHBENR          EQU    (RCC_BASE + 0x14) 
RCC_APB2ENR         EQU    (RCC_BASE + 0x18) 
RCC_APB1ENR         EQU    (RCC_BASE + 0x1C) 
RCC_BDCR            EQU    (RCC_BASE + 0x20) 
RCC_CSR             EQU    (RCC_BASE + 0x24) 
                              
;AFIO暫存器地址映像            
AFIO_BASE           EQU    0x40010000 
AFIO_EVCR           EQU    (AFIO_BASE + 0x00) 
AFIO_MAPR           EQU    (AFIO_BASE + 0x04) 
AFIO_EXTICR1        EQU    (AFIO_BASE + 0x08) 
AFIO_EXTICR2        EQU    (AFIO_BASE + 0x0C) 
AFIO_EXTICR3        EQU    (AFIO_BASE + 0x10) 
AFIO_EXTICR4        EQU    (AFIO_BASE + 0x14) 
                                                           
;GPIOA暫存器地址映像              
GPIOA_BASE          EQU    0x40010800 
GPIOA_CRL           EQU    (GPIOA_BASE + 0x00) 
GPIOA_CRH           EQU    (GPIOA_BASE + 0x04) 
GPIOA_IDR           EQU    (GPIOA_BASE + 0x08) 
GPIOA_ODR           EQU    (GPIOA_BASE + 0x0C) 
GPIOA_BSRR          EQU    (GPIOA_BASE + 0x10) 
GPIOA_BRR           EQU    (GPIOA_BASE + 0x14) 
GPIOA_LCKR          EQU    (GPIOA_BASE + 0x18) 
                                                       
;GPIO C口控制                   
GPIOC_BASE          EQU    0x40011000 
GPIOC_CRL           EQU    (GPIOC_BASE + 0x00) 
GPIOC_CRH           EQU    (GPIOC_BASE + 0x04) 
GPIOC_IDR           EQU    (GPIOC_BASE + 0x08) 
GPIOC_ODR           EQU    (GPIOC_BASE + 0x0C) 
GPIOC_BSRR          EQU    (GPIOC_BASE + 0x10) 
GPIOC_BRR           EQU    (GPIOC_BASE + 0x14) 
GPIOC_LCKR          EQU    (GPIOC_BASE + 0x18) 
                                                           
;串口1控制                       
USART1_BASE         EQU    0x40013800 
USART1_SR           EQU    (USART1_BASE + 0x00) 
USART1_DR           EQU    (USART1_BASE + 0x04) 
USART1_BRR          EQU    (USART1_BASE + 0x08) 
USART1_CR1          EQU    (USART1_BASE + 0x0c) 
USART1_CR2          EQU    (USART1_BASE + 0x10) 
USART1_CR3          EQU    (USART1_BASE + 0x14) 
USART1_GTPR         EQU    (USART1_BASE + 0x18) 
                            
;NVIC暫存器地址                
NVIC_BASE           EQU    0xE000E000 
NVIC_SETEN          EQU    (NVIC_BASE + 0x0010)     
;SETENA暫存器陣列的起始地址 
NVIC_IRQPRI         EQU    (NVIC_BASE + 0x0400)     
;中斷優先級暫存器陣列的起始地址 
NVIC_VECTTBL        EQU    (NVIC_BASE + 0x0D08)     
;向量表偏移暫存器的地址     
NVIC_AIRCR          EQU    (NVIC_BASE + 0x0D0C)     
;應用程式中斷及復位控制暫存器的地址                                                
SETENA0             EQU    0xE000E100 
SETENA1             EQU    0xE000E104 
                            
                              
;SysTick暫存器地址            
SysTick_BASE        EQU    0xE000E010 
SYSTICKCSR          EQU    (SysTick_BASE + 0x00) 
SYSTICKRVR          EQU    (SysTick_BASE + 0x04) 
                              
;FLASH緩沖暫存器地址映像     
FLASH_ACR           EQU    0x40022000 
                             
;SCB_BASE           EQU    (SCS_BASE + 0x0D00) 
                             
MSP_TOP             EQU    0x20005000               
;主堆疊起始值                
PSP_TOP             EQU    0x20004E00               
;行程堆疊起始值             
                            
BitAlias_BASE       EQU    0x22000000               
;位帶別名區起始地址         
Flag1               EQU    0x20000200 
b_flas              EQU    (BitAlias_BASE + (0x200*32) + (0*4))               
;位地址 
b_05s               EQU    (BitAlias_BASE + (0x200*32) + (1*4))               
;位地址 
DlyI                EQU    0x20000204 
DlyJ                EQU    0x20000208 
DlyK                EQU    0x2000020C 
SysTim              EQU    0x20000210 

;常數定義 
Bit0                EQU    0x00000001 
Bit1                EQU    0x00000002 
Bit2                EQU    0x00000004 
Bit3                EQU    0x00000008 
Bit4                EQU    0x00000010 
Bit5                EQU    0x00000020 
Bit6                EQU    0x00000040 
Bit7                EQU    0x00000080 
Bit8                EQU    0x00000100 
Bit9                EQU    0x00000200 
Bit10               EQU    0x00000400 
Bit11               EQU    0x00000800 
Bit12               EQU    0x00001000 
Bit13               EQU    0x00002000 
Bit14               EQU    0x00004000 
Bit15               EQU    0x00008000 
Bit16               EQU    0x00010000 
Bit17               EQU    0x00020000 
Bit18               EQU    0x00040000 
Bit19               EQU    0x00080000 
Bit20               EQU    0x00100000 
Bit21               EQU    0x00200000 
Bit22               EQU    0x00400000 
Bit23               EQU    0x00800000 
Bit24               EQU    0x01000000 
Bit25               EQU    0x02000000 
Bit26               EQU    0x04000000 
Bit27               EQU    0x08000000 
Bit28               EQU    0x10000000 
Bit29               EQU    0x20000000 
Bit30               EQU    0x40000000 
Bit31               EQU    0x80000000 


;向量表 
    AREA RESET, DATA, READONLY 
    DCD    MSP_TOP            ;初始化主堆疊 
    DCD    Start              ;復位向量 
    DCD    NMI_Handler        ;NMI Handler 
    DCD    HardFault_Handler  ;Hard Fault Handler 
    DCD    0                   
    DCD    0 
    DCD    0 
    DCD    0 
    DCD    0 
    DCD    0 
    DCD    0 
    DCD    0 
    DCD    0 
    DCD    0 
    DCD    0 
    DCD    SysTick_Handler    ;SysTick Handler 
    SPACE  20                 ;預留空間20位元組                 
;代碼段 
    AREA |.text|, CODE, READONLY 
    ;主程式開始 
    ENTRY                            
    ;指示程式從這里開始執行 
Start 
    ;時鐘系統設定 
    ldr    r0, =RCC_CR 
    ldr    r1, [r0] 
    orr    r1, #Bit16 
    str    r1, [r0] 
    ;開啟外部晶振使能  
    ;啟動外部8M晶振 
                                            
ClkOk           
    ldr    r1, [r0] 
    ands   r1, #Bit17 
    beq    ClkOk 
    ;等待外部晶振就緒 
    ldr    r1,[r0] 
    orr    r1,#Bit17 
    str    r1,[r0] 
    ;FLASH緩沖器 
    ldr    r0, =FLASH_ACR 
    mov    r1, #0x00000032 
    str    r1, [r0] 
           
    ;設定PLL鎖相環倍率為7,HSE輸入不分頻 
    ldr    r0, =RCC_CFGR 
    ldr    r1, [r0] 
    orr    r1, #(Bit18 :OR: Bit19 :OR: Bit20 :OR: Bit16 :OR: Bit14) 
    orr    r1, #Bit10 
    str    r1, [r0] 
    ;啟動PLL鎖相環 
    ldr    r0, =RCC_CR 
    ldr    r1, [r0] 
    orr    r1, #Bit24 
    str    r1, [r0] 
PllOk 
    ldr    r1, [r0] 
    ands   r1, #Bit25 
    beq    PllOk 
    ;選擇PLL時鐘作為系統時鐘 
    ldr    r0, =RCC_CFGR 
    ldr    r1, [r0] 
    orr    r1, #(Bit18 :OR: Bit19 :OR: Bit20 :OR: Bit16 :OR: Bit14) 
    orr    r1, #Bit10 
    orr    r1, #Bit1 
    str    r1, [r0] 
    ;其它RCC相關設定 
    ldr    r0, =RCC_APB2ENR 
    mov    r1, #(Bit14 :OR: Bit4 :OR: Bit2) 
    str    r1, [r0]      
            
    ;PA9串口0發射腳 
    ldr    r0, =GPIOA_CRH 
    ldr    r1, [r0] 
    orr    r1, #(Bit4 :OR: Bit5)          
    ;PA.9輸出模式,最大速度50MHz  
    orr    r1, #Bit7 
    and    r1, #~Bit6 
    ;10:復用功能推挽輸出模式 
    str    r1, [r0]    


    ldr    r0, =USART1_BRR   
    mov    r1, #0x271 
    str    r1, [r0] 
    ;配置波特率-> 115200 
                   
    ldr    r0, =USART1_CR1   
    mov    r1, #0x200c 
    str    r1, [r0] 
    ;USART模塊總使能 發送與接收使能 
    ;71 02 00 00   2c 20 00 00 
             
    ;AFIO 引數設定             
    ;Systick 引數設定 
    ldr    r0, =SYSTICKRVR           
    ;Systick裝初值 
    mov    r1, #9000 
    str    r1, [r0] 
    ldr    r0, =SYSTICKCSR           
    ;設定,啟動Systick 
    mov    r1, #0x03 
    str    r1, [r0] 
              
    ;切換成用戶級執行緒式模式 
    ldr    r0, =PSP_TOP                   
    ;初始化執行緒堆疊 
    msr    psp, r0 
    mov    r0, #3 
    msr    control, r0 
              
    ;初始化SRAM暫存器 
    mov    r1, #0 
    ldr    r0, =Flag1 
    str    r1, [r0] 
    ldr    r0, =DlyI 
    str    r1, [r0] 
    ldr    r0, =DlyJ 
    str    r1, [r0] 
    ldr    r0, =DlyK 
    str    r1, [r0] 
    ldr    r0, =SysTim 
    str    r1, [r0] 
               
;主回圈            
main            
    ldr    r0, =Flag1 
    ldr    r1, [r0] 
    tst    r1, #Bit1                 
    ;SysTick產生0.5s,置位bit 1 
    beq    main                  ;0.5s標志還沒有置位       
     
    ;0.5s標志已經置位 
    ldr    r0, =b_05s                
    ;位帶操作清零0.5s標志 
    mov    r1, #0 
    str    r1, [r0] 

    mov    r0, #'H' 
    bl     send_a_char
	
	mov    r0, #'e' 
    bl     send_a_char
	
	mov    r0, #'l' 
    bl     send_a_char
	
	mov    r0, #'l' 
    bl     send_a_char
	
	mov    r0, #'o' 
    bl     send_a_char
	
	mov    r0, #' ' 
    bl     send_a_char
	
	mov    r0, #'W' 
    bl     send_a_char
	
	mov    r0, #'i' 
    bl     send_a_char
	
	mov    r0, #'n' 
    bl     send_a_char
	
	mov    r0, #'d' 
    bl     send_a_char
	
	mov    r0, #'o' 
    bl     send_a_char
	
	mov    r0, #'w' 
    bl     send_a_char
	
	mov    r0, #'\n' 
    bl     send_a_char
	
	b      main
                                  
;子程式 串口1發送一個字符 
send_a_char 
    push   {r0 - r3} 
    ldr    r2, =USART1_DR   
    str    r0, [r2] 
b1 
    ldr    r2, =USART1_SR  
    ldr    r2, [r2] 
    tst    r2, #0x40 
    beq    b1 
    ;發送完成(Transmission complete)等待 
    pop    {r0 - r3} 
    bx     lr 
                                
;例外程式 
NMI_Handler 
    bx     lr 

HardFault_Handler 
    bx     lr 
              
SysTick_Handler 
    ldr    r0, =SysTim 
    ldr    r1, [r0] 
    add    r1, #1 
    str    r1, [r0] 
    cmp    r1, #500 
    bcc    TickExit 
    mov    r1, #0 
    str    r1, [r0] 
    ldr    r0, =b_05s  
    ;大于等于500次 清零時鐘滴答計數器 設定0.5s標志位 
    ;位帶操作置1 
    mov    r1, #1 
    str    r1, [r0] 
TickExit    
    bx     lr 
                                                                           
    ALIGN            
    ;通過用零或空指令NOP填充,來使當前位置與一個指定的邊界對齊 
    EN
  1. build

    這里又有錯誤,是版本問題,修改一下就好

    忘了生成.hex檔案

  2. McuFly

  3. 除錯
    成功

  4. 觀察波形
    debug修改相關設定
    點開波形圖添加暫存器

4.hel庫實作

1.SRM32CubeMX

  1. File-New Project,選擇型號STM32F103C8,選中之后點擊start project


  2. System Core-RCC-High Speed Clock-Crystal/Ceramic Resonator

  3. A->Z-USART1-Asynchronous

  4. 勾選Clock Condigiguration-PLLCLK

  1. 新建檔案名
    Project Manager- Project -Toolchain / IDE-MDK-ARM
    Application Structure-Basic

  2. Project Manager- Code Generator-Generated files-勾選第一個

  3. Generator Code

  4. Open Project

2.Keil

  1. 在main.c檔案的while函式中添加代碼
 char data[]="hello windows!\n";
		HAL_UART_Transmit(&huart1, (uint8_t *)data, 15, 0xffff);
		HAL_Delay(1000);

  1. build

  1. McuFly
  2. 除錯
  3. 分析波形
    1. debug
    2. setup
    3. 波形圖

三、總結

這次作業我學習了解串口協議和RS-232標準,以及RS232電平與TTL電平的區別,以及USB/TTL轉232的作業原理,通過后面的實驗匯編語言和STM32CubeMX做兩個專案,我了解了STM32CubeMX的基本操作方法,如何建立.hex檔案等,比起匯編語言實作,它要方便快捷很多,了解了如何使用Keil波形圖分析,當然實驗程序中也遇到了很多問題,在自己查閱資料和同學的幫助下都成功地解決了,


四、參考文獻

http://www.elecfans.com/emb/jiekou/20171101573461.html
https://www.sohu.com/a/168891691_669755
https://blog.csdn.net/Mark_md/article/details/108597911
https://blog.csdn.net/qq_43279579/article/details/112233696
https://blog.csdn.net/vic_to_ry/article/details/110451036
https://www.cnblogs.com/yangguang-it/p/7070787.html


  1. 李永忠主編.現代微機原理與介面技術:西安電子科技大學出版社,2013.10 ??

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/336365.html

標籤:其他

上一篇:開放鴻蒙,未來可循:一文讀懂華為開發者大會2021主題演講

下一篇:【AI數學】SVD奇異值分解篇以及影像壓縮應用python(學習記錄)

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more