#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