串口應(yīng)該是單片機必玩的東西啦乖订,而且每個單片機都會至少有1個串口,可以將它們用來與其他設(shè)備通信甜无。
接下來我們以最常用的配置USART1為例哥遮,介紹下串口的庫函數(shù)配置方式。
串口的配置步驟:
1奥帘、開啟GPIO時鐘和串口時鐘
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1,ENABLE);
2仪召、初始化GPIO
GPIO_Init();
3、初始化串口1
USART_Init();
4已旧、使能串口召娜;
USART_Cmd();
5、使用串口一般都會用到中斷(我們以設(shè)置串口接收中斷為例進行配置)
?-1.初始化NVIC
??NVIC_Init();
//使用中斷一定不要忘記在初始化前進行中斷分組
? -2.配置串口中斷
??USART_ITConfig();
6秸讹、寫串口中斷函數(shù)
void USART1_IRQHandler(void)
該函數(shù)在startup_stm32f10x_md.s(這里我使用的是md雅倒,具體根據(jù)自己芯片找。就是.s文件)
串口配置時的結(jié)構(gòu)體成員
typedef struct
{
uint32_t USART_BaudRate; //波特率
uint16_t USART_WordLength; //字節(jié)長度
uint16_t USART_StopBits; //停止位
uint16_t USART_Parity; //奇偶校驗
uint16_t USART_Mode; //模式(發(fā)送模式|接收模式|收發(fā)模式)
uint16_t USART_HardwareFlowControl; //硬件流控
} USART_InitTypeDef;
***這些參數(shù)在串口調(diào)試工具上都會看到文虏,也是必須明確的參數(shù)***
#include "stm32f10x.h"
int main(void)
{
USART_DeInit(USART1);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1,ENABLE);
//RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_Init(GPIOA,&GPIO_InitStruct);
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10;
GPIO_Init(GPIOA,&GPIO_InitStruct);
USART_InitTypeDef USART_InitStruct;
USART_InitStruct.USART_BaudRate = 115200;
USART_InitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStruct.USART_Parity = USART_Parity_No;
USART_InitStruct.USART_StopBits = USART_StopBits_1;
USART_InitStruct.USART_WordLength = USART_WordLength_8b;
USART_Init(USART1,&USART_InitStruct);
USART_Cmd(USART1,ENABLE);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitTypeDef NVIC_InitStruct;
NVIC_InitStruct.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;
NVIC_Init(&NVIC_InitStruct);
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
while (1)
{
}
}
void USART1_IRQHandler(void)
{
if(USART_GetITStatus(USART1,USART_IT_RXNE) != RESET)
{
USART_SendData(USART1, USART_ReceiveData(USART2));
USART_ClearITPendingBit(USART1,USART_IT_RXNE);//清除中斷
}
}
查
找
資
料
官方說法是AFIO寄存器只有在使用AFIO_EVCR, AFIO_MAPR ,AFIO_EXTICRX時才需要開啟
也就是說只有使用以下三個功能時才需要開啟AFIO時鐘:
1.事件控制寄存器(AFIO_EVCR)
2.復(fù)用重映射和調(diào)試I/O 配置寄存器(AFIO_MAPR)
3.外部中斷配置寄存器(AFIO_EXTICRx)