STM32單片機學習(3) 串口中斷通信

2021-01-11 電子產品世界

/*
*	* 軟體功能:	 串口實驗(軟體延時方式)* */#include "stm32f10x.h"#include #include "delay.h"u8 uart1_buf[20];int count=0;  //字符串長度int flag=0;	  void RCC_Configuration(void);void GPIO_Configuration(void);void NVIC_Configuration(void);void USART1_Configuration(void);void Uart1_PutChar(u8 ch);void Uart1_PutString(u8* buf , u8 len);int USART1_ReceivedStrCmp(const char *str);/*函數: int main(void)功能: main主函數參數: 無返回: 無/int main(void){RCC_Configuration();NVIC_Configuration();GPIO_Configuration();delay_init(72);USART1_Configuration();GPIO_ResetBits(GPIOA,GPIO_Pin_0);//滅while(1){  //GPIO_ResetBits(GPIOA,GPIO_Pin_0);//滅//delay_ms(500);//延時//Uart1_PutString("Hello",5);//GPIO_SetBits(GPIOA,GPIO_Pin_0);//亮// delay_ms(500);//延時/* if(flag==1&&count!=0){Uart1_PutString(uart1_buf,count);count=0;flag=0;} 		 */}}/*函數: void RCC_Configuration(void)功能: 復位和時鐘控制 配置參數: 無返回: 無/void RCC_Configuration(void){ErrorStatus HSEStartUpStatus;                    //定義外部高速晶體啟動狀態枚舉變量RCC_DeInit();                                    //復位RCC外部設備寄存器到默認值RCC_HSEConfig(RCC_HSE_ON);                       //打開外部高速晶振HSEStartUpStatus = RCC_WaitForHSEStartUp();      //等待外部高速時鐘準備好if(HSEStartUpStatus == SUCCESS)                  //外部高速時鐘已經準別好{FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //開啟FLASH預讀緩衝功能,加速FLASH的讀取。所有程序中必須的用法.位置:RCC初始化子函數裡面,時鐘起振之後FLASH_SetLatency(FLASH_Latency_2);                    //flash操作的延時RCC_HCLKConfig(RCC_SYSCLK_Div1);               //配置AHB(HCLK)時鐘等於==SYSCLKRCC_PCLK2Config(RCC_HCLK_Div1);                //配置APB2(PCLK2)鍾==AHB時鐘RCC_PCLK1Config(RCC_HCLK_Div2);                //配置APB1(PCLK1)鍾==AHB1/2時鐘RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);  //配置PLL時鐘 == 外部高速晶體時鐘 * 9 = 72MHzRCC_PLLCmd(ENABLE);                                   //使能PLL時鐘while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)    //等待PLL時鐘就緒{}RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);            //配置系統時鐘 = PLL時鐘while(RCC_GetSYSCLKSource() != 0x08)                  //檢查PLL時鐘是否作為系統時鐘{}}RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1 | RCC_APB2Periph_AFIO, ENABLE);  //允許 GPIOA、USART1、AFIO時鐘}/*函數: void GPIO_Configuration(void)功能: GPIO配置參數: 無返回: 無/void GPIO_Configuration(void){GPIO_InitTypeDef GPIO_InitStructure;        //定義GPIO初始化結構體GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推輓輸出 	 GPIO_Init(GPIOA, &GPIO_InitStructure); 	   //PA0輸出控制LED燈GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //複合推輓輸出 	 GPIO_Init(GPIOA, &GPIO_InitStructure); 	   //PA9串口輸出GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空輸入GPIO_Init(GPIOA, &GPIO_InitStructure); 	   //PA10用於串口讀入}void NVIC_Configuration(void)	 //中斷分組和優先級配置	 詳見《STM32的函數說明(中文).pdf》P165{NVIC_InitTypeDef NVIC_InitStructure;//NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);  // Set the Vector Table base location at 0x08000000 配置中斷向量偏移表的.默認是FLASH的,所以你不設置也無關係. RAM調試的時候,必須設置.NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);	 //0組,先佔優先級1位,從優先級3位NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; //USART1 全局中斷//NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; 	  //中斷響應優先級1NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能NVIC_Init(&NVIC_InitStructure); //初始化配置}/*函數名:USART1_Configuration輸  入:輸  出:功能說明:初始化串口硬體設備,啟用中斷配置步驟:(1)打開GPIO和USART1的時鐘(2)設置USART1兩個管腳GPIO模式(3)配置USART1數據格式、波特率等參數(4)使能USART1接收中斷功能(5)最後使能USART1功能*/void USART1_Configuration(void)	  //串口配置   詳見《STM32的函數說明(中文).pdf》P346{USART_InitTypeDef USART_InitStructure;USART_InitStructure.USART_BaudRate=9600;   //波特率為9600USART_InitStructure.USART_WordLength=USART_WordLength_8b;  //數據位為8USART_InitStructure.USART_StopBits=USART_StopBits_1; //在幀結尾傳輸 1 個停止位USART_InitStructure.USART_Parity=USART_Parity_No; //校驗模式:奇偶失能USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None; //硬體流控制失能USART_InitStructure.USART_Mode=USART_Mode_Tx | USART_Mode_Rx; //USART_Mode 指定了使能或者失能發送和接收模式:發送使能|接收失能USART_Init(USART1, &USART_InitStructure);	  //初始化配置USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);  //使能或者失能指定的 USART 中斷	,此處為接收中斷USART_Cmd(USART1,ENABLE);	//使能或者失能 USART 外設USART_ClearFlag(USART1, USART_FLAG_TC);//清除傳輸完成標誌位,否則可能會丟失第1個字節的數據.USART_FLAG_TC為發送完成標誌位}/*中斷服務程序*/void USART1_IRQHandler(void){	u8 dat;//u8 uart1_buf[6];if(USART_GetITStatus(USART1,USART_IT_RXNE)==SET)	//若接收完成{//GPIO_SetBits(GPIOA,GPIO_Pin_0);//點亮LED	              //delay_ms(500);//延時//GPIO_ResetBits(GPIOA,GPIO_Pin_0);//滅 dat=USART_ReceiveData(USART1);//Uart1_PutChar(dat);//uart1_buf[count++]=dat;dat = USART_ReceiveData(USART1);if(dat!=0x23)	 //!=#在發送的信息末尾應包含#號{uart1_buf[count++]=dat;if(count>19){Uart1_PutString("超出長度![最長20個字符/10個漢字]",32);count=0;}}else if(count!=0){//Uart1_PutString("Received Data:",14);//Uart1_PutString(uart1_buf,count);if(USART1_ReceivedStrCmp("我愛你")) Uart1_PutString("我也愛你",8);if(USART1_ReceivedStrCmp("Hello")) Uart1_PutString("Hi",2);count=0;}		USART_ClearFlag(USART1,USART_IT_RXNE);} //溢出處理-如果發生溢出需要先清除ORE,再讀DR寄存器 則可清除不斷入中斷的問題if(USART_GetFlagStatus(USART1,USART_FLAG_ORE)==SET){USART_ClearFlag(USART1,USART_FLAG_ORE);        //清除OREUSART_ReceiveData(USART1);                                //讀DR}}//發送一個字符void Uart1_PutChar(u8 ch){USART_SendData(USART1, (u8) ch);while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);//等待發送完成}//發送一個字符串 Input : buf為發送數據的地址 , len為發送字符的個數void Uart1_PutString(u8* buf , u8 len){   u8 i;for(i=0;i


相關焦點

  • 串口中斷-即將消失的單片機技藝
    今天粉絲催更,求「串口中斷」的教程,第一次被催啊,我稍微認真點寫。之前講過中斷的概念,沒看過的小夥伴可以 看一下,今天給大家講一下,三種中斷中最不起眼的串口中斷,說實話,串口中斷不適合單獨講,適合放在通信裡去講。
  • stm32 USART 串口通信操作寄存器+庫函數
    串口通信雖然在如今的電腦上使用的越來越少,因為其在通信速率,距離已經不適應pc的要求,取而代之的是USB口。但是在嵌入式領域,USART仍然廣泛運用著。stm32的最多可以提供5路串口,有分數波特率發生器、支持同步單線通信和半雙工單線通信、具有DMA等。使用USART時,stm32的I/O口經RS232電平轉換電路 和電腦的串口連接。串口使用只需要開始串口時鐘,設置相應的I/O口模式,配置波特率、數據位長度、奇偶校驗位等信息就可以使用了。
  • Java軟體與單片機串口通信
    軟體的編寫採用的Java語言,當然,使用C++、VB等語言也可以編寫出與單片機串口通信的軟體,使用VB的MSCOMM控制項可以更方便的實現串口通信。e) { }3.設置串口通訊參數try {serialPort.setSerialPortParams(9600,SerialPort.DATABITS_8,SerialPort.STOPBITS
  • 51 單片機UART 串口通信 方式1 實現
    根據串行通信口硬體結構,實現UART通信可以分為兩步:(1)初始化串行通信口( UART )配置SCON:設定串口方式( SM0及SM1位配置4種方式);串口是否要接收數據(REN位)設定PCON寄存器的SMOD位(若非串口方式0 )若串口為方式1和方式3,則需要配置TMOD:選擇定時器1並配置其初值裝載方式(MI M0位),並設置TH1,TL0的初值以確定通信的波特率(由波特率的計算公式)
  • Linux下ARM 和單片機的串口通信設計
    摘要:介紹Linux環境下串口通信的設計方法和步驟,並介紹了ARM9微處理器s3c2440在Linux下和C8051Fxxx系列單片機進行串行通信的設計方法,給出了硬體連接和通信程序流程圖。該方法可靠、實用,適用於大多數LinuxARM和單片機串口通信的場合。
  • 51單片機串口通信實例
    一、原理簡介本文引用地址:http://www.eepw.com.cn/article/170625.htm51 單片機內部有一個全雙工串行接口。什麼叫全雙工串口呢?
  • 通過stm32 cubemx 配置 串口中斷
    ③串口的全局中斷{  自己的代碼; } 關鍵字:stm32  cubemx  串口中斷 編輯:什麼魚 引用地址:http://news.eeworld.com.cn/mcu/
  • STM32系統學習——USART(串口通信)
    三、STM32的USART簡介 通用同步異步收發器是一個串行通信設備,可以靈活的與外部設備進行全雙工數據交換。有別與USART,還有一個UART,它在USART基礎上裁剪掉了同步通信功能,只有異步通信。簡單區分同步和異步就是看通信時需不需要對外提供時鐘輸出,我們平時用的串口通信基本都是 UART。
  • 如何正確的學習STM32單片機
    如何正確的學習STM32單片機?不管學什麼單片機,了解這款晶片的系統結構是必須,而要了解晶片的系統結構,我們必須要閱讀晶片的閱讀書冊。所以學習STM32單片機,兩個手冊是必須認真閱讀的,它們分別是《STM32F103xxx參考手冊》和《STM32固件庫使用手冊》。
  • STM32F103學習筆記三 串口通信
    1、串口通信背景知識1.1、 設備之間的通信方式並行通信 串行通信傳輸原理 數據各個位同時傳輸 數據按位順序傳輸優點 速度快 佔用引腳資源少缺點 佔用引腳資源多 速度相對較慢1.2、 串行通信分類1.2.1、按照通信方式,分為:同步通信:帶時鐘同步信號傳輸
  • LabVIEW與STC89C54單片機串口通信實現
    下位機主要是用來採集數據,可以通過嵌入式控制器、單片機控制器、PLC等來實現。上位機主要是圖形界面,用來實時顯示採集數據,並進行數據分析及處理,同時可以控制下位機。上位機的實現可以通過各種高級語言,比如VB、Delphi等以及NI公司的圖形化虛擬儀器軟體開發環境LabVIEW.由於LabVIEW採用的是圖形化的編程方法,所以無論你是否有過編程經驗,都可以快速、高效地設計用戶界面,實現與控制硬體的通信,並進行數據分析和處理。如今LabVIEW已經滲透到工業測量的各個領域,與此同時在嵌入式、FPGA、DSP、實時控制等領域也發揮著巨大的作用。
  • avr單片機和stm32區別與優缺點分析
    摘要:avr單片機和stm32單片機是目前使用較廣泛的單片機,那麼avr單片機和stm32單片機有什麼區別呢?有什麼優劣勢呢?C語言與51的C語言在寫法上存在很大的差異,這讓從開始學習51單片機的朋友很不習慣   3. 通用寄存器一共32個(R0~R31),前16個寄存器(R0~R15)都不能直接與立即數打交道,因而通用性有所下降。而在51系列中,它所有的通用寄存器(地址00~7FH)均可以直接與立即數打交道,顯然要優於前者。
  • 基於RS485的組態王與單片機多機串口通信設計
    而單片機接口豐富,與A/D轉換模塊組合可以完成相同的工作,並且系統可靠、成本低。2 組態王與單片機的串口通訊方法目前,組態王與單片機的通信多是通過動態數據交換(DDE)或通過自己開發通訊驅動程序完成。DDE是Windows平臺上的一個完整的通信協 議,組態王通過該協議與其他應用程式交換數據。但不可靠和非實時。
  • 敏矽微電子Cortex-M0學習筆記07-串口通信詳解
    串口最重要的功能就是能夠讓單片機和外部設備進行數據交互。例如在我們學習敏矽微電子的cortex m0時,可以將開發板與電腦相連,通過串口調試助手來調試程序、觀察程序運行結果。還有很多其他的串口模塊,比如藍牙、 NBIOT、GPRS、4G 等模組,都是使用的串口來進行驅動的,因此掌握串口是嵌入式工程師必備的技能。接下來我們就來學習如何驅動ME32F030上的串口。在正式學習之前,我們先對UART串口的通信格式做一個了解。
  • 基於C8051F040單片機的CAN總線和RS-232串口通信設計
    為了實現對CAN總線和RS-232串口雙向通信需求,提出了一種基於C8051F040單片機的數據通信方案,並完成系統設計。分析了CAN總線和RS-232串口的通信特點,介紹了單片機硬體,並對軟體的設計思路與流程做了詳盡描述,完成功能檢測。實驗結果表明,該設計達到了要求。
  • 怎麼學習STM32單片機?看老司機是怎麼說的!
    本文引用地址:http://www.eepw.com.cn/article/201705/359058.htm  我不是說STM32不好,而是這種為了學習單片機而去學習單片機的思路不對。  你問,如何系統地入門學習stm32?  本身就是一個錯誤的問題。假如你會使用8051 , 會寫C語言,那麼STM32本身並不需要刻意的學習。
  • STM32的串口(UART)及串口通信原理
    3、串行通信的通信方式及舉例        同步通信:帶時鐘同步信號傳輸串口是我們的大多數微控制單元(MCU)都具有的基本的外部接口,一般串口最基本的功能就是調試,又能做數據通信的接口(數據量要小一些)。
  • 一種基於STM32的最小系統及串口通信的實現
    +5V電壓通過三端穩壓晶片ASM1117-3.3將電壓轉換成+3.3V,D3作為電源指示燈,為主控晶片STM32F103C8T6、串口通信電路和其他外圍晶片供電。電源供電原理如圖2所示。 2、串口通信設計與調試 2.1、串口通信的設計 串口通信是系統與PC機交互的重要部分。STM32F103C8T6內置3個USART,完全支持RS232協議,且有很高的傳輸速率。本系統的電平轉換晶片選用兼容3.3V供電的MAX3232ESE,可同時完成發送和接收轉換雙重功能。串口通信電路如圖5所示。
  • stm8s開發(三) UART的使用:串口通信!
    串口通信是單片機學習的一個最基本、最重要的功能之一。串口通信可以間接的當做調試接口使用,實現單片機與電腦之間的通信。當然可以與一些模塊(比如藍牙、wifi)通信,也可以作為和其他單片機通信的工具。
  • STM32單片機編程printf()函數重定向
    在stm32單片機編程中,可以重定向printf()函數來輸出調試信息。編寫fputc()函數其實printf()函數在頭文件中被定義成了一個宏,會調用到fputc()函數,但在stm32單片機編程中不可以直接調用標準庫的fputc()函數進行輸出信息,需要自己編寫fputc()函數供printf()函數來調用。編譯器進行編譯時首先會調用自己編寫的fputc()函數,而不是庫函數。