STM32串口——中斷方式的一般配置方法


#include "stm32f10x.h"


/************************************************
該程序講解串口程序的一般配置方法:
步驟為:
        1、先對端口進行復用或者重映射操作(該程序中是對端口進行復用操作)
        2、串口復位,函數為USART_DeInit();
        3、串口初始化:USART_Init();
        4、中斷初始化:    NVIC_Init();
        5、串口使能:USART_Cmd();
        6、開啟中斷:USART_ITConfig();
        7、編寫中斷處理函數:void USART1_IRQHandler(void)    
        
                                                                                briangooole@gmail.com
                                                                                   於2017年06月29日
-------------------------
USART_TX     |    PA9
-------------------------
USART_RX     |    PA10
-------------------------
************************************************/


void MY_USART_Init(void)
{

    
    GPIO_InitTypeDef GPIO_InitStrue;     //在GPIO_Init函數調用時需定義一個GPIO_InitTypeDef結構體類型變量
    USART_InitTypeDef USART_InitStrue;    //USART_Init函數調用時需定義一個USART_InitTypeDef結構體類型變量
    NVIC_InitTypeDef NVIC_InitStrue;    //USART_Init函數調用時需定義一個NVIC_InitTypeDef結構體類型變量
    
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1,ENABLE);
        //RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
        //由於串口功能是GPIO的第二功能,所以要對端口進行復用操作,
        //一般步驟為:GPIO時鍾使能-》復用的外設時鍾使能-》將端口按照復用的功能進行模式配置
    
    USART_DeInit(USART1);    //串口復位
    
        GPIO_InitStrue.GPIO_Mode=GPIO_Mode_AF_PP;    //復用功能推挽輸出模式
        GPIO_InitStrue.GPIO_Pin=GPIO_Pin_9;    //PA9
        GPIO_InitStrue.GPIO_Speed=GPIO_Speed_50MHz;    //設置輸出速度
    GPIO_Init(GPIOA,&GPIO_InitStrue);
    
        GPIO_InitStrue.GPIO_Mode=GPIO_Mode_IN_FLOATING;    //浮空輸入模式
        GPIO_InitStrue.GPIO_Pin=GPIO_Pin_10;    //PA10
    GPIO_Init(GPIOA,&GPIO_InitStrue);
    

    
    USART_InitStrue.USART_BaudRate=9600;//設置波特率9600
    USART_InitStrue.USART_HardwareFlowControl=USART_HardwareFlowControl_None;//無硬件數據流控制,相關寄存器為CR3
    USART_InitStrue.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;//模式為接收和發送
    USART_InitStrue.USART_Parity=USART_Parity_No;//無奇偶校驗位0x0000,相關寄存器為SR1的PS位
    USART_InitStrue.USART_StopBits=USART_StopBits_1;    //1個停止位
    USART_InitStrue.USART_WordLength=USART_WordLength_8b;    //數據長度為8位
    USART_Init(USART1,&USART_InitStrue);    //串口初始化
    
    
    NVIC_InitStrue.NVIC_IRQChannel=USART1_IRQn; //串口1對應的中斷名稱
    NVIC_InitStrue.NVIC_IRQChannelCmd=ENABLE;    //使能該中斷通道
    NVIC_InitStrue.NVIC_IRQChannelPreemptionPriority=2;//搶占優先級為2,因為此程序只有一個中斷,故可任意設置
    NVIC_InitStrue.NVIC_IRQChannelSubPriority=1;//響應優先級為1,因為此程序只有一個中斷,故可任意設置
    NVIC_Init(&NVIC_InitStrue);    //中斷初始化
    
    USART_Cmd(USART1,ENABLE); //串口使能  就是將寄存器CR1中的UE位置1
    
    USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//使能串口中斷,也叫開啟串口中斷,第二個參數是設置具體開啟哪種中斷,具體為寄存器SR

}

//在stm32f10x_it.文件
void USART1_IRQHandler(void)        //中斷函數
{
    u16 DATA;
    if(USART_GetITStatus(USART1,USART_IT_RXNE))//判斷如果收到了數據,收到數據CR1中RXNE位為1,該函數的返回值為1,則執行if包含的語句
    {
    DATA=USART_ReceiveData(USART1);//讀取數據
    USART_SendData(USART1,DATA);//發送讀到的數據
    }

}

int main(void) //主函數
 {   
SystemInit(); //系統時鍾設置 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
//進行中斷分組,分為2組:2位搶占優先級,2位響應優先級 MY_USART_Init(); //調用串口初始化函數 while(1);  //等待中端發生 }

轉載自:https://www.cnblogs.com/brianblog/p/7095410.html

 

功能如下圖所示:

mcu在中斷中接收到數據后,立刻發送回pc


免責聲明!

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



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