UART&USART实战——STM32串口配置

一,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);

}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值