stm32之USART串口配置
概念
在STM32的參考手冊(cè)中,串口被描述成通用同步異步收發(fā)器(USART),它提供了一種靈活的方法與使用工業(yè)標(biāo)準(zhǔn)NRZ異步串行數(shù)據(jù)格式的外部設(shè)備之間進(jìn)行全雙工數(shù)據(jù)交換。(好吧我也不是很懂,暫且貼上官方定義,各位看官自己悟吧)
配置步驟
打開(kāi)時(shí)鐘(RCC配置)
由于UART的TX和RX和AFIO都掛在APB2橋上,因此采用固件庫(kù)函數(shù)RCC_APB2PeriphClockCmd()進(jìn)行初始化。UARTx需要分情況討論,如果是UART1,則掛在APB2橋上,因此采用RCC_APB2PeriphClockCmd()進(jìn)行初始化,其余的UART2~5均掛在APB1上。
GPIO配置
GPIO的屬性包含在結(jié)構(gòu)體GPIO_InitTypeDef,其中對(duì)于TX引腳,GPIO_Mode字段設(shè)置為GPIO_Mode_AF_PP(復(fù)用推挽輸出),GPIO_Speed切換速率設(shè)置為GPIO_Speed_50MHz;對(duì)于RX引腳,GPIO_Mode字段設(shè)置為GPIO_Mode_IN_FLOATING(浮空輸入),不需要設(shè)置切換速率。最后通過(guò)GPIO_Init()使能IO口。
NVIC配置
STM32在只有一個(gè)中斷的情況下,仍然需要配置優(yōu)先級(jí),其作用是使能某條中斷的觸發(fā)通道。STM32的中斷有至多兩個(gè)層次,分別是搶占優(yōu)先級(jí)(主優(yōu)先級(jí))和子優(yōu)先級(jí)(從優(yōu)先級(jí)),而整個(gè)優(yōu)先級(jí)設(shè)置參數(shù)的長(zhǎng)度為4位,因此需要首先劃分搶占優(yōu)先級(jí)位數(shù)和子優(yōu)先級(jí)位數(shù),通過(guò)NVIC_PriorityGroupConfig()實(shí)現(xiàn);
特定設(shè)備的中斷優(yōu)先級(jí)NVIC的屬性包含在結(jié)構(gòu)體NVIC_InitTypeDef中,其中字段NVIC_IRQChannel包含了設(shè)備的中斷向量,保存在啟動(dòng)代碼中;字段NVIC_IRQChannelPreemptionPriority為主優(yōu)先級(jí)NVIC_IRQChannelSubPriority為從優(yōu)先級(jí),取值的范圍應(yīng)根據(jù)位數(shù)劃分的情況而定;最后NVIC_IRQChannelCmd字段是是否使能,一般置為ENABLE。最后通過(guò)NVIC_Init()來(lái)使能這一中斷向量。
USART配置
通過(guò)結(jié)構(gòu)體USART_InitTypeDef來(lái)確定。UART模式下的字段如下:
USART_BaudRate:波特率(每秒能傳輸?shù)臄?shù)據(jù)位),缺省值為9600。
USART_WordLength:字長(zhǎng)
USART_StopBits:停止位
USART_Parity:校驗(yàn)方式(奇偶校驗(yàn))
USART_HardwareFlowControl:硬件流控制
USART_Mode:?jiǎn)?雙工,即收發(fā)狀態(tài)。
最后通過(guò)USART_Init()來(lái)設(shè)置。
代碼匯總
voiduart_init(u32bound){GPIO_InitTypeDefGPIO_InitStructure;USART_InitTypeDefUSART_InitStructure;NVIC_InitTypeDefNVIC_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA,ENABLE);//使能USART1和GPIOA時(shí)鐘USART_DeInit(USART1);//復(fù)位串口1(各參數(shù)置為缺省值)//USART1_TX(發(fā)送數(shù)據(jù))PA.9引腳GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//復(fù)用推挽輸出GPIO_Init(GPIOA,&GPIO_InitStructure);//初始化PA.9//USART1_RX(接收數(shù)據(jù))PA.10引腳GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;//浮空輸入GPIO_Init(GPIOA,&GPIO_InitStructure);//初始化PA.10//NVIC中斷向量配置NVIC_InitStructure.NVIC_IRQChannel=USART1_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;//搶占優(yōu)先級(jí)置為3NVIC_InitStructure.NVIC_IRQChannelSubPriority=3;//子優(yōu)先級(jí)置為3,優(yōu)先級(jí)依據(jù)不同的中斷重要性不同來(lái)確定。NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;//IRQ通道使能NVIC_Init(&NVIC_InitStructure);//根據(jù)上面設(shè)置的參數(shù)初始化NVIC寄存器//USART初始化設(shè)置USART_InitStructure.USART_BaudRate=bound;//波特率為9600;USART_InitStructure.USART_WordLength=USART_WordLength_8b;//字長(zhǎng)為8位數(shù)據(jù)USART_InitStructure.USART_StopBits=USART_StopBits_1;//1個(gè)停止位USART_InitStructure.USART_Parity=USART_Parity_No;//無(wú)奇偶校驗(yàn)位USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;//無(wú)硬件數(shù)據(jù)流控制USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;//收發(fā)模式USART_Init(USART1,&USART_InitStructure);//串口初始化USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//中斷開(kāi)啟USART_Cmd(USART1,ENABLE);//串口使能}123456789101112131415161718192021222324252627282930313233343536373839
終