一,STM32串口配置的一般步骤
①
串口时钟使能,
GPIO
时钟使能
:
RCC_APB2PeriphClockCmd
();
②
串口复位
:
USART_DeInit
();
这一步不是必须的
③
GPIO
端口模式设置
:
GPIO_Init
();
模式设置为
GPIO_Mode_AF_PP
④
串口参数初始化
:
USART_Init
();
⑤
开启中断并且初始化
NVIC
(如果需要开启中断才需要这个步骤)
NVIC_Init();
USART_ITConfig();
⑥ 使能串口:USART_Cmd();
⑦ 编写中断处理函数:USARTx_IRQHandler();
⑧ 串口数据收发:
void USART_SendData();//发送数据到串口,DR
uint16_t USART_ReceiveData();//接受数据,从DR读取接受到的数据
⑨串口传输状态获取:
FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG);
void USART_ClearITPendingBit(USART_TypeDef* USARTx, uint16_t USART_IT);
二,代码实现如下:
// uart.c
void USART1_Init(void)
{
GPIO_InitTypeDef GPIO_InitStrue;
USART_InitTypeDef USART_InitStrue;
NVIC_InitTypeDef NVIC_InitStrue;
// 使能时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
// IO 口初始化
GPIO_InitStrue.GPIO_Mode = GPIO_Mode_AF_PP; // 推挽复用输出
GPIO_InitStrue.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStrue.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_Init(GPIOA, &GPIO_InitStrue);
GPIO_InitStrue.GPIO_Mode = GPIO_Mode_IN_FLOATING; // 浮空输入
GPIO_InitStrue.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStrue.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_Init(GPIOA, &GPIO_InitStrue);
// 串口初始化
USART_InitStrue.USART_BaudRate = 115200;
USART_InitStrue.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStrue.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_InitStrue.USART_Parity = USART_Parity_No; // 奇偶校验,
USART_InitStrue.USART_StopBits = USART_StopBits_1; // 停止位.
USART_InitStrue.USART_WordLength = USART_WordLength_8b; // 子长
USART_Init(USART1, &USART_InitStrue);
// 串口使能
USART_Cmd(USART1, ENABLE);
// 使用中断
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); // 接收到数据触发中断。
// 中断优先级分组
NVIC_InitStrue.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStrue.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStrue.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStrue.NVIC_IRQChannelSubPriority = 1;
NVIC_Init(&NVIC_InitStrue);
}
// 在 startup_stm32f10x_hd.s 文件中有定义
void USART1_IRQHandler(void)
{
u8 res;
if(USART_GetFlagStatus(USART1, USART_FLAG_RXNE)) { // 如果返回1说明是接收中断。
res = USART_ReceiveData(USART1); // 读取串口
USART_SendData(USART1, res); // 然后再发送出去
}
return;
}
// main.c
int main(void)
{
USART1_Init();
while(1);
}