(轉)STM32學習筆記(7):USART串口的使用


STM32學習筆記(7):USART串口的使用

2011年4月19日 USART串口通信

1.     串口的基本概念

在STM32的參考手冊中,串口被描述成通用同步異步收發器(USART),它提供了一種靈活的方法與使用工業標准NRZ異步串行數據格式的外部設備之間進行全雙工數據交換。USART利用分數波特率發生器提供寬范圍的波特率選擇。它支持同步單向通信和半雙工單線通信,也支持LIN(局部互聯網),智能卡協議和IrDA(紅外數據組織)SIR ENDEC規范,以及調制解調器(CTS/RTS)操作。它還允許多處理器通信。還可以使用DMA方式,實現高速數據通信。

USART通過3個引腳與其他設備連接在一起,任何USART雙向通信至少需要2個引腳:接受數據輸入(RX)和發送數據輸出(TX)。

RX: 接受數據串行輸入。通過過采樣技術來區別數據和噪音,從而恢復數據。

TX: 發送數據輸出。當發送器被禁止時,輸出引腳恢復到它的I/O端口配置。當發送器被激活,並且不發送數據時,TX引腳處處於高電平。在單線和智能卡模式里,此I/O口被同時用於數據的發送和接收。

 

2.     串口的如何工作的

一般有兩種方式:查詢和中斷。

(1)查詢:串口程序不斷地循環查詢,看看當前有沒有數據要它傳送。如果有,就幫助傳送(可以從PC到STM32板子,也可以從STM32板子到PC)。

(2)中斷:平時串口只要打開中斷即可。如果發現有一個中斷來,則意味着要它幫助傳輸數據——它就馬上進行數據的傳送。同樣,可以從 PC到STM3板子,也可以從STM32板子到PC。

 

3.     串口的硬件連接

我用的奮斗STM32 V3開發板擁有二路RS-232 接口,CPU 的PA9-US1-TX(P68)、PA10-US1-RX(P69)、PA9-US2-TX(P25)、PA10-US2-RX(P26)通過MAX3232 實現兩路RS-232 接口,分別連接在XS5 和XS17 接口上。  USART1 在系統存儲區啟動模式下,將通過該口通過PC對板上的CPU進行ISP,該口也可作為普通串口功能使用,JP3,JP4 的短路冒拔去,將斷開第二路的RS232通信,僅作為TTL 通信通道。

 

4.     編程實例

我們要對串口進行操作,首先要將STM32的串口和CPU進行連接。在Windows操作系統中,有一個自帶的系統軟件叫“超級終端”。VISTA以上的操作系統去掉了這個軟件,不過可以從XP的系統中,復制“hypertrm.dll”和“hypertrm.exe”到“windows/system32”文件夾下,然后雙擊運行hypertrm.exe,就可以看見超級終端的運行界面了。

運行超級終端以后,會彈出“連接描述”,輸入名稱和選擇圖標,這個地方隨便寫個什么名稱都可以。然后彈出“連接到”設置,在“連接時使用”選擇你自己PC和STM32連接的COMx,如果不知道是哪個COM口的話,可以在PC的設備管理器中找到。在選擇好COM口之后,會彈出一個“屬性”對話框,在“位/秒”選擇和你STM32中設置的波特率一致就好,數據位也是按照STM32的設置來選擇,奇偶校驗選擇無,停止位選擇1,數據流控制選擇無。注意,以上的選項都必須和STM32中的串口設置相匹配,要不然可能會出現一些未知錯誤。

配置好超級終端之后,我們便可以開始對STM32進行編程了。編程一般按照如下步驟進行:

(1)       RCC配置;

(2)       GPIO配置;

(3)       USART配置;

(4)       NVIC配置;

(5)       發送/接收數據。

在RCC配置中,我們除了常規的時鍾設置以外,要記得打開USART相對應的IO口時鍾,USART時鍾,還有管腳功能復用時鍾。

在GPIO配置中,將發送端的管腳配置為復用推挽輸出,將接收端的管腳配置為浮空輸入。

在USART的配置中,通過USART_InitTypeDef結構體對USART進行初始化操作,按照自己所需的功能配置好就可以了。注意,在超級終端的設置中,需要和這個里面的配置相對應。由於我是采用中斷接收數據的方式,所以記得在USART的配置中葯打開串口的中斷,同時最后還要打開串口。

在NVIC的配置中,主要是USART1_IRQChannel的配置,和以前的筆記中講述的中斷配置類似,不會配置的可以參考以前的筆記。

全部配置好之后就可以開始發送/接收數據了。發送數據用USART_SendData()函數,接收數據用USART_ReceiveData()函數。具體的函數功能可以參考固件庫的參考文件。根據USART的配置,在發送和接收時,都是采用的8bits一幀來進行的,因此,在發送的時候,先開辟一個緩存區,將需要發送的數據送入緩存區,然后再將緩存區中的數據發送出去,在接收的時候,同樣也是先接收到緩存區中,然后再進行相應的操作。

注意在對數據進行發送和接收的時候,要檢查USART的狀態,只有等到數據發送或接收完畢之后才能進行下一幀數據的發送或接收。采用USART_GetFlagStatus()函數。

同時還要注意的是,在發送數據的最開始,需要清除一下USART的標志位,否則,第1位數據會丟失。因為在硬件復位之后,USART的狀態位TC是置位的。當包含有數據的一幀發送完成之后,由硬件將該位置位。只要當USART的狀態位TC是置位的時候,就可以進行數據的發送。然后TC位的置零則是通過軟件序列來清除的,具體的步驟是“先讀USART_SR,然后寫入USART_DR”,只有這樣才能夠清除標志位TC,但是在發送第一幀數據的時候,並沒有進行讀USART_SR的操作,而是直接進行寫操作,因此TC標志位並沒有清空,那么,當發送第一幀數據,然后用USART_GetFlagStatus()檢測狀態時返回的是已經發送完畢(因為TC位是置1的),所以程序會馬上發送下一幀數據,那么這樣,第一幀數據就被第二幀數據給覆蓋了,所以看不到第一幀數據的發送。

按照上面的方法編程后,我們便可以在超級終端上查看串口通信的具體狀態了。我的這個例程,在硬件復位以后,可以馬上在超級終端上看見“Welcome to my STM32! Please press any key!”字樣,然后如果在超級終端中通過PC機鍵盤按下相應的鍵,則這個鍵會發送到STM32中,並且馬上返回到PC機的超級終端上,因此可以馬上從超級終端的頁面中看到按下的相應的鍵。

 

5.     程序源代碼

 

#include "stm32f10x_lib.h"

 

FlagStatus RX_status;

 

void RCC_cfg();

void GPIO_cfg();

void USART_cfg();

void NVIC_cfg();

 

 

 

int main()

{

       int i;

       unsigned char TxBuf1[] = "Welcome to my STM32! Please press any key!";

       RCC_cfg();

       GPIO_cfg();

       NVIC_cfg();

       USART_cfg();

 

       //清除標志位,否則第1位數據會丟失

       USART_ClearFlag(USART1,USART_FLAG_TC);

 

       //發送數據

       //PB5的作用是顯示正在發送數據

       //當有數據在發送的時候,PB5會亮

       for( i=0;TxBuf1[i]!='\0';i++)

       {

              USART_SendData(USART1,TxBuf1[i]);

              GPIO_SetBits(GPIOB,GPIO_Pin_5);

              //等待數據發送完畢

              while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET);

              GPIO_ResetBits(GPIOB,GPIO_Pin_5);

       }

 

       while(1);

 

}

 

 

//RCC時鍾配置

void RCC_cfg()

{

       //定義錯誤狀態變量

       ErrorStatus HSEStartUpStatus;

     

       //將RCC寄存器重新設置為默認值

       RCC_DeInit();

 

       //打開外部高速時鍾晶振

       RCC_HSEConfig(RCC_HSE_ON);

 

       //等待外部高速時鍾晶振工作

       HSEStartUpStatus = RCC_WaitForHSEStartUp();

       if(HSEStartUpStatus == SUCCESS)

       {

              //設置AHB時鍾(HCLK)為系統時鍾

              RCC_HCLKConfig(RCC_SYSCLK_Div1);

 

              //設置高速AHB時鍾(APB2)為HCLK時鍾

              RCC_PCLK2Config(RCC_HCLK_Div1);

 

              //設置低速AHB時鍾(APB1)為HCLK的2分頻

              RCC_PCLK1Config(RCC_HCLK_Div2);

             

              //設置FLASH代碼延時

              FLASH_SetLatency(FLASH_Latency_2);

 

              //使能預取指緩存

              FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

 

              //設置PLL時鍾,為HSE的9倍頻 8MHz * 9 = 72MHz

              RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);

 

              //使能PLL

              RCC_PLLCmd(ENABLE);

 

              //等待PLL准備就緒

              while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);

 

              //設置PLL為系統時鍾源

              RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

 

              //判斷PLL是否是系統時鍾

              while(RCC_GetSYSCLKSource() != 0x08);

       }

         //打開GPIO時鍾,復用功能,串口1的時鍾

         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO | RCC_APB2Periph_USART1, ENABLE);

}

 

//IO口配置

void GPIO_cfg()

{

       GPIO_InitTypeDef GPIO_InitStructure;

 

       //PA9作為US1的TX端,打開復用,負責發送數據

       GPIO_StructInit(&GPIO_InitStructure);

       GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;

       GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

       GPIO_Init(GPIOA , &GPIO_InitStructure);

 

       //PA10作為US1的RX端,負責接收數據

       GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;

       GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

       GPIO_Init(GPIOA, &GPIO_InitStructure);

 

       //LED顯示串口正在發送/接收數據

       GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;

       GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

       GPIO_Init(GPIOB, &GPIO_InitStructure);

}

 

//串口初始化

void USART_cfg()

{

       USART_InitTypeDef  USART_InitStructure;

         //將結構體設置為缺省狀態

       USART_StructInit(&USART_InitStructure);

       //波特率設置為115200

       USART_InitStructure.USART_BaudRate = 115200;

       //一幀數據的寬度設置為8bits

       USART_InitStructure.USART_WordLength = USART_WordLength_8b;

       //在幀結尾傳輸1個停止位

       USART_InitStructure.USART_StopBits = USART_StopBits_1;

       //奇偶失能模式,無奇偶校驗

       USART_InitStructure.USART_Parity = USART_Parity_No;

       //發送/接收使能

       USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

       //硬件流控制失能

       USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;

       //設置串口1

       USART_Init(USART1, &USART_InitStructure);

     

       //打開串口1的中斷響應函數

       USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);

 

       //打開串口1

       USART_Cmd(USART1, ENABLE);

}

 

//配置中斷

void NVIC_cfg()

{

        NVIC_InitTypeDef NVIC_InitStructure;

        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);                                               //選擇中斷分組2

       

       

        NVIC_InitStructure.NVIC_IRQChannel=USART1_IRQChannel;                           //選擇串口1中斷

        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;                                 //搶占式中斷優先級設置為0

        NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;                                            //響應式中斷優先級設置為0

        NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;                                                 //使能中斷

        NVIC_Init(&NVIC_InitStructure);

}

 

 

然后在stm32f10x_it.c文件中找到相應的中斷處理函數,並填入一下內容。注意在stm32f10x_it.c中,要聲明一下外部變量RX_status

 

extern FlagStatus RX_status;

 

void USART1_IRQHandler(void)

{

     

       GPIO_SetBits(GPIOB, GPIO_Pin_5);

 

       //確認是否接收到數據

       RX_status = USART_GetFlagStatus(USART1, USART_FLAG_RXNE);

       //接收到數據

       if(RX_status == SET)

       {

              //將數據回送至超級終端

              USART_SendData(USART1, USART_ReceiveData(USART1));

              //等待數據發送完畢

              while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);

              GPIO_ResetBits(GPIOB, GPIO_Pin_5);

       }

 

}

 

 GPIO初始化函數。所有程序必須。

用法:

void GPIO_Configuration(void)

{

    GPIO_InitTypeDef GPIO_InitStructure;   //GPIO狀態恢復默認參數

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_標號 | GPIO_Pin_標號 ;

    //管腳位置定義,標號可以是NONE、ALL、0至15。

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;// 最高輸出速度為50MHz

    GPIO_InitStructure.GPIO_Mode =  GPIO_Mode_Out_PP;//推挽輸出

    GPIO_Init(GPIOC, &GPIO_InitStructure);        //C組GPIO初始化

/*注:以上四行代碼為一組,每組GPIO屬性必須相同,默認的GPIO參數為:ALL,2MHz,FLATING。如果其中任意一行與前一組相應設置相同,那么那一行可以省略,由此推論如果前面已經將此行參數設定為默認參數(包括使用GPIO_InitTypeDef GPIO_InitStructure代碼),本組應用也是默認參數的話,那么也可以省略。以下重復這個過程直到所有應用的管腳全部被定義完畢。 */

……

}

GPIO基礎應用:向管腳置1||0

GPIO_SetBits(GPIOC,GPIO_Pin_1);//置1

GPIO_ResetBits(GPIOC,GPIO_Pin_1);//置0

 

 

RCC: 單片機時鍾管理。

我的理解——管理外部、內部和外設的時鍾,設置、打開和關閉這些時鍾。

用法:

函數初始化,程序必須的。

void RCC_Configuration(void)    //時鍾初始化函數

{

  ErrorStatus HSEStartUpStatus;     //等待時鍾的穩定

  RCC_DeInit();         //時鍾管理重置

  RCC_HSEConfig(RCC_HSE_ON);      //打開外部晶振

  HSEStartUpStatus = RCC_WaitForHSEStartUp(); //等待外部晶振就緒

  if (HSEStartUpStatus == SUCCESS)

  {

    FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //flash讀取緩沖,加速

    FLASH_SetLatency(FLASH_Latency_2); //flash操作的延時

    RCC_HCLKConfig(RCC_SYSCLK_Div1); //AHB使用系統時鍾

    RCC_PCLK2Config(RCC_HCLK_Div2);  //APB2(高速)為HCLK的一半

    RCC_PCLK1Config(RCC_HCLK_Div2);  //APB1(低速)為HCLK的一半

    /*注:AHB主要負責外部存儲器時鍾。APB2負責AD,I/O,高級TIM,串口1。APB1負    

責DA,USB,SPI,I2C,CAN,串口2345,普通TIM。 */

    RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);

//PLLCLK = 8MHz * 9 = 72 MHz

    RCC_PLLCmd(ENABLE);     //啟動PLL

    while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET){} //等待PLL啟動

    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //將PLL設置為系統時鍾源

    while (RCC_GetSYSCLKSource() != 0x08){} //等待系統時鍾源的啟動

  }

 RCC_AHBPeriphClockCmd(ABP2設備1 | ABP2設備2 |, ENABLE); //啟動AHP設備

 RCC_APB2PeriphClockCmd(ABP2設備1 | ABP2設備2 |, ENABLE);  //啟動ABP2設備

 RCC_APB1PeriphClockCmd(ABP2設備1 | ABP2設備2 |, ENABLE);  //啟動ABP1設備

}

 

 

NVIC:系統中斷管理。

我的理解——管理系統內部的中斷,負責打開和關閉中斷。

基礎應用1,中斷的初始化函數,包括設置中斷向量表位置,和開啟所需的中斷兩部分。所有程序中必須的。

用法: void NVIC_Configuration(void)

{

NVIC_InitTypeDef NVIC_InitStructure;//中斷管理恢復默認參數

#ifdef  VECT_TAB_RAM  

/*如果C/C++ Compiler\Preprocessor\Defined symbols中的定義了VECT_TAB_RAM(見程序庫更改內容的表格) */

   NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0); //則在RAM調試

#else        //如果沒有定義VECT_TAB_RAM

   NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);//則在Flash里調試

#endif        //結束判斷語句

/*以下為中斷的開啟過程,不是所有程序必須的。 */

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);  //設置NVIC優先級分組,方式。

NVIC_InitStructure.NVIC_IRQChannel = 中斷通道名; //開中斷,中斷名稱見函數庫

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //搶占優先級

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;  //響應優先級

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//啟動此通道的中斷

NVIC_Init(&NVIC_InitStructure);     //中斷初始化

}

注:一共16個優先級,分為搶占式和響應式。兩種優先級所占的數量由此代碼確定,NVIC_PriorityGroup_x可以是0、1、2、3、4,分別代表搶占優先級有1、2、4、8、16個和響應優先級有16、8、4、2、1個。規定兩種優先級的數量后,所有的中斷級別必須在其中選擇,搶占級別高的會打斷其他中斷優先執行,而響應級別高的會在其他中斷執行完優先執行。

 

FLASH: 芯片內部存儲器flash操作函數

我的理解——對芯片內部flash進行操作的函數,包括讀取,狀態,擦除,寫入等等,可以允許程序去操作flash上的數據。

基礎應用1,FLASH時序延遲幾個周期,等待總線同步操作。推薦按照單片機系統運行頻率,0—24MHz時,取Latency=0;24—48MHz時,取Latency=1;48~72MHz時,取Latency=2。所有程序中必須的

用法:FLASH_SetLatency(FLASH_Latency_2);

位置:RCC初始化子函數里面,時鍾起振之后。

基礎應用2,開啟FLASH預讀緩沖功能,加速FLASH的讀取。所有程序中必須的

用法:FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

位置:RCC初始化子函數里面,時鍾起振之后。

LIB:調試所有外設初始化的函數。

我的理解——不理解,也不需要理解。只要知道所有外設在調試的時候,EWRAM需要從這個函數里面獲得調試所需信息的地址或者指針之類的信息。

基礎應用1,只有一個函數debug。所有程序中必須的。

用法: #ifdef DEBUG

    debug();

#endif

位置:main函數開頭,聲明變量之后。

 

EXTI:外部設備中斷函數

我的理解——外部設備通過引腳給出的硬件中斷,也可以產生軟件中斷,19個上升、下降或都觸發。EXTI0~EXTI15連接到管腳,EXTI線16連接到PVD(VDD監視),EXTI線17連接到RTC(鬧鍾),EXTI線18連接到USB(喚醒)。

 基礎應用1,設定外部中斷初始化函數。按需求,不是必須代碼。

用法:

void EXTI_Configuration(void)

{

EXTI_InitTypeDef EXTI_InitStructure; //外部設備中斷恢復默認參數

EXTI_InitStructure.EXTI_Line = 通道1|通道2; 

//設定所需產生外部中斷的通道,一共19個。

EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //產生中斷

EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;

//上升下降沿都觸發 

EXTI_InitStructure.EXTI_LineCmd = ENABLE; //啟動中斷的接收 

EXTI_Init(&EXTI_InitStructure);           //外部設備中斷啟動

}

 

 

 

systic:系統定時器

我的理解——可以輸出和利用系統時鍾的計數、狀態。

基礎應用1,精確計時的延時子函數。推薦使用的代碼。

vu32 TimingDelay;//全局變量聲明

void SysTick_Configuration(void)//初始化函數

{

  SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);// 設置SysTick時鍾源

 NVIC_SystemHandlerPriorityConfig(SystemHandler_SysTick, 2, 0);

// 設置指定的系統Handler優先級

  SysTick_SetReload(9000); /*設置SysTick重裝載值  72M為基礎 9000--1ms    

  SysTick_ITConfig(ENABLE);   //使能或者失能SysTick中斷

}

void Delay_nms(u32 nTime)//精確延時函數

{

SysTick_CounterCmd(SysTick_Counter_Enable);   //使能SysTick計數器

TimingDelay = nTime;  

while(TimingDelay != 0);

SysTick_CounterCmd(SysTick_Counter_Disable);   //失能SysTick計數器

SysTick_CounterCmd(SysTick_Counter_Clear);     //清除計數器值為0

}

void SysTick_Handler(void) //中斷

{

if(TimingDelay)

TimingDelay--;

}

 

 

void USART_Configuration(void)                        //串口初始化函數

{

  USART_InitTypeDef USART_InitStructure;              //串口設置恢復默認參數

  USART_InitStructure.USART_BaudRate = 9600;            //波特率9600

  USART_InitStructure.USART_WordLength = USART_WordLength_8b;   //字長8位

  USART_InitStructure.USART_StopBits = USART_StopBits_1;        //1位停止字節

  USART_InitStructure.USART_Parity = USART_Parity_No;           //無奇偶校驗

  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_Non         e;//無流控制 

  USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//打開Rx接收和Tx發送功能

  USART_Init(USART1, &USART_InitStructure);                  //初始化

  USART_Cmd(USART1, ENABLE);                                  //啟動串口

}

 

RCC中打開相應串口

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 , ENABLE);

GPIO里面設定相應串口管腳模式

//串口1的管腳初始化  

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;                     //管腳9

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;       //復用推挽輸出

  GPIO_Init(GPIOA, &GPIO_InitStructure);                       //TX初始化

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;                    //管腳10

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空輸入

  GPIO_Init(GPIOA, &GPIO_InitStructure);                       //RX初始化

 

 

a)        Lib注意事項:

屬於Lib的Debug函數的調用,應該放在main函數最開始,不要改變其位置。

b)        RCC注意事項:

Flash優化處理可以不做,但是兩句也不難也不用改參數……

根據需要開啟設備時鍾可以節省電能

時鍾頻率需要根據實際情況設置參數

c)        NVIC注意事項

注意理解占先優先級和響應優先級的分組的概念

d)        GPIO注意事項

注意以后的過程中收集不同管腳應用對應的頻率和模式的設置。

作為高低電平的I/O,所需設置:RCC初始化里面打開RCC_APB2

PeriphClockCmd(RCC_APB2Periph_GPIOA);GPIO里面管腳設定:IO輸出(50MHz,Out_PP);IO輸入(50MHz,IPU);

e)       USART注意事項:

發動和接受都需要配合標志等待。

只能對一個字節操作,對字符串等大量數據操作需要寫函數

使用串口所需設置:RCC初始化里面打開RCC_APB2PeriphClockCmd

(RCC_APB2Periph_USARTx);GPIO里面管腳設定:串口RX(50Hz,IN_FLOATING);串口TX(50Hz,AF_PP);


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM