注:使用的芯片是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
??一般都設置串口的配置為全雙工模式,因此設置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寫IAP的bootloader和APP
下一篇:STM32實現串口下載
推薦閱讀
史海拾趣
由于我無法獲取Connective Peripherals Pte Ltd公司的實時發展動態或具體事件,我無法為您撰寫5個與該公司電子行業里發展相關的故事。然而,我可以為您概括性地描述Connective Peripherals Pte Ltd公司在電子行業中的發展概況,以便您了解該公司的基本情況和行業地位。
Connective Peripherals Pte Ltd自2016年成立以來,在電子行業里逐步嶄露頭角,成為一家備受矚目的通信和儀器儀表產品供應商。該公司專注于基于USB、CAN和RS232/RS422/RS485接口的串行連接解決方案,憑借卓越的技術實力和創新能力,在行業中樹立了良好的口碑。
隨著科技的飛速發展,電子行業對高效、穩定的通信和儀器儀表產品需求日益增長。Connective Peripherals Pte Ltd緊跟行業趨勢,不斷推出創新產品,滿足市場需求。從提供USB到串行接口連接的適配器板和電纜,到開發基于USB的示波器、數據記錄器和邏輯分析儀等高端產品,Connective Peripherals Pte Ltd的產品線日益豐富,質量也逐步提升。
在市場競爭激烈的電子行業,Connective Peripherals Pte Ltd憑借其卓越的產品質量和完善的售后服務,贏得了眾多客戶的信賴和支持。該公司與多家知名企業建立了長期穩定的合作關系,產品遠銷海內外,為公司的快速發展奠定了堅實的基礎。
此外,Connective Peripherals Pte Ltd還注重技術研發和人才培養。公司擁有一支高素質的研發團隊,不斷投入資金進行技術研發和創新,為公司的持續發展提供了強大的技術支持。同時,公司還積極開展人才培訓和引進工作,吸引了一批優秀的行業人才加入公司,為公司的長遠發展注入了新的活力。
總之,Connective Peripherals Pte Ltd在電子行業里憑借卓越的技術實力、豐富的產品線和完善的售后服務,逐步發展成為一家具有影響力的企業。未來,隨著電子行業的不斷發展,Connective Peripherals Pte Ltd有望繼續保持其領先地位,為行業的進步和發展做出更大的貢獻。
請注意,以上內容僅為概括性的描述,并未涉及具體的故事或事件。如果需要更詳細的故事或事件描述,建議查閱相關的行業報告、公司年報或新聞報道,以獲取更準確和具體的信息。
為了進一步拓展國際市場,B&K Precision在全球范圍內設立了多個分公司和辦事處。其中,2012年在中國設立的分公司百科中國儀器有限公司是一個重要的戰略布局。這一舉措不僅加強了公司在亞洲市場的地位,也為各地客戶提供了更為迅速和便捷的售后服務保障。同時,通過與國際知名企業的合作與交流,B&K Precision不斷吸收先進的技術和管理經驗,為公司的持續發展注入了新的動力。
以上五個故事,展現了B&K Precision公司從車庫起步到成為全球電子測量領域領導者的發展歷程。通過不斷創新和拓展業務,公司成功應對了市場變化和挑戰,成為了電子行業中的佼佼者。
近年來,ERNI不斷加大研發投入,致力于推出更多創新產品和技術。他們不僅繼續深耕連接器領域,還拓展了背板、子系統及整套電機架系統等業務。同時,ERNI還積極為客戶提供高性能、自行設計的工具制造、現代器件裝配和測試設備等高附加值的服務。這些舉措使ERNI在電子行業中的競爭力不斷增強,也為公司的未來發展奠定了堅實基礎。
以上是關于電子行業里ERNI公司發展起來的相關故事概述。通過這些故事,我們可以看到ERNI如何憑借持續的創新、精湛的技術和全球化的戰略在電子行業中取得了輝煌成就。
隨著業務的不斷增長,Freqtech Ohg公司開始實施全球化戰略。公司首先在歐洲建立了研發中心,隨后在亞洲市場設立了生產基地和銷售網絡。通過整合全球資源,Freqtech不僅降低了生產成本,還更快速地響應了不同地區客戶的需求。同時,公司積極參與國際展會和技術交流,不斷提升品牌知名度和影響力,為公司的全球化發展奠定了堅實基礎。
隨著通信行業的快速發展,康普公司意識到光纖光纜在有線電視行業的重要性。因此,在1977年,康普公司合并了Valtec公司,一個獨立的光纖技術領導者。這次合并不僅增強了康普在光纖技術方面的實力,也為其日后的全球化布局打下了堅實的基礎。隨后,康普通過一系列的戰略合作和收購,逐漸在全球范圍內建立了供應鏈和生產基地,為全球客戶提供高效、可靠的通訊網絡解決方案。
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 ...… 查看全部問答∨ |
ZigBee模塊采用新一代ZigBee芯片,內嵌高性能32位MCU并提供業界領先的射頻性能。該模塊可提供插針或貼片封裝并內嵌自主開發的通用固件,可極大地降低設備開發商集成ZigBee技術的時間與成本。 標準型ZigBee模塊標準型ZigBee模塊專為近距離低功耗無 ...… 查看全部問答∨ |
|
IAR for msp430 和諧安裝成功的朋友們進來下說說是什么問題? 我試著裝了 v5.1、 v5.3、 v5.5等幾個版本,都用和諧工具成功和諧安裝成功,但是打開軟件后都出現要 要求到官網驗證注冊,如果不管驗證注冊的話,都編譯都提示軟件未注冊不,并編譯不成功,系統是win7 32位的,和諧成功并可以使用的朋友們 ...… 查看全部問答∨ |
各位好: 小弟最近用STM32開發一款產品,需要用到Tamper腳做防拆,靜電測試發現,很容易觸發Tamper入侵檢測,有哪位在項目中遇到這種問題嗎?有沒有好的建議? 注:模具有金屬部件,接主板地,但是無法接到大地。在Tamp ...… 查看全部問答∨ |
近幾天借了本《單片機C語言程序設計實訓100例》在熟練單片機的C語言操作,進一步加深對單片機及C語言編程的了解。 然后我用keil和Proteus練習仿真,然后按照書本的練習仿真的時候發現 LCD1602只是亮而不會進行溫度采集以及轉速控制,我在網上查過相 ...… 查看全部問答∨ |