串口通信实验(通过串口控制LED、蜂鸣器)

需要添加的固件库文件有 stm32f4xx_gpio.c、stm32f4xx_rcc.c、 misc.c、 stm32f4xx_usart.c 四个。

1) 串口时钟和 GPIO 时钟使能。
串口3是挂载在 APB1 下面的外设,, 对应着芯片引脚 PB10、PB11,所以使能函数为:

 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE); //使能 GPIOB 时钟
 RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);//使能 USART3 时钟 

2) 设置引脚复用器映射
引脚复用器映射配置,调用函数为:

GPIO_PinAFConfig(GPIOB,GPIO_PinSource10, GPIO_AF_USART3);		// //PB10 复用为 USART3
GPIO_PinAFConfig(GPIOB,GPIO_PinSource11, GPIO_AF_USART3);   // //PB11 复用为 USART3 

因为串口使用到 PB10,PB11,所以我们要把 PB10 和PB11 都映射到串口3。所以这里调用两次函数。 对于 GPIO_PinAFConfig 函数的第一个和第二个参数很好理解,就是设置对应的 IO 口,如果是 PB10那么第一个参数是GPIOB,第二个参数就是 GPIO_PinSource10。第二个参数,实际不需要去记忆,只需去相应的配置文件找到外设对应的 AF 配置宏定义标识符即可,串口 3为 GPIO_AF_USART3。

3) GPIO 端口模式设置: PB10,PB11 要设置为复用功能。

    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10 |GPIO_Pin_11;  //PB10 PB11
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;  //复用模式
	GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;  //推挽复用输出
	GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;		//上拉
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //速度50MHz
	GPIO_Init(GPIOB,&GPIO_InitStructure); //初始化

4) 串口参数初始化并使能:设置波特率,字长,奇偶校验等参数
串口初始化是调用函数 USART_Init 来实现的,具体设置方法如下:

    USART_InitStructure.USART_BaudRate=bound;  //设置波特率
	USART_InitStructure.USART_HardwareFlowControl= USART_HardwareFlowControl_None;
	USART_InitStructure.USART_Mode=USART_Mode_Rx | USART_Mode_Tx;//收发模式 
	USART_InitStructure.USART_Parity= USART_Parity_No;//无奇偶校验位 
	USART_InitStructure.USART_StopBits= USART_StopBits_1;//一个停止位 
	USART_InitStructure.USART_WordLength=USART_WordLength_8b;//字长为 8 位数据格式 
	USART_Init(USART3, &USART_InitStructure); //初始化串口 
	USART_Cmd(USART3, ENABLE);  //使能串口3 

5) 开启中断并且初始化 NVIC,使能相应中断
这一步如果我们要开启串口中断才需要配置 NVIC 中断优先级分组。通过调用函数NVIC_Init 来设置。

    NVIC_InitStructure.NVIC_IRQChannel=USART3_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;//抢占优先级 3
	NVIC_InitStructure.NVIC_IRQChannelSubPriority =3;  //响应优先级 3
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;   //IRQ 通道使能 
	NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化 VIC 寄存器

同时,我们还需要使能相应中断,使能串口中断的函数是:

void USART_ITConfig(USART_TypeDef* USARTx, uint16_t USART_IT,  
FunctionalState NewState) 

这个函数的第二个入口参数是标示使能串口的类型,也就是使能哪种中断,因为串口的中断类型有很多种。比如在接收到数据的时候(RXNE 读数据寄存器非空),我们要产生中断,那么开启中断的方法是:

USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);//开启中断 

在发送数据结束的时候(TC,发送完成)要产生中断,那么方法是:

USART_ITConfig(USART1,USART_IT_TC,ENABLE); 

这里还要特别提醒,因为实验开启了串口中断,所以在系统初始化的时候需要先设置系统的中断优先级分组,是在main 函数开头设置的,代码如下:

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置系统中断优先级分组2

设置分组为 2,也就是 2 位抢占优先级,2 位响应优先级。

6) 中断服务函数
当发生中断的时候,程序就会执行中断服务函数。然后在中断服务函数中编写我们相应的逻辑代码即可。

void

你可能感兴趣的:(STM32F4,嵌入式,单片机,串口通信)