《STM32嵌入式接口与传感器应用开发》实验报告(三)
实验名称: 串口通信
一、实验目的 1.在keil5中编写工程以实现串口通信的功能。 |
二、实验内容 在工程代码中实现串口通信的功能。 |
- C源码(请将C源码粘贴于下方)
#include "stm32f10x.h" #include <stdio.h> #include "led.h" void USART_Init() { USART_InitTypeDef USART_InitS; GPIO_InitTypeDef GPIO_InitStruct; NVIC_InitTypeDef NVIC_InitS; RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); //PA9 GPIO_InitStruct.GPIO_Pin=GPIO_Pin_9; GPIO_InitStruct.GPIO_Speed=GPIO_Speed_10MHz; GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP; GPIO_Init(GPIOB,&GPIO_InitStruct); //PA10 GPIO_InitStruct.GPIO_Pin=GPIO_Pin_10; GPIO_InitStruct.GPIO_Speed=GPIO_Speed_10MHz; GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOB,&GPIO_InitStruct); 图1 使能时钟配置 USART_InitS.USART_BaudRate=9600; USART_InitS.USART_HardwareFlowControl=USART_HardwareFlowControl_None; USART_InitS.USART_Mode=USART_Mode_Rx | USART_Mode_Tx; USART_InitS.USART_Parity=USART_Parity_No ; USART_InitS.USART_StopBits=USART_StopBits_1; USART_InitS.USART_WordLength=USART_WordLength_8b ; USART_Init(USART1,&USART_InitS); USART_Cmd(USART1,ENABLE); USART_ITConfig(USART1,USART_IT_RXNE,ENABLE); 图3 串口配置 NVIC_InitS.NVIC_IRQChannel=USART1_IRQn; NVIC_InitS.NVIC_IRQChannelCmd=ENABLE; NVIC_InitS.NVIC_IRQChannelPreemptionPriority=1; NVIC_InitS.NVIC_IRQChannelSubPriority=1; NVIC_Init(&NVIC_InitS); 抢占优先级的配置 void USART1_IRQHandler(void) { u8 res; if(USART_GetITStatus(USART1,USART_IT_RXNE)) { res= USART_ReceiveData(USART1); USART_SendData(USART1,res); } } } 图4 中断入口函数 int main(void) { USART_Init(); LED_InitS();//另外一篇文章中有 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); while(1) { GPIO_SetBits(GPIOB,GPIO_Pin_5); } } main.c的配置 |
PS:串口配置步骤
①串口时钟使能,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);