娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

歷史上的今天

今天是:2025年07月01日(星期二)

正在發生

2020年07月01日 | STM32學習之使用庫函數編寫串口通信

發布者:SereneSoul55 來源: eefocus關鍵字:STM32  庫函數  串口通信 手機看文章 掃描二維碼
隨時隨地手機看文章

注:使用的芯片是STM32F103ZET6


一、串口初始化部分的程序

1.初始化時鐘

??因為要使用串口1這個外設,因此在使用之前就需要開啟串口1的時鐘,并且之后還需要設置IO輸入輸出的模式,在這里我們也需要開啟GPIO的時鐘。程序如下:


//初始化串口時鐘

 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);

 //初始化GPIO時鐘

 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);


??可是為什么要初始化時鐘呢在《STM32中文參考手冊_V10》的RCC中有這樣一句話“當外設時鐘沒有啟用時,軟件不能讀出外設寄存器的數值,返回的數值始終是0x0。”,也就是只有開啟了對應外設的時鐘,才能操作外設。

??該部分解釋參考如下文檔:

https://blog.csdn.net/dp29sym41zygndvf/article/details/82321133


2. 初始化GPIO

??初始化GPIO就是設置使用端口的引腳、模式以及速度。因為使用的是串口1,所以在STM32F103ZET6芯片上USART_TX、USART_RX分別對應的引腳是PIOA.9和GPIOA.10。引腳復用的功能不同,對應引腳模式設置就不同,詳細的可以參考《STM32中文參考手冊_V10》的8.1.11,下表就是使用參考手冊里的表21 USART。


這里是引用《STM32中文參考手冊》里的表21

截取《STM32中文參考手冊》里的圖

??一般都設置串口的配置為全雙工模式,因此設置GPIOA.9的模式為推挽復用輸出,設置GPIOA.10的模式為浮空輸入。引腳的速度沒有太大的限制。該端程序如下:


GPIO_InitTypeDef GPIO_InitStruct;


//初始化GPIO

 GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;  //GPIOA.9是USART1的TX

 GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP; //設置其模式為推挽復用輸出

 GPIO_InitStruct.GPIO_Speed = GPIO_Speed_10MHz; //速度為10MHz

 GPIO_Init(GPIOA,&GPIO_InitStruct);

 

 GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10;  //GPIOA.10是USART1的RX

 GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING; //設置其模式為浮空輸入

 GPIO_InitStruct.GPIO_Speed = GPIO_Speed_10MHz;  //速度為10MHz

 GPIO_Init(GPIOA,&GPIO_InitStruct);


3. 初始化串口

??初始化串口就是設置串口的停止位、奇偶校驗位、字長、波特率、串口的模式以及硬件流控制。

?? 停止位:可以設置停止位為0.5個、1個、1.5個和2個停止位,當通常都設置1個停止位。

??字長:可以設置8個數據位或9個數據位。

??奇偶校驗位:當設置有8個數據位時,就沒有奇偶校驗位;當設置有9個數據位時,第9位為奇偶校驗位,以保證傳送數據的準確性。如果設置為奇校驗,如果前8個數據位中1的個數為奇數,則該位為0,如果為偶數,該位為1。若為偶校驗,如果1的個數為偶數該位為0,為奇數該位為1。


??波特率:就是數據傳輸的速率,接收方的波特率要與發送方的波特率相同。

??串口的模式:設置發送使能和接受使能

??硬件流控制:這個只有在半雙工時使用,一般不開啟這個功能。

??該段程序如下:


USART_InitTypeDef USART_InitStruct;


//初始化串口

 USART_InitStruct.USART_BaudRate = 115200; //設置波特率 

 USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //不使用這個

 USART_InitStruct.USART_Mode = (USART_Mode_Rx | USART_Mode_Tx);  //設置模式為即接受又發送

 USART_InitStruct.USART_Parity = USART_Parity_No;  //無奇偶校驗位,也就是無第九位

 USART_InitStruct.USART_StopBits = USART_StopBits_1;  //1位停止位

 USART_InitStruct.USART_WordLength = USART_WordLength_8b; //8位數據位

 USART_Init(USART1,&USART_InitStruct);


4.串口使能

??之前都只是設置串口的一些配置,并沒有使串口開始工作,因此我們要使能串口,需要調用USART_Cmd(USART_TypeDef* USARTx, FunctionalState NewState)這個函數,其最終是對控制寄存器1(USART_CR1)的位13的操作,如果該位為1,USART模塊使能,若為0,禁止USART分頻器和輸出。


??該段程序如下:


//使能串口

 USART_Cmd(USART1,ENABLE);


??通常接受數據需要使用串口中斷,而串口發送可以不使用串口中斷。如果不需要開啟串口中斷,到這一步已經完成串口的初始化部分。如果需要用到串口中斷,則再需要下面兩個步驟。


5.初始化NVIC

??首先就是了解一下NVIC是什么,NVIC,就是Nested vectored interrupt controller,即嵌套向量中斷控制器


??在STM32F103ZET6芯片中有16個內核中斷,60個可屏蔽中斷,16個可編程中斷優先級,怎么多中斷怎么管理呢,這時候NVIC嵌套向量中斷管理器就派上用場了。首先先對中斷進行分組,如下表所示:


AIRCR[10:8] IP bit[7:4]分配情況 分配結果

0 111 0:4 0位搶占優先級,4位響應優先級

1 110 1:3 1位搶占優先級,3位響應優先級

2 101 2:2 2位搶占優先級,2位響應優先級

3 100 3:1 3位搶占優先級,1位響應優先級

4 011 4:0 4位搶占優先級,0位響應優先級

注:該表是參考正點原子第24講 NVIC中斷優先級管理的PPT


??這里所說的中斷分組并不是說把各個中斷分到了這幾個組,而是說每一個組對應的搶占優先級和響應優先級的位數不同,根據自己需要多少位搶占優先級和幾位響應優先級來設置,總共有4個位來控制。


??搶占優先級的講解:搶占優先級高的中斷可以打斷搶占優先級低的中斷,這就有點像51的中斷優先級,0的時候搶占優先級最高。


??響應優先級的講解:響應優先級高的不能打斷響應優先級低的,只有在搶占優先級相同時起作用,當搶占優先級相同時,響應優先級高的,當和響應優先級低的中斷相同時發生時,響應優先級高的中斷先觸發。


??上面說到總共有4個位來設置這兩個優先級,因此24就為16,就有16級可編程中斷優先級。

??舉個例子:

??我要設置串口1的中斷,其搶占優先級為2,響應優先級也為2。

??1.先設置中斷分組。

??因為搶占優先級為2,則不能用組1,因為組1可設置的搶占優先級為0位,不可以設置,所以應該從組1到4選擇,因為響應優先級為2,則不能用組4,組4的響應優先級沒有分配位數,因此可以從組2到3選擇,我選擇組2。


??2.設置優先級。

??因為組2,搶占優先級分配2個位,響應優先級分配2個位,因此搶占優先級可以設置22個也就是4個優先級等級,響應優先級也是4個等級,即0到3。要設置搶占優先級為2,響應優先級也為2,把2寫入NVIC_IP寄存器的位6和位7,設置搶占優先級;把2寫入NVIC_IP寄存器的位4和位5,設置響應優先級優先級。


??在我們使用庫函數編寫程序時,void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);是進行中斷分組,NVIC_Init(&NVIC_InitStruct);是對NVIC初始化,也就是設置搶占優先級,響應優先級,IRQ的串口通道打開和IRQ通道使能這四個參數。

??搶占優先級和響應優先級是幾設置即就行。

??為什么要打開IRQ對應的串口1通道,因為IRQ是interrupt

request,即中斷請求通道,也就是選擇什么來觸發中斷,因為使用的是串口1,因此需要開啟IRQ的串口1通道,選擇使用串口1觸發。使能串口1的IRQ通道就不用說了。

??該段程序如下:


NVIC_InitTypeDef NVIC_InitStruct;


//初始化NVIC(設置搶占優先級和響應優先級)

 NVIC_InitStruct.NVIC_IRQChannel = USART1_IRQn;  //選擇IRQ為USART1

 NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; //使能IRQ通道

 NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 2; //設置搶占優先級

 NVIC_InitStruct.NVIC_IRQChannelSubPriority = 2; //設置響應優先級

 NVIC_Init(&NVIC_InitStruct);  


??中斷分組有關的庫函數放在了主函數剛開始,沒在在這部分程序中。


6.開啟串口1中斷

??在之前的步驟中把有關于串口的配置都配置好了,而這一步是設置串口1是通過什么觸發中斷的,比如是發送完成后觸發中斷還是接受到數據觸發中斷。在庫函數中void USART_ITConfig(USART_TypeDef* USARTx, uint16_t USART_IT, FunctionalState NewState);是開啟串口1中斷的,這個函數第二個形參就是設置串口是通過哪種方式觸發中斷的,一般情況下我們使用的是USART_IT_RXNE,就是設置當接收到數據觸發中斷。

??該段程序如下:


USART_ITConfig(USART1,USART_IT_RXNE,ENABLE); //設置接受到數據觸發中斷

??之前設置串口1的IRQ通道,只是設置了是通過串口1來觸發中斷,也就是中斷源,但具體是由串口1的哪種方式來控制觸發中斷,就需要這一步設置。


??到此,串口初始化已經全部配置完成。


二、中斷服務函數部分

??由于這個程序只是編寫一個簡單的串口收發,所以在中斷服務函數部分就編寫了收到什么數據就發送什么數據,程序如下:


void USART1_IRQHandler(){  //串口1中斷服務函數

 u8 Recv;

 if(USART_GetITStatus(USART1,USART_IT_RXNE) != RESET){

  Recv = USART_ReceiveData(USART1);

  USART_SendData(USART1,Recv);

 }

}


??進入串口1的中斷服務函數后,先通過調用USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT)這個函數來判斷是不是因為接收到數據而觸發中斷的,或許該奇怪了,之前明明設置的就是接收到數據后觸發中斷,為什么進中斷服務函數還需要再判斷,這是因為雖然選擇中斷的觸發方式,但是可能是別的情況觸發,下面引用《STM32中文參考手冊_V10》25.4中斷請求的話來解釋一下:


??USART的各種中斷事件被連接到同一個中斷向量,有以下各種中斷事件:

● 發送期間:發送完成、清除發送、發送數據寄存器空。

● 接收期間:空閑總線檢測、溢出錯誤、接收數據寄存器非空、校驗錯誤、 LIN斷開符號檢測、噪音標志(僅在多緩沖器通信)和幀錯誤(僅在多緩沖器通信)。

??如果設置了對應的使能控制位,這些事件就可以產生各自的中斷 。通用同步異步收發器(USART)


??因此需要先判斷是否為是對應的標志位置一而觸發的中斷,之后就是調用庫函數中串口接收數據的函數,讀出接受的數據,為了能看到現象,所以又調用庫函數中串口發數據函數,將數據發出去,在電腦的串口小助手中就可以看到接收串口中的數據和發送框中數據一致。


三、主函數部分

??因為實現的功能比較簡單,所以在主函數中主要調用初始化函數。主函數部分如下:


int main(){

   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//中斷分組

   Uart_Init(); //初始化串口


   while(1);


??剛開始是調用中斷分組的函數,這部分講解在初始化NVIC部分中解釋了,之后就是調用初始化串口函數,這個函數是自己編寫的不是庫函數里的,這個函數就是包含上面第一部分串口初始化部分的程序中所有列出來的語句。然后就是使用while死循環,使程序一直跑下去。


??該篇文章是我學習正點原子STM32視頻講解之后的總結和自我理解,如果有什么不對的,還請各位指教。


參考資料

《STM32中文參考手冊_V10》

《STM32F10xxx Cortex-M3編程手冊》

《STM32F1開發指南(精英版)-庫函數版本_V1.0》(正點原子)

STM32官方數據手冊

關鍵字:STM32  庫函數  串口通信 引用地址:STM32學習之使用庫函數編寫串口通信

上一篇:怎么使用stm32寫IAP的bootloader和APP
下一篇:STM32實現串口下載

推薦閱讀

集微網消息,6月29日晚間,中興通訊發布董事辭職公告,殷一民先生、張建恒先生、欒聚寶先生、趙先明先生、王亞文先生、田東方先生、詹毅超先生、韋在勝先生、翟衛東先生、張曦軻先生、陳少華先生、呂紅 兵先生、Bingsheng Teng(滕斌圣)先生、朱武祥先生共十四名董事于 2018 年 6 月 29 日提交書面《辭職報告》。公告稱,鑒于本公司二〇一七年度股...
之前一直使用的W25Q16 spi flash都沒問題,換了一款W25Q80后發現工作不正常,經過測試,初步定位到問題在于初始化SPI后是否將CS拉高。于是又去查看了一下原廠代碼:發現原廠的代碼初始化SPI接口時是專門拉高CS的。結論:網上很多代碼初始化SPI接口時沒有專門拉高CS,對某些型號可能確實是沒問題,但兼容性不好,最好是加上。
一、新建工程1.新建一個ARM Executable Image2.創建uCOS_II文件夾,創建兩個子文件夾,分別為ARM、SOURCEARM存放和平臺相關的文件("OS_CPU.H" "Os_cpu_a.s" "Os_cpu_c.c" )SOURCE下存入和平臺無關的文件("ucos_ii.h" "os_cfg.h" "os_core.c" "os_flag.c" "os_mbox.c" "os_mem.c" "os_mutex.c" "os_q.c" "os_sem.c" "os_task.c" "os_time...
6月29日—30日,由蓋世汽車主辦的“2021中國汽車半導體產業大會” 隆重召開。本次會議主要圍繞中國車企缺芯現狀、供應鏈國產化安全建設、車載芯片平臺的搭建設計、自動駕駛、智能座艙領域的芯片需求和應用案例、功率半導體在三電中的應用以及芯片測試和功能安全等話題展開討論,共謀產業未來發展之路。下面是中國電子技術標準化研究院副總工程師陳大為在...

史海拾趣

問答坊 | AI 解惑

Synopsys(新思科技)緊急招聘,找工作的趕緊看看

Intern (實習生) (上海-長寧區) Synopsys Executive Account Manager/資深客戶經理(北京) (北京-海淀區) Synopsys Support Ctr Engineer(DC/STA/DFT)/售后技術顧問 (北京) Synopsys Support Ctr Engineer( ...…

查看全部問答∨

我做了個數碼管的顯示程序,不知道該怎么接線,請幫幫忙啊,

START:MOV DPTR,#TABLE       MOV A,#6       MOVC A,@A+DPTR       MOV P0,A       JMP $ TABLE:DB 0C0H,0F9H,0A4H,0B0H       DB 9 ...…

查看全部問答∨

用哪種牌子的激光復印機打印在透明紙上效果最好

我試過很多款不同牌子的激光打印機,但打在透明紙上還是看得到一點一點,造成做出來的PCB也有問題,大家分享一下你們的經驗…

查看全部問答∨

SD卡讀取圖片一定需要帶文件系統嗎

從SD卡讀取一張BMP的圖片  顯示在LCD上  用的是S3C2440如果不用文件系統該怎么實現…

查看全部問答∨

ZigBee模塊選型手冊

ZigBee模塊采用新一代ZigBee芯片,內嵌高性能32位MCU并提供業界領先的射頻性能。該模塊可提供插針或貼片封裝并內嵌自主開發的通用固件,可極大地降低設備開發商集成ZigBee技術的時間與成本。 標準型ZigBee模塊標準型ZigBee模塊專為近距離低功耗無 ...…

查看全部問答∨

IAR for msp430 和諧安裝成功的朋友們進來下說說是什么問題?

   我試著裝了 v5.1、 v5.3、 v5.5等幾個版本,都用和諧工具成功和諧安裝成功,但是打開軟件后都出現要 要求到官網驗證注冊,如果不管驗證注冊的話,都編譯都提示軟件未注冊不,并編譯不成功,系統是win7 32位的,和諧成功并可以使用的朋友們 ...…

查看全部問答∨

STM32 Tamper腳放靜電性能

各位好:      小弟最近用STM32開發一款產品,需要用到Tamper腳做防拆,靜電測試發現,很容易觸發Tamper入侵檢測,有哪位在項目中遇到這種問題嗎?有沒有好的建議? 注:模具有金屬部件,接主板地,但是無法接到大地。在Tamp ...…

查看全部問答∨

單片機通信

想用51和430G2單片機模擬IIC通信,需要將兩個的晶振設成一樣的嗎?還有,430 G2553的板子用SPI怎么用?謝了。…

查看全部問答∨

溫度控制直流電機轉速程序求幫助

近幾天借了本《單片機C語言程序設計實訓100例》在熟練單片機的C語言操作,進一步加深對單片機及C語言編程的了解。 然后我用keil和Proteus練習仿真,然后按照書本的練習仿真的時候發現 LCD1602只是亮而不會進行溫度采集以及轉速控制,我在網上查過相 ...…

查看全部問答∨
小廣播
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 胶南市| 夹江县| 灵丘县| 三江| 垦利县| 贵定县| 科技| 平潭县| 定日县| 青龙| 佛学| 张家港市| 长沙县| 青河县| 吉木萨尔县| 乐都县| 西藏| 高雄县| 靖安县| 桐庐县| 原平市| 应用必备| 卢龙县| 曲麻莱县| 资源县| 峡江县| 平潭县| 涿州市| 海原县| 南召县| 姜堰市| 永年县| 方城县| 邢台市| 柘城县| 通州市| 镇宁| 文昌市| 浦东新区| 宜兰市| 广水市|